
레지스터 수준 불변성 기반 퍼징 프레임워크로, 클로즈드 소스 바이너리를 대상으로 가능성 있는 불변성 위반을 활용하여 바이너리 실행 파일에서 충돌 및 버그를 발견합니다.
이 저장소는 Binvariants의 소스 코드를 제공합니다. 이는 바이너리 퍼징을 위해 레지스터 수준의 잠재적 불변 조건 위반을 활용하는 프로토타입 퍼징 프레임워크입니다.
본 연구는 2026 ACM 국제 소프트웨어 공학 기초 학회(FSE’26)에서 발표될 논문 Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants에서 소개되었습니다.

| 이 저장소 인용: |
@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 라이선스 |
| 면책 조항: | 이 소프트웨어는 어떠한 보증도 없이 제공됩니다. |
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) 시상 번호 2419798, 그리고 미국 국방고등연구계획국(DARPA) 시상 번호 FA8750-24-2-0002, 하위 시상 번호 GR105409-SUB00001384의 지원을 받았습니다.
| 프로그램 | 보고된 버그 |
|---|