정적 분석을 통해 퍼지 가능한 대상 발견을 자동화하기위한 프레임 워크
소프트웨어에 대한 보안 평가를 수행하는 취약성 연구원은 종종 AFL ++ 및 Libfuzzer와 같은 강력한 도구를 통해 적용 범위 유도 퍼지 기능을 활용할 것입니다. 이는 Bughunting 프로세스를 자동화하고 목표에서 악용 가능한 조건을 신속하게 드러내므로 중요합니다. 그러나 크고 복잡한 코드베이스 또는 폐쇄 소스 바이너리를 만날 때, 연구원들은 수동으로 감사하고 리버스 엔지니어링하는 데 시간을 투자하여 퍼징 기반 탐색이 유용 할 수있는 기능을 식별해야합니다.
Fuzzable은 C/C ++ 소스 코드와 바이너리를 모두 통합하여 취약성 연구원이 퍼지에 실용적인 기능 대상을 식별하는 데 도움이되는 프레임 워크입니다. 이는 소프트웨어의 위험한 동작과이를 실행하는 기능을 찾아서 여러 정적 분석 기반 휴리스틱을 적용하여 수행됩니다. 그런 다음 연구원은 프레임 워크를 활용하여 기본 하네스 템플릿을 생성 할 수 있으며, 이는 취약점을 찾거나 Google의 OSS-Fuzz 프로젝트와 같은 연속 퍼징 파이프 라인의 일부로 통합 될 수 있습니다.
독립형 도구로 실행하는 것 외에도 퍼지 가능한 것은 바이너리 닌자 분해기를위한 플러그인으로 통합되며, 다른 분해 백엔드가 개발중인 다른 백엔드를 지원합니다.
정적 분석 휴리스틱의 기술 사양 과이 도구가 어떻게 생겼는지 강조하는 도구를 자세히 설명하는 원래 블로그 게시물을 확인하십시오. 이 도구는 Black Hat Arsenal USA 2022에도 실 렸습니다.
일부 바이너리 대상은 일부 소독제 (예 : 시그니처 매칭 또는 인라인에서 함수를 식별)가 필요할 수 있으므로, 이러한 문제를 효과적으로 해결할 수있는 능력이기 때문에 퍼지 가능한 바이너리 닌자를 주로 분해 백엔드로 사용합니다. 따라서 독립형 도구 및 플러그인으로 사용할 수 있습니다.
바이너리 닌자는 모든 사람이 액세스 할 수 없으며 보안 평가에 활용하고 클라우드에서 잠재적으로 확장 할 수있는 요구가있을 수 있으므로 ANG 폴백 백엔드도 지원됩니다. 나는 다른 분리기를 도로 아래로 통합 할 것으로 예상합니다 (우선 순위 : Ghidra).
이진 닌자 광고가있는 경우 독립형 헤드리스 사용을 위해 API를 설치하십시오.
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
pip 로 설치 :
$ pip install fuzzable
우리는 의존성 관리 및 건물에시를 사용합니다. 수동 빌드를 수행하려면 리포지토리를 타사 모듈로 복제하십시오.
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
수동으로 설치하려면 :
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
이제 도구로 바이너리 및/또는 소스 코드를 분석 할 수 있습니다!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
Binary Ninja > Manage Plugins 하고 검색하여 바이너리 닌자 플러그인 마켓 플레이스를 통해 퍼지 가능한 것을 쉽게 설치할 수 있습니다. 다음은 퍼지 가능한 플러그인 실행, 퍼지 대상 및 추가 취약성 평가를 식별하는 정확도의 예입니다.

퍼지 가능한 것은 분석을 더 잘 조정하는 데 도움이되는 다양한 옵션이 제공됩니다. 향후 계획 및 모든 기능 요청에서 더 많은 지원이 제공됩니다.
퍼즐 성을 결정하기 위해 퍼지 가능한 것은 여러 휴리스틱을 사용하여 동적 분석을 위해 가장 실용적인 대상을 결정합니다. 이 휴리스틱은 모두 Scikit-Criteria Library를 사용하여 다르게 가중치를 부여합니다.이 라이브러리는 다중 기준 결정 분석을 활용하여 최고의 후보자를 결정합니다. 이 메트릭과 가중치가 있는데 여기에서 볼 수 있습니다.
| 휴리스틱 | 설명 | 무게 |
|---|---|---|
| 퍼즈 친화적 인 이름 | 기호 이름은 파일/버퍼 입력을 수집하는 동작을 의미합니다 | 0.3 |
| 위험한 싱크 | 위험한 전화로 흐르는 주장 (즉, memcpy) | 0.3 |
| 자연 루프 | 우세 국경으로 감지 된 루프 수 | 0.05 |
| 순환 복잡성 | 가장자리 + 노드를 기반으로 함수 대상의 복잡성 | 0.05 |
| 커버리지 깊이 | 대상이 가로 지르는 캘리의 수 | 0.3 |
언급했듯이 기술 블로그 게시물을 확인하여 이러한 메트릭이 어떻게 사용되는지에 대한 자세한 내용을 살펴보십시오.
많은 지표는 Vincenzo Iozzo의 0-Knowledge 퍼지에서 원래 작품에서 영감을 얻었습니다.
분석하려는 모든 목표는 다양하며 퍼질 가능한 프로그램 목표의 모든 에지 케이스 동작을 설명 할 수는 없습니다. 따라서 분석 중에 이러한 가중치를 적절하게 조정하여 다른 결과가 사용 사례에 더 적합한 지 확인하는 것이 중요 할 수 있습니다. CLI에서 이러한 가중치를 조정하려면 --score-weights 인수를 간단히 지정하십시오.
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
기본적으로 퍼지 가능한 것은 다음 기준에 따라 기능 대상을 걸러냅니다.
static 이며 헤더를 통해 노출되지 않은 함수. 퍼지 가능 에 의해 필터링 된 통화를 보려면 --list_ignored 플래그를 설정하십시오.
$ fuzzable analyze --list-ignored <TARGET>
Binary Ninja에서는 Settings > Fuzzable > List Ignored Calls 에서이 설정을 전환 할 수 있습니다.
퍼지가 가능한 중요한 호출을 분석 해야하는 중요한 호출을 허위로 필터링하는 경우, 실행 중에 포함시키기 위해 --include-* 인수를 사용하는 것이 좋습니다.
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
바이너리 닌자에서는 설정 Symbols to Exclude Settings > Fuzzable > Include non-top level calls 통해 지원됩니다.
Fuzz에 이상적인 후보자를 찾았으므로 Fuzzable은 파일 기반 퍼지 (예 : AFL ++, honggfuzz) 또는 Memory Fuzer (Libfuzer)와 함께 사용할 수있는 (거의) 기기가 준비되어 있고 컴파일 할 수있는 퍼징 하네스를 생성하는 데 도움이됩니다. CLI에서 그렇게하려면 :
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
이 대상이 소스 코드베이스 인 경우 일반 소스 템플릿이 사용됩니다.
대상이 이진 인 경우 일반 블랙 박스 템플릿이 사용되며 AFL-QEMU와 같은 퍼징 에뮬레이션 모드와 함께 이상적으로 사용할 수 있습니다. 기호가 lief를 사용하여 직접 dlopen 으로 내보내지 않으면 이진의 사본도 공유 객체로 만들어집니다.
현재이 기능은 단순히 적절한 매개 변수로 채워진 독립형 C ++ 하네스를 생성하고 모든 런타임 동작 (예 : 인스턴스화 및 자유 구조)에 필요한 자동 생성 코드가 아닙니다. 그러나 퍼지 가능한 용기를 위해 생성 된 템플릿은 여전히 빠르게 실행할 수있게 해줄 것입니다. 다음은 내가 도로를 구현하고 싶은 몇 가지 야심 찬 기능입니다.
퍼지 가능한 것은 다양한 형식의 보고서 생성을 지원합니다. 지원되는 현재는 JSON, CSV 및 Markdown입니다. 직렬화 가능한 형식으로 출력을 섭취하려는 자동화의 일부로 이것을 사용하는 경우 유용 할 수 있습니다.
CLI에서는 적절한 확장자가있는 파일 이름으로 --export 인수를 전달합니다.
$ fuzzable analyze --export=report.json <TARGET>
바이너리 닌자에서는 Plugins > Fuzzable > Export Fuzzability Report > ... 내보낼 형식과 작성하려는 경로를 선택하십시오.
이 도구는 지속적으로 개발 될 것이며 외부 맨테이너의 도움에 감사드립니다!
퍼지 가능한 것은 MIT 라이센스에 따라 라이센스가 부여됩니다.