
GUSTAVE는 임베디드 OS 커널을 위한 퍼징 플랫폼입니다. QEMU와 AFL(및 그 forkserver 계열 모두)을 기반으로 합니다. OS 커널을 간단한 애플리케이션처럼 퍼징할 수 있습니다.
(c) Airbus 2021, sduverger
GUSTAVE는 임베디드 OS 커널을 위한 퍼징 플랫폼입니다. QEMU와 AFL(그리고 모든 forkserver 관련 도구들)을 기반으로 합니다. OS 커널을 간단한 애플리케이션처럼 퍼징할 수 있습니다.
QEMU 덕분에 멀티 플랫폼입니다. GUSTAVE는 QEMU 내부의 AFL forkserver 구현체로, 세밀한 대상 검사 기능을 제공합니다.
GUSTAVE는 주로 임베디드 OS 커널을 대상으로 설계되었습니다. Windows, Linux 또는 macOS와 같은 대규모 복잡한 커널을 퍼징하기에는 최적의 도구가 아닐 수 있습니다.
하지만 사용자 상호작용 없이 부팅할 수 있는 하나 또는 두 개의 애플리케이션으로 준비할 수 있는 타겟이 있다면 GUSTAVE를 시도해보는 것이 흥미로울 수 있습니다.
AFL 프로젝트의 afl-fuzz 도구를 사용하여 타겟을 자동으로 퍼징합니다. 그러나 AFL은 OS 커널을 직접 퍼징할 수 없으며, 타겟이 생성된 테스트 케이스를 직접 파싱하기를 기대합니다.
간단히 말하면, afl-fuzz는 GUSTAVE가 통합된 QEMU를 타겟으로 실행합니다. 그러면 GUSTAVE가 다음을 처리합니다:
AFL++ 프로젝트의 AFL/QEMU-user 모드와 같이, GUSTAVE는 코드 커버리지를 위해 QEMU TCG IR 수준의 바이너리 계측을 구현합니다.
그러나 이를 비활성화하고 코드 커버리지 분석 대상이 되는 특정 부분만 선택하여 타겟 커널 코드를 다시 빌드할 수 있습니다. 하지만 빌드 시 트레이스 비트맵을 업데이트하기 위해 AFL 심(shim)을 삽입해야 합니다. 이것이 초기 접근 방식이었습니다 (출판물 참조).
기존 솔루션에서는 드물지만, GUSTAVE는 커널 패닉 모니터링에 신경 쓰지 않습니다. 이를 관리된 오류로 간주하고, 어떤 경고도 발생시키지 않는 불법 동작을 발견하고자 합니다.
이를 위해 GUSTAVE는 O(1) 바이트 지향 메모리 필터링 비트맵을 사용하여 커널의 불법 접근을 탐지합니다. 커널 관점에서 무엇을 불법으로 간주할지에 대한 큰 논쟁이 있을 수 있습니다. 그러나 제한된 임베디드, 고도로 결정론적인 환경에서는 펌웨어에 대한 합법적인 메모리 영역을 정의하고 경계를 벗어난 접근을 추적하는 것이 편안할 수 있습니다.
다음과 같은 유사한 접근 방식이 존재합니다:
GUSTAVE의 설계 선택은 다음과 같은 차이점을 의미합니다:
그러나 여전히 GUSTAVE에 다음을 알려야 합니다:
현재는 x86 호스트만 지원됩니다. 많은 작업 환경이 이 아키텍처를 기반으로 하므로 제한적인 제약으로 간주하지 않습니다.
이 제한은 QEMU 로드/스토어 고속 경로를 위해 tcg-target 수준에서 메모리 필터링 백엔드를 처음 구현한 방식에서 비롯됩니다. 최근 TCGPlugin 메모리 콜백 아키텍처는 모든 호스트를 지원하는 대안이 될 수 있습니다.
Intel x86 및 PowerPC 지원을 구현하고 테스트했습니다. GUSTAVE 구현은 아키텍처에 독립적입니다. QEMU로 타겟을 실행할 수 있다면, 약간의 노력으로 GUSTAVE로 퍼징할 수 있습니다.
GUSTAVE가 통합된 예제 Intel 440FX 및 PowerPC PREP 보드를 제공합니다. 자신만의 보드 구현은 매우 쉬우며, 특정 아키텍처에 대해 MACHINE_INIT 함수를 래핑하는 것으로 구성됩니다.
TCG 바이너리 계측을 진행하고 싶지 않은 경우를 대비하여 afl-gcc에 x86 및 PowerPC GUSTAVE 계측 심(shim) 지원도 추가했습니다.
POK 마이크로커널 특화 개발을 제공합니다:
다음이 필요합니다:
POK 타겟에 대한 매뉴얼을 읽어보세요.
GUSTAVE에 대한 다양한 발표 자료는 https://airbus-seclab.github.io/에서 확인할 수 있습니다.