SockFuzzer: Estrutura de Fuzzing do Kernel XNU
Status do Projeto
O SockFuzzer, originalmente projetado como um fuzzer focado em rede para o kernel XNU (usado em macOS e iOS), evoluiu para uma estrutura abrangente de fuzzing de kernel. Embora mantenha seu nome original como uma homenagem às suas origens, o SockFuzzer agora cobre uma ampla gama de subsistemas do kernel, incluindo BSD, Mach, memória virtual e muito mais. O projeto implementa uma abordagem única ao converter o kernel XNU em uma biblioteca que pode ser "inicializada" e submetida a fuzzing no espaço do usuário, permitindo a descoberta e reprodução eficiente de vulnerabilidades em vários subsistemas.
Objetivos do Projeto
- Testar de forma abrangente o kernel XNU em um ambiente controlado
- Descobrir e reproduzir vulnerabilidades em vários subsistemas do XNU
- Fornecer uma estrutura para fuzzing contínuo e melhoria da segurança do XNU
- Demonstrar o valor da implementação de técnicas avançadas de fuzzing na pesquisa de kernels
- Permitir testes eficientes de interações e subsistemas complexos do kernel
Visão Geral da Arquitetura
O SockFuzzer emprega um design de host/"convidado XNU", onde o kernel XNU é compilado como uma biblioteca e executado em um ambiente personalizado no espaço do usuário. Esta arquitetura consiste em vários componentes principais:
- Ambiente Host
- Biblioteca Convidada XNU
- Escalonador Personalizado (baseado no Concurrence)
- Mecanismo de Fuzzing (Centipede do projeto fuzztest do Google)
- Executor de Testes e Harness
Ambiente Host
O ambiente host fornece a base para executar a biblioteca convidada do XNU e gerenciar o processo de fuzzing. Ele inclui:
- Implementações personalizadas de serviços essenciais do kernel
- Interface de hypercall para comunicação entre o host e o convidado XNU
- Executor de testes e harness para executar testes de fuzzing
Biblioteca Convidada XNU
O kernel XNU é compilado como uma biblioteca (libxnu) com modificações mínimas para executar no espaço do usuário. Os principais aspectos incluem:
- Prefixação e gerenciamento de símbolos para evitar conflitos com símbolos do host
- Exposição seletiva de funções internas do XNU por meio de um script de versão
- Suporte a vários subsistemas: BSD, Mach, memória virtual, threads, processos, etc.
- Camada pmap nula para suporte à memória virtual (com planos de suportar pmap ARM no futuro)
Escalonador Personalizado
Baseado no projeto Concurrence aprimorado, o escalonador personalizado agora suporta recursos completos de threading:
- Executor: fornece criação, exclusão e troca de contexto de threads
- FuzzedScheduler: gerencia estados de threads e decisões de escalonamento
- Integração com a biblioteca convidada do XNU para suporte adequado a multithreading
Executor de Testes e Harness
O executor de testes e o harness gerenciam a execução de testes de fuzzing e fornecem:
- Inicialização do ambiente convidado do XNU
- Execução de entradas de fuzzing em vários subsistemas
- Detecção e relato de falhas
Principais Recursos
- Cobertura Abrangente do Kernel XNU: teste vários subsistemas, incluindo BSD, Mach, memória virtual, threads e processos
- Execução do XNU no Espaço do Usuário: execute componentes do kernel XNU em um ambiente controlado no espaço do usuário
- Suporte Completo a Threading: aproveite o Concurrence aprimorado para recursos adequados de multithreading
- Suporte a Memória Virtual: utilize uma camada pmap nula com planos para suporte a pmap ARM
- Fuzzing de MIG: suporte para fuzzing de interfaces do Mach Interface Generator (MIG)
- Interface de Hypercall: facilite a comunicação entre o host e os componentes convidados do XNU
Recursos Suportados
- BSD
- Mach
- Memória Virtual (com camada pmap nula)
- Threads e Processos
- Rede
- Mensagens Mach
- Interfaces MIG
Fluxo de Trabalho
- O kernel XNU é compilado como uma biblioteca com as modificações necessárias
- O ambiente host inicializa a biblioteca convidada do XNU e o escalonador personalizado
- O Centipede gera entradas estruturadas usando definições de protobuf
- O harness de testes executa as entradas, invocando syscalls, mensagens Mach e outras interfaces do kernel
- O escalonador personalizado gerencia a execução de threads dentro do convidado XNU
- O ASAN monitora problemas de corrupção de memória
- Falhas e informações de cobertura são coletadas e analisadas
Limitações e Trabalhos Futuros
- Suporte a IOKit: a implementação atual não suporta subsistemas IOKit
- Fuzzing Apenas com Binários: a abordagem atualmente depende do código-fonte, que não inclui todos os módulos
Os trabalhos futuros incluem:
- Implementar suporte a IOKit
- Integrar suporte a pmap ARM para memória virtual
- Adaptar técnicas para cenários de fuzzing apenas com binários
- Continuar expandindo a cobertura e o suporte para subsistemas do XNU
Limitações da Versão Pública
Para manter este repositório bem organizado, várias dependências precisarão ser adicionadas pelos próprios usuários ao third_party, como xnu, bootstrap_cmds e algumas outras bibliotecas.