SockFuzzer: Framework di fuzzing per il kernel XNU
Stato del progetto
SockFuzzer, originariamente progettato come fuzzer incentrato sulla rete per il kernel XNU (utilizzato in macOS e iOS), si è evoluto in un framework completo di fuzzing per il kernel. Pur mantenendo il nome originale come omaggio alle sue radici, SockFuzzer ora copre un'ampia gamma di sottosistemi del kernel, inclusi BSD, Mach, memoria virtuale e altro ancora. Il progetto implementa un approccio unico convertendo il kernel XNU in una libreria che può essere "avviata" e sottoposta a fuzzing nello spazio utente, consentendo un'efficiente scoperta e riproduzione di vulnerabilità attraverso più sottosistemi.
Obiettivi del progetto
- Testare in modo completo il kernel XNU in un ambiente controllato
- Scoprire e riprodurre vulnerabilità attraverso vari sottosistemi XNU
- Fornire un framework per il fuzzing continuo e il miglioramento della sicurezza di XNU
- Dimostrare il valore dell'implementazione di tecniche avanzate di fuzzing nella ricerca sul kernel
- Consentire test efficienti di interazioni complesse del kernel e dei sottosistemi
Panoramica dell'architettura
SockFuzzer impiega un'architettura host/"ospite XNU", in cui il kernel XNU viene compilato come libreria ed eseguito in un ambiente utente personalizzato. Questa architettura è costituita da diversi componenti chiave:
- Ambiente host
- Libreria ospite XNU
- Scheduler personalizzato (basato su Concurrence)
- Motore di fuzzing (Centipede del progetto fuzztest di Google)
- Esecutore di test e harness
Ambiente host
L'ambiente host fornisce le basi per eseguire la libreria ospite XNU e gestire il processo di fuzzing. Include:
- Implementazioni personalizzate dei servizi principali del kernel
- Interfaccia hypercall per la comunicazione tra host e ospite XNU
- Esecutore di test e harness per l'esecuzione dei test di fuzzing
Libreria ospite XNU
Il kernel XNU viene compilato come libreria (libxnu) con modifiche minime per essere eseguito nello spazio utente. Gli aspetti chiave includono:
- Prefissazione e gestione dei simboli per evitare conflitti con i simboli dell'host
- Esposizione selettiva delle funzioni interne di XNU tramite un version script
- Supporto per più sottosistemi: BSD, Mach, memoria virtuale, thread, processi, ecc.
- Livello pmap nullo per il supporto alla memoria virtuale (con piani per supportare ARM pmap in futuro)
Scheduler personalizzato
Basato sul progetto Concurrence migliorato, lo scheduler personalizzato ora supporta funzionalità di threading complete:
- Executor: fornisce creazione, eliminazione e commutazione di contesto dei thread
- FuzzedScheduler: gestisce gli stati dei thread e le decisioni di scheduling
- Integrazione con la libreria ospite XNU per un corretto supporto al multithreading
Esecutore di test e harness
L'esecutore di test e l'harness gestiscono l'esecuzione dei test di fuzzing e forniscono:
- Inizializzazione dell'ambiente ospite XNU
- Esecuzione degli input di fuzzing attraverso vari sottosistemi
- Rilevamento e segnalazione dei crash
Caratteristiche principali
- Copertura completa del kernel XNU: testa più sottosistemi, inclusi BSD, Mach, memoria virtuale, thread e processi
- Esecuzione di XNU nello spazio utente: esegue i componenti del kernel XNU in un ambiente utente controllato
- Supporto completo al threading: sfrutta il Concurrence migliorato per funzionalità di multithreading corrette
- Supporto alla memoria virtuale: utilizza un livello pmap nullo con piani per il supporto ARM pmap
- Fuzzing MIG: supporto per il fuzzing delle interfacce Mach Interface Generator (MIG)
- Interfaccia hypercall: facilita la comunicazione tra host e componenti dell'ospite XNU
Funzionalità supportate
- BSD
- Mach
- Memoria virtuale (con livello pmap nullo)
- Thread e processi
- Rete
- Messaggi Mach
- Interfacce MIG
Flusso di lavoro
- Il kernel XNU viene compilato come libreria con le modifiche necessarie
- L'ambiente host inizializza la libreria ospite XNU e lo scheduler personalizzato
- Centipede genera input strutturati utilizzando le definizioni protobuf
- L'harness di test esegue gli input, invocando syscall, messaggi Mach e altre interfacce del kernel
- Lo scheduler personalizzato gestisce l'esecuzione dei thread all'interno dell'ospite XNU
- ASAN monitora i problemi di corruzione della memoria
- I crash e le informazioni di copertura vengono raccolti e analizzati
Limitazioni e lavori futuri
- Supporto IOKit: l'implementazione attuale non supporta i sottosistemi IOKit
- Fuzzing di soli binari: l'approccio attuale si basa sul codice sorgente che non include tutti i moduli
Il lavoro futuro include:
- Implementare il supporto IOKit
- Integrare il supporto ARM pmap per la memoria virtuale
- Adattare le tecniche per scenari di fuzzing di soli binari
- Continuare ad espandere la copertura e il supporto per i sottosistemi XNU
Limitazioni della release pubblica
Per mantenere questo repository ben strutturato, diverse dipendenze dovranno essere aggiunte dagli utenti stessi a third_party, come xnu, bootstrap_cmds e alcune altre librerie.