
Инвариантно-ориентированный фреймворк фаззинга на уровне регистров для бинарных файлов с закрытым исходным кодом, использующий вероятные нарушения инвариантов для обнаружения сбоев и ошибок в исполняемых бинарных файлах.
Этот репозиторий содержит исходный код Binvariants: прототипа фреймворка для фаззинга, который использует нарушения вероятных инвариантов на уровне регистров для фаззинга бинарных файлов.
Эта работа представлена в нашей статье Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants, которая будет опубликована на 2026 ACM International Conference on the Foundations of Software Engineering (FSE'26).

| Цитирование этого репозитория: |
@inproceedings{yang:binvariants, title = {Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants}, author = {Zao Yang and Stefan Nagy}, year = {2026}, issue_date = {July 2026}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, volume = {3}, number = {FSE}, journal = {Proc. ACM Softw. Eng.}}
|
| Разработчики: | Zao Yang ([email protected]) и Stefan Nagy ([email protected]) |
| Лицензия: | MIT License |
| Отказ от ответственности: | Данное программное обеспечение предоставляется «как есть» без каких-либо гарантий. |
Binvariants построен на базе AFL++ и QEMU-AFL. Установите зависимости, необходимые для этих проектов, перед настройкой Binvariants:
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
# try to install llvm-18 and install the distro default if that fails
sudo apt-get install -y lld-18 llvm-18 llvm-18-dev clang-18 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-dev
sudo apt-get install -y meson ninja-build # for QEMU mode
Binvariants включает два компонента:
Для сборки каждого перейдите в соответствующий каталог и выполните следующие команды:
./1_patch.sh
./2_build.sh
Пример содержит примеры скриптов и тестовые случаи для использования Binvariants с бинарным файлом nconvert. Вы можете изменить скрипты для фаззинга других бинарных файлов.
Перед использованием Binvariants отключите ASLR, так как для согласованности адресов базовых блоков между обучением инвариантов и фаззингом требуется их постоянство:
sudo sysctl -w kernel.randomize_va_space=0
Для обучения инвариантам выполните:
./Example/1-learn_invs.sh [Binvariants_Root]
Выведенные RLI будут сохранены в каталоге, указанном в переменной BINV_TRACES_DIR в файле 1-learn_invs.sh, с именем: [PROGRAM]_trace_qemu_invs.
Чтобы запустить фаззинг с помощью Binvariants, выполните:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Например, запустите 1-й прогон 48-часовой кампании фаззинга из корневого каталога Binvariants:
./Example/2-fuzz.sh $PWD 48h 1
Ниже приведены возможные улучшения для Binvariants.
В настоящее время Binvariants изучает инварианты перед началом фаззинга и затем запускает фаззинг отдельно. Возможное улучшение — изучать инварианты во время фаззинга и обновлять их по мере возникновения нарушений, позволяя обратной связи эволюционировать со временем.
Возможные соображения по дизайну:
FSRV_RUN_OK).В настоящее время Binvariants фокусируется на инвариантах в пределах одного базового блока. Возможное улучшение — поддержка межблочных инвариантов. Для этого потребуются новые структуры данных для отслеживания значений регистров на границах блоков, а также дополнительная инструментация для проверки нарушений при передаче управления между блоками.
Если вы найдете другие баги с помощью Binvariants, сообщите нам, пожалуйста!
Эта работа основана на исследованиях, поддержанных Национальным научным фондом (NSF) в рамках награды № 2419798, а также Агентством перспективных исследовательских проектов Министерства обороны США (DARPA) в рамках награды № FA8750-24-2-0002, субнаграда № GR105409-SUB00001384.
| Программы | Сообщенные баги |
|---|