
라이브러리를 기반으로 퍼징 하네스를 자동으로 생성하는 도구
AutoHarness는 퍼징 하니스를 자동으로 생성하는 도구입니다. 이 아이디어는 현재 퍼징 코드베이스에서 발생하는 문제에서 비롯되었습니다. 큰 코드베이스에는 수천 개의 함수와 코드 조각이 있으며, 이들은 라이브러리 깊숙이 내장되어 있습니다. 스마트 퍼저가 해당 코드 경로에 도달하는 것은 매우 어렵거나 때로는 불가능합니다. oss-fuzz와 같은 대규모 퍼징 프로젝트에서도 여전히 퍼징으로 커버되지 않는 코드베이스 부분이 있습니다. 따라서 이 프로그램은 이 문제를 어느 정도 완화하고 보안 연구원이 코드베이스를 초기에 테스트하는 데 사용할 수 있는 도구를 제공하고자 합니다. 이 프로그램은 C와 C++로 작성된 코드베이스만 지원합니다.
이 프로그램은 libfuzzer를 위해 llvm과 clang을, 함수 검색을 위해 Codeql을, 일반 프로그램을 위해 Python을 사용합니다. 이 프로그램은 Ubuntu 20.04에서 llvm 12와 python 3로 테스트되었습니다. 다음은 초기 설정입니다.
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
Codeql 설치 절차는 https://github.com/github/codeql를 따르십시오. CLI 도구와 라이브러리를 설치해야 합니다. 제 테스트에서는 도구와 라이브러리를 모두 하나의 폴더에 저장했습니다. 마지막으로, 이 저장소를 클론하거나 릴리스를 다운로드하십시오. 다음은 nginx에서 다중 인자 모드를 설정하여 실행한 후의 프로그램 출력입니다. 제가 사용한 명령어입니다.
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
결과:
컴파일을 더 디버깅하고 더 많은 헤더 파일을 추가하는 등으로 성공률을 높일 수 있습니다. nginx 프로젝트는 컴파일 후 공유 객체가 없다는 점에 유의하십시오. 하지만 이 프로그램에는 PIE 실행 파일을 공유 라이브러리로 변환하는 기능이 있습니다.
현재 프로그램에서 여러 인자를 가진 함수를 퍼징하기 위해 구현된 방법은 fuzzing data provider를 사용하는 것입니다. 이 통합에는 몇 가지 개선 사항이 있지만, 데이터 구조와 이 기능을 통합할 수 있다고 생각합니다. 코드 작성 중 겪은 문제는 codeql과 중첩 구조체에 관한 것입니다. 함수마다 다른 여러 쿼리를 작성하지 않으면 특히 어렵습니다. 요컨대, 이 기능은 더 많은 작업이 필요합니다. 또한 protobufs를 사용한 간단한 해결책도 고려 중입니다.
codeql을 사용하면 함수의 매개변수가 어떻게 초기화되는지 매핑하는 제어 흐름 그래프를 생성할 수 있습니다. 해당 정보를 사용하여 더 나은 하니스를 만들 수 있습니다. 또 다른 방법은 라이브러리에 존재하는 함수의 구현을 찾고 그 정보를 사용하여 함수의 구현을 하니스로 추정하는 것입니다. 현재 이 작업에서 겪는 문제는 codeql로 제어 흐름 그래프를 생성하는 것입니다.
모든 하니스를 실행하고 ASAN을 사용하여 일반적인 거짓 양성을 감지하는 간단한 프로그램을 만들 수 있습니다. 또한 모든 하니스를 한 번에 실행하고 통계를 표시하는 새 인터페이스를 만들 수 있습니다.
이 프로그램에서 버그를 발견하면 이슈를 생성해 주십시오. 수정하도록 노력하겠습니다. 또한 새 기능이나 성능 업그레이드 또는 현재 계획된 기능 구현에 대한 아이디어가 있으면 풀 리퀘스트를 생성하거나 (contribution) 태그로 이슈를 생성해 주십시오.
이 도구는 일부 거짓 양성을 생성합니다. 충돌을 먼저 분석하여 유효한 버그인지 아니면 단순한 구현 버그인지 확인하십시오. 또한 일부 함수가 컴파일되지 않는 경우 디버그 모드를 활성화할 수 있습니다. 이렇게 하면 누락된 헤더 파일이 있는지 또는 링크 문제가 있는지 이해하는 데 도움이 됩니다. 작업 중인 프로젝트에 공유 라이브러리가 없고 실행 파일만 있는 경우, 실행 파일을 PIE 형태로 컴파일하여 이 프로그램이 공유 라이브러리로 변환할 수 있도록 하십시오.