SockFuzzer: XNU 커널 퍼징 프레임워크
프로젝트 현황
SockFuzzer는 원래 macOS 및 iOS에서 사용되는 XNU 커널을 위한 네트워킹 중심 퍼저로 설계되었지만, 현재는 포괄적인 커널 퍼징 프레임워크로 발전했습니다. 원래 이름을 그 기원을 기리는 의미로 유지하면서, SockFuzzer는 이제 BSD, Mach, 가상 메모리 등을 포함한 광범위한 커널 서브시스템을 다룹니다. 이 프로젝트는 XNU 커널을 사용자 공간에서 "부팅"되고 퍼징될 수 있는 라이브러리로 변환하는 독특한 접근 방식을 구현하여, 여러 서브시스템에 걸친 효율적인 취약점 발견 및 재현을 가능하게 합니다.
프로젝트 목표
- 통제된 환경에서 XNU 커널을 종합적으로 테스트합니다
- 다양한 XNU 서브시스템에서 취약점을 발견하고 재현합니다
- XNU 보안의 지속적인 퍼징 및 개선을 위한 프레임워크를 제공합니다
- 커널 연구에서 고급 퍼징 기법 구현의 가치를 입증합니다
- 복잡한 커널 상호작용 및 서브시스템의 효율적인 테스트를 가능하게 합니다
아키텍처 개요
SockFuzzer는 호스트/"XNU 게스트" 설계를 채택하며, XNU 커널이 라이브러리로 컴파일되어 커스텀 사용자 공간 환경 내에서 실행됩니다. 이 아키텍처는 다음과 같은 여러 핵심 구성 요소로 이루어져 있습니다:
- 호스트 환경
- XNU 게스트 라이브러리
- 커스텀 스케줄러 (Concurrence 기반)
- 퍼징 엔진 (Google의 fuzztest 프로젝트의 Centipede)
- 테스트 러너 및 하네스
호스트 환경
호스트 환경은 XNU 게스트 라이브러리 실행 및 퍼징 프로세스 관리를 위한 기반을 제공합니다. 여기에는 다음이 포함됩니다:
- 핵심 커널 서비스의 커스텀 구현
- 호스트와 XNU 게스트 간 통신을 위한 하이퍼콜 인터페이스
- 퍼즈 테스트 실행을 위한 테스트 러너 및 하네스
XNU 게스트 라이브러리
XNU 커널은 사용자 공간에서 실행되도록 최소한의 수정만을 가한 라이브러리(libxnu)로 컴파일됩니다. 주요 측면은 다음과 같습니다:
- 호스트 심볼과의 충돌을 피하기 위한 심볼 접두사 부여 및 관리
- 버전 스크립트를 통한 내부 XNU 함수의 선택적 노출
- BSD, Mach, 가상 메모리, 스레드, 프로세스 등 여러 서브시스템 지원
- 가상 메모리 지원을 위한 널 pmap 레이어 (향후 ARM pmap 지원 계획 포함)
커스텀 스케줄러
개선된 Concurrence 프로젝트를 기반으로, 커스텀 스케줄러는 이제 완전한 스레딩 기능을 지원합니다:
- Executor: 스레드 생성, 삭제 및 컨텍스트 스위칭 제공
- FuzzedScheduler: 스레드 상태 및 스케줄링 결정 관리
- 적절한 멀티스레딩 지원을 위한 XNU 게스트 라이브러리와의 통합
테스트 러너 및 하네스
테스트 러너와 하네스는 퍼즈 테스트의 실행을 관리하고 다음을 제공합니다:
- XNU 게스트 환경 초기화
- 다양한 서브시스템에 걸친 퍼즈 입력 실행
- 크래시 감지 및 보고
주요 기능
- 포괄적인 XNU 커널 커버리지: BSD, Mach, 가상 메모리, 스레드 및 프로세스를 포함한 여러 서브시스템 테스트
- 사용자 공간 XNU 실행: 통제된 사용자 공간 환경에서 XNU 커널 구성 요소 실행
- 완전한 스레딩 지원: 개선된 Concurrence를 활용한 적절한 멀티스레딩 기능
- 가상 메모리 지원: ARM pmap 지원 계획과 함께 널 pmap 레이어 활용
- MIG 퍼징: Mach Interface Generator(MIG) 인터페이스 퍼징 지원
- 하이퍼콜 인터페이스: 호스트와 XNU 게스트 구성 요소 간 통신 지원
지원 기능
- BSD
- Mach
- 가상 메모리 (널 pmap 레이어 포함)
- 스레드 및 프로세스
- 네트워킹
- Mach 메시지
- MIG 인터페이스
워크플로우
- XNU 커널이 필요한 수정 사항과 함께 라이브러리로 컴파일됩니다
- 호스트 환경이 XNU 게스트 라이브러리와 커스텀 스케줄러를 초기화합니다
- Centipede가 protobuf 정의를 사용하여 구조화된 입력을 생성합니다
- 테스트 하네스가 입력을 실행하여 syscall, Mach 메시지 및 기타 커널 인터페이스를 호출합니다
- 커스텀 스케줄러가 XNU 게스트 내에서 스레드 실행을 관리합니다
- ASAN이 메모리 손상 문제를 모니터링합니다
- 크래시 및 커버리지 정보가 수집되고 분석됩니다
제한 사항 및 향후 작업
- IOKit 지원: 현재 구현은 IOKit 서브시스템을 지원하지 않습니다
- 바이너리 전용 퍼징: 현재 접근 방식은 모든 모듈을 포함하지 않는 소스 코드에 의존합니다
향후 작업에는 다음이 포함됩니다:
- IOKit 지원 구현
- 가상 메모리를 위한 ARM pmap 통합
- 바이너리 전용 퍼징 시나리오에 대한 기법 적용
- XNU 서브시스템에 대한 커버리지 및 지원 지속 확장
공개 릴리스 제한 사항
이 저장소의 구조를 깔끔하게 유지하기 위해, 사용자들은 xnu, bootstrap_cmds 및 기타 여러 라이브러리와 같은 일부 종속성을 직접 third_party에 추가해야 합니다.