
Инвариантно-ориентированный фреймворк фаззинга на уровне регистров для бинарных файлов с закрытым исходным кодом, использующий вероятные нарушения инвариантов для обнаружения сбоев и ошибок в исполняемых бинарных файлах.
Этот репозиторий содержит исходный код 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).

| Цитирование этого репозитория: |
@article{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
Example/ содержит примеры скриптов и тестовых случаев для использования 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, пожалуйста, сообщите нам!