Psyzkaller: Learning from Historical and On-the-Fly Execution Data for Smarter Seed Generation in OS kernel Fuzzing
Liu, Zhang, Cheng et al.
Fuzzing has become a cornerstone technique for uncovering vulnerabilities and enhancing the security of OS kernels. However, state-of-the-art kernel fuzzers, including the de facto standard Syzkaller, struggle to generate valid syscall sequences that respect implicit Syscall Dependency Relations (SDRs). Consequently, many generated seeds either fail kernel validation or cannot penetrate deep execution paths, resulting in significant inefficiency.
We hypothesize that SDRs can be effectively learned from both historic and present kernel execution data, and that incorporating these learned relations into fuzzing can substantially improve seed validity and diversity. To validate this, we propose an approach that utilizes the N-gram model to mine SDRs from the Dongting dataset-one of the largest Linux kernel execution datasets available-as well as from execution traces collected on the fly during fuzzing. The resulting model is used to continuously augment the Choice Table of Syzkaller to improve its seed generation and demonstrably increases the Shannon Entropy of the Choice Table throughout fuzzing, reflecting more empirically-grounded choices in expanding syscall sequences into valid and diverse seeds. In addition, we introduce a Random Walk strategy that instructs Syzkaller to construct seeds in a bidirectional manner to further diversify the generated seeds.
We implement our approach in a prototype, Psyzkaller, built on top of Syzkaller. Experiments on three representative Linux kernel versions show that Psyzkaller improves Syzkaller's code coverage by 4.6%-7.0% in 48-hour fuzzing, while triggering 110.4%-187.2% more crashes. Moreover, our investigation shows that Psyzkaller discovered eight previously unknown kernel vulnerabilities, compared to only one found by Syzkaller.
academic
Psyzkaller: Apprendimento dai Dati di Esecuzione Storici e in Tempo Reale per la Generazione Intelligente di Semi nel Fuzzing del Kernel del Sistema Operativo
Il fuzzing è diventato una tecnologia fondamentale per scoprire vulnerabilità nel kernel del sistema operativo e migliorare la sicurezza. Tuttavia, i fuzzer kernel più avanzati, incluso lo standard de facto Syzkaller, incontrano difficoltà nel generare sequenze di chiamate di sistema efficaci che rispettino le relazioni di dipendenza implicite delle chiamate di sistema (SDRs). Di conseguenza, molti semi generati non superano la validazione del kernel o non riescono a penetrare profondamente i percorsi di esecuzione, causando inefficienze significative. Questo articolo ipotizza che gli SDRs possono essere appresi efficacemente dai dati di esecuzione del kernel storici e attuali, e che l'incorporazione di queste relazioni apprese nel fuzzing può migliorare significativamente la validità e la diversità dei semi. Per verificare questa ipotesi, gli autori propongono un metodo che utilizza modelli N-gram per estrarre gli SDRs dal dataset DongTing (uno dei più grandi dataset di esecuzione del kernel Linux) e dalle tracce di esecuzione raccolte in tempo reale durante il processo di fuzzing.
Il kernel del sistema operativo è un componente critico delle piattaforme informatiche moderne, e un compromesso a livello di kernel consente agli attaccanti di ottenere il controllo completo del sistema. I problemi fondamentali affrontati dai fuzzer kernel attuali sono:
Difficoltà nell'Identificazione delle Relazioni di Dipendenza delle Chiamate di Sistema (SDRs): Molte sequenze di chiamate di sistema (SCSs) generate sono invalide perché violano gli SDRs
Inefficienza nella Generazione dei Semi: I casi di test invalidi falliscono prematuramente, contribuendo poco all'esplorazione del codice
Difficoltà nel Raggiungimento di Percorsi di Esecuzione Profonda: Mancanza di comprensione dei vincoli semantici tra le chiamate di sistema
Gli autori propongono una nuova prospettiva di apprendimento degli SDRs direttamente dalle tracce di esecuzione del kernel, combinando la copertura estesa dei dati storici con l'adattabilità dell'apprendimento online.
Propone una nuova strategia per apprendere gli SDRs combinando dati di esecuzione del kernel storici e in tempo reale, con ampia copertura e adattabilità alla versione del kernel
Sviluppa il prototipo Psyzkaller, integrando l'apprendimento degli SDRs basato su Bigram e la strategia RandomWalk nel flusso di lavoro di Syzkaller
Esegue il pre-addestramento del modello Bigram utilizzando il più grande dataset storico di esecuzione del kernel Linux (DongTing)
Verifica l'efficacia su tre versioni rappresentative del kernel Linux, dimostrando superiorità nella copertura dei rami e nella rilevazione di vulnerabilità
Input: Dataset di esecuzione del kernel storico C e risultati di fuzzing in tempo reale
Output: Tabella di Scelta Migliorata, per guidare la generazione di sequenze di chiamate di sistema più efficaci
Obiettivo: Migliorare la validità dei semi, la diversità e la capacità di scoperta di vulnerabilità
Costruisce la matrice RPM, dove RPM[i]j registra la probabilità di invocare la chiamata di sistema wj immediatamente dopo wi.
Algoritmo 1: LearnSDR
Input: C (corpus di sequenze di chiamate di sistema), CallNum (numero totale di chiamate di sistema nel kernel)
Output: M (modello N-gram appreso da C)
1. Inizializza la matrice M e l'array di conteggio Count
2. Itera su ogni sequenza sc nel corpus C:
- Conta le coppie di chiamate di sistema che appaiono consecutivamente
- Aggiorna le statistiche di conteggio
3. Calcola le probabilità di transizione: M[i][j] = M[i][j] / Count[i]
Efficacia dell'Apprendimento degli SDRs: L'apprendimento degli SDRs dai dati storici e in tempo reale migliora significativamente l'efficacia del fuzzing
Vantaggi della Fusione di Dati: La strategia che combina l'ampiezza storica e l'adattabilità in tempo reale è ottimale
Verifica della Praticità: Dimostra miglioramenti significativi delle prestazioni su versioni reali del kernel
Limitazioni della Dipendenza Semantica: Le relazioni di chiamate di sistema consecutive catturate da Bigram non sempre corrispondono a vere dipendenze semantiche
Evoluzione della Versione del Kernel: L'efficacia dei dati storici su nuove versioni del kernel potrebbe diminuire
Complessità Computazionale: La complessità degli N-gram cresce esponenzialmente con l'aumento di N
L'articolo cita 44 riferimenti correlati, che coprono:
Strumenti di fuzzing del kernel (Syzkaller, Healer, ecc.)
Metodi di machine learning (N-gram, Word2Vec, Transformers)
Dataset di esecuzione del kernel (DongTing, ADFA-LD, ecc.)
Metodi di estrazione delle relazioni di dipendenza delle chiamate di sistema
Valutazione Complessiva: Questo è un articolo di ricerca sulla sicurezza dei sistemi di alta qualità che propone un metodo innovativo guidato dai dati per risolvere problemi chiave nel fuzzing del kernel. La progettazione sperimentale è rigorosa, i risultati sono convincenti e possiede importante valore accademico e pratico significativo.