Динамическая символьная интерпретация приложений архитектуры RISC-V 64 (Влада Логунова, OSDAY-2025)
Материал из 0x1.tv
- Докладчик
- Влада Логунова
Динамический символьный анализ — ключевой метод обеспечения безопасности ПО в рамках жизненного цикла разработки, позволяющий обнаруживать уязвимости через исполнение кода с минимальным числом ложных срабатываний. Однако большинство существующих инструментов (QSYM, FUZZOLIC, SymCC) ориентированы на архитектуру x86, что ограничивает их применение для перспективной открытой платформы RISC-V, набирающей популярность в IoT и безопасных системах. Перенос традиционных подходов (особенно символьного исполнения) на RISC-V64 требует решения проблемы архитектурной зависимости.
Представлен подход к символьной интерпретации бинарных приложений RISC-V64 с помощью инструмента Sydr, интегрированного с фреймворком Triton. Ключевая инновация — добавление в Triton полной символьной семантики для целочисленных инструкций RISC-V64 (включая псевдоинструкции). Это позволяет напрямую анализировать машинный код без исходников и без трансляции в промежуточное представление, сохраняя при этом расширенные возможности: обработку предикатов безопасности и точный анализ косвенных переходов.
Решение апробировано на синтетических тестах и реальных приложениях. Проведено сравнение с SymQEMU — инструментом, использующим трансляцию бинарного кода в промежуточное представление (QEMU). Реализована поддержка гибридного фаззинга через интеграцию с фреймворком Sydr-Fuzz, объединяющим символьное исполнение с фаззингом «методом серого ящика» для повышения покрытия и эффективности поиска уязвимостей.
Работа устраняет пробел в инструментарии динамического анализа для RISC-V64, предоставляя эффективное решение для символьного исполнения и гибридного фаззинга. Подход демонстрирует практическую применимость в Security Development Lifecycle для создания безопасного ПО под открытую архитектуру, особенно в контексте растущего распространения RISC-V в критических инфраструктурах.
Содержание
Видео
Thesis
Введение
Ежедневное применение программных продуктов успело стать неотъемлемой частью жизни современного человека. Персональные устройства, электроприборы, сервера компаний и организаций, транспорт и умные дома вплетают в повседневность пользователя качественно новую инфраструктуру. Безопасность и надёжность при создании такой инфраструктуры определяется стандартами и отлаженностью соответствующих процессов. Концепция жизненного цикла безопасной разработки ПО[1][2] существует для того, чтобы минимизировать последствия появления ошибок и уязвимостей в программных продуктах. Данный подход предполагает наличие разноплановых видов тестирования, включая статический и динамический анализ. Динамический анализ, в отличие от статического, использует запуск тестируемого приложения и предоставляет возможность наблюдать результаты проявления ошибок непосредственно в среде исполнения, что сокращает количество ложных срабатываний.
Методы динамического анализа
Как правило, для динамического анализа применяются автоматизированные инструменты фаззинг-тестирования. Наиболее распространенный вид фаззинга основан на множественных запусках программы с различными входными данными в надежде увеличить метрику достигнутого покрытия кода. Генерация новых входных данных осуществляется с помощью случайных мутаций данных из предыдущих запусков. Подобный подход называется фаззингом с обратной связью по покрытию или фаззингом «методом серого ящика» [3][4]
Гибридный фаззинг дополнительно использует входные данные от динамического символьного интерпретатора[5] («метод белого ящика»), извлекающего более подробную информацию о запуске. В первую очередь, это логические условия ветвления, зависящие от изначальных помеченных данных. Новые входные данные вычисляются аналитически с целью изменить направление ветвления при будущем запуске. Несмотря на то, что символьная интерпретация требует больше времени на один запуск, своевременное получение фаззером вычисленных данных способно повышать общую эффективность анализа[6].
Переносимость и архитектура RISCV
Среди динамических символьных интерпретаторов преимущественно представлены инструменты [7][8][9] для архитектуры х86. Однако многообразие программных решений не ограничивается единственной платформой, так что одним из важных аспектов применения технологий динамического анализа является переносимость. В качестве перспективного направления для системного создания безопасного ПО можно рассмотреть открытую процессорную архитектуру RISCV. С точки зрения наличия архитектурно-зависимых компонентов динамический символьный интерпретатор в процессе инструментации может отслеживать преобразования входных данных:
- непосредственно на уровне машинного кода (требует символьной семантики набора инструкций для каждой платформы);
- на уровне промежуточного представления (обеспечивает кроссплатформенность за счёт дополнительного этапа трансляции).
Реализация для RISCV64
В данной работе представлены результаты применения техник символьной интерпретации для приложений открытой процессорной архитектуры RISCV64 с помощью инструмента Sydr[10][11] . При построении формул преобразований символьных данных в нём используется открытый символьный фреймворк Triton[12], в который была добавлена символьная семантика соответствующего набора целочисленных инструкций, включающего псевдоинструкции и сокращенные инструкции. Предложенный подход символьной интерпретации:
- Не требует наличия исходного кода или дополнительного этапа трансляции в промежуточное представление;
- Обладает обширным набором техник и оптимизаций, включая предикаты безопасности и метод точного определения границ при анализе косвенных переходов.
Инструмент был апробирован на наборе синтетических тестов и реальных приложений. Проведено экспериментальное сравнение с открытым символьным интерпретатором SymQEMU[13], работающим с применением трансляции бинарного кода в промежуточное представление. Кроме того, добавлена возможность проведения гибридного фаззинга приложений архитектуры RISCV64 с применением фреймворка Sydr-Fuzz[10][11] .
Презентация
Примечания и ссылки
- ↑ M. Howard, S. Lipner. The security development lifecycle. Microsoft Press Redmond, 2006.
- ↑ ГОСТ Р 56939-2016: «Защита информации. Разработка безопасного программного обеспечения. Общие требования». — Национальный стандарт РФ, 2016.
- ↑ K. Serebryany. Continuous fuzzing with libFuzzer and AddressSanitizer. 2016 IEEE Cybersecurity Development (SecDev), p. 157. IEEE, 2016.
- ↑ A. Fioraldi, D. Maier, H. Eißfeldt, M. Heuse. AFL++: combining incremental steps of fuzzing research. 14th USENIX Workshop on Offensive Technologies (WOOT 20), 2020.
- ↑ P. Godefroid, M. Y. Levin, D. Molnar. Automated whitebox fuzz testing. Proceedings of the 2008 Network and Distributed System Security Symposium, pp. 151–166, 2008.
- ↑ Fuzzbench (Google). DSE+Fuzzing Experiment Report. 2021. [1]
- ↑ I. Yun et al. QSYM: a practical concolic execution engine tailored for hybrid fuzzing. 27th USENIX Security Symposium, pp. 745–761, 2018.
- ↑ L. Borzacchiello, E. Coppa, C. Demetrescu. FUZZOLIC: mixing fuzzing and concolic execution. Computers & Security, 2021.
- ↑ S. Poeplau, A. Francillon. Symbolic execution with SymCC: don’t interpret, compile! 29th USENIX Security Symposium (USENIX Security 20), pp. 181–198, 2020.
- ↑ 10,0 10,1 A. Vishnyakov, A. Fedotov, D. Kuts, A. Novikov, D. Parygina, E. Kobrin, V. Logunova, P. Belecky, S. Kurmangalev. Sydr: cutting edge dynamic symbolic execution. 2020 Ivannikov ISPRAS Open Conference (ISPRAS), pp. 46–54. IEEE, 2020.
- ↑ 11,0 11,1 A. Vishnyakov, D. Kuts, V. Logunova, D. Parygina, E. Kobrin, G. Savidov, A. Fedotov. Sydr-Fuzz: Continuous Hybrid Fuzzing and Dynamic Analysis for Security Development Lifecycle. 2022 Ivannikov ISPRAS Open Conference, 2022.
- ↑ F. Saudel, J. Salwan. Triton: a dynamic symbolic execution framework. Symposium sur la sécurité des technologies de l’information et des communications, pp. 31–54, 2015.
- ↑ S. Poeplau, A. Francillon. SymQEMU: compilation-based symbolic execution for binaries. Proceedings of the 2021 Network and Distributed System Security Symposium, 2021.
