
레지스터 수준 불변성 기반 퍼징 프레임워크로, 클로즈드 소스 바이너리를 대상으로 가능성 있는 불변성 위반을 활용하여 바이너리 실행 파일에서 충돌 및 버그를 발견합니다.
이 저장소는 Binvariants의 소스 코드를 제공합니다. Binvariants는 바이너리 퍼징을 위해 레지스터 수준의 개연성 높은 불변식 위반(likely invariant violation)을 활용하는 프로토타입 퍼징 프레임워크입니다.
이 연구는 2026 ACM International Conference on the Foundations of Software Engineering (FSE'26)에서 발표된 논문 Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | 슬라이드에 소개되어 있습니다.

| 이 저장소 인용하기: |
@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 라이선스 |
| 면책 조항: | 이 소프트웨어는 어떠한 보증도 없이 있는 그대로 제공됩니다. |
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는 1-learn_invs.sh에서 BINV_TRACES_DIR로 지정된 디렉터리에 [PROGRAM]_trace_qemu_invs라는 이름으로 저장됩니다.
Binvariants로 퍼징을 시작하려면 다음을 실행하세요:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
예를 들어, Binvariants의 루트 디렉터리에서 48시간 퍼징 캠페인의 첫 번째 시도를 실행하려면:
./Example/2-fuzz.sh $PWD 48h 1
아래는 Binvariants에 대한 잠재적 개선 사항입니다.
현재 Binvariants는 퍼징 전에 불변 조건을 학습한 후 퍼징을 별도로 실행합니다. 가능한 개선 사항은 퍼징 중에 불변 조건을 학습하고 위반이 발생할 때 이를 갱신하여 피드백이 시간이 지남에 따라 발전할 수 있도록 하는 것입니다.
가능한 설계 고려 사항:
FSRV_RUN_OK)에만 커밋하는 것입니다.Binvariants는 현재 단일 블록 불변 조건에 초점을 맞추고 있습니다. 잠재적 개선 사항은 블록 간 불변 조건을 지원하는 것입니다. 이를 위해서는 블록 경계를 넘어 레지스터 값을 추적하기 위한 새로운 데이터 구조와, 제어가 블록 간에 전환될 때 위반을 검사하기 위한 추가 계측이 필요합니다.
Binvariants를 사용하여 다른 버그를 발견하셨다면 알려주시기 바랍니다!
이 자료는 미국 국립과학재단(NSF)의 Award No. 2419798과 미국 국방고등연구계획국(DARPA)의 Award No. FA8750-24-2-0002, Subaward No. GR105409-SUB00001384의 지원을 받은 연구를 바탕으로 작성되었습니다.