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 : Apprentissage à partir de données d'exécution historiques et en temps réel pour une génération de graines plus intelligente dans le fuzzing du noyau OS
Le fuzzing est devenu une technique fondamentale pour découvrir les vulnérabilités du noyau du système d'exploitation et renforcer la sécurité. Cependant, les fuzzer de noyau les plus avancés, y compris Syzkaller qui est la norme de facto, éprouvent des difficultés à générer des séquences d'appels système efficaces qui respectent les dépendances implicites des appels système (SDRs). Par conséquent, de nombreuses graines générées échouent soit à la validation du noyau, soit ne parviennent pas à explorer profondément les chemins d'exécution, ce qui entraîne une inefficacité significative. Cet article suppose que les SDRs peuvent être apprises efficacement à partir de données d'exécution du noyau historiques et actuelles, et que l'intégration de ces relations apprises dans le fuzzing peut améliorer considérablement la validité et la diversité des graines. Pour valider cette hypothèse, les auteurs proposent une méthode utilisant des modèles N-gram pour extraire les SDRs à partir de l'ensemble de données DongTing (l'un des plus grands ensembles de données d'exécution du noyau Linux) ainsi que des traces d'exécution collectées en temps réel pendant le processus de fuzzing.
Le noyau du système d'exploitation est un composant critique des plates-formes informatiques modernes, et un compromis au niveau du noyau permet aux attaquants d'obtenir un contrôle total du système. Les problèmes fondamentaux auxquels font face les fuzzer de noyau actuels sont :
Difficulté d'identification des dépendances des appels système (SDRs) : De nombreuses séquences d'appels système (SCS) générées sont invalides car elles violent les SDRs
Inefficacité de la génération de graines : Les cas de test invalides échouent prématurément et contribuent peu à l'exploration du code
Difficulté d'atteindre les chemins d'exécution profonds : Manque de compréhension des contraintes sémantiques entre les appels système
Les auteurs proposent une nouvelle perspective pour apprendre les SDRs directement à partir des traces d'exécution du noyau, combinant la couverture étendue des données historiques et l'adaptabilité de l'apprentissage en ligne.
Proposition d'une nouvelle stratégie combinant l'apprentissage des SDRs à partir de données d'exécution du noyau historiques et en temps réel, offrant à la fois une couverture étendue et une adaptabilité aux versions du noyau
Développement du prototype Psyzkaller, intégrant l'apprentissage des SDRs basé sur Bigram et la stratégie RandomWalk dans le flux de travail Syzkaller
Pré-entraînement du modèle Bigram en utilisant le plus grand ensemble de données d'exécution historiques du noyau Linux (DongTing)
Validation de l'efficacité sur trois versions représentatives du noyau Linux, démontrant la supériorité en termes de couverture de branches et de détection de vulnérabilités
Entrée : Ensemble de données d'exécution du noyau historiques C et résultats de fuzzing en temps réel
Sortie : Table de choix améliorée pour guider une génération de séquences d'appels système plus efficace
Objectif : Améliorer la validité des graines, la diversité et la capacité de découverte de vulnérabilités
Construction de la matrice RPM, où RPM[i]j enregistre la probabilité que l'appel système wj soit appelé immédiatement après wi.
Algorithme 1 : LearnSDR
Entrée : C (corpus de séquences d'appels système), CallNum (nombre total d'appels système dans le noyau)
Sortie : M (modèle N-gram appris à partir de C)
1. Initialiser la matrice M et le tableau de comptage Count
2. Parcourir chaque séquence sc dans le corpus C :
- Compter les paires d'appels système consécutifs
- Mettre à jour les statistiques de comptage
3. Calculer les probabilités de transition : M[i][j] = M[i][j] / Count[i]
Fusion de données bidirectionnelles : Première combinaison systématique de données historiques à grande échelle et d'apprentissage en temps réel
Amélioration de l'entropie de Shannon : Augmentation significative de l'entropie de Shannon de la table de choix (de 1,50 à 3,30-3,50 bits) grâce à l'apprentissage des SDRs
Stratégie d'équilibrage des poids : Équilibrage de l'influence des trajectoires normales et anormales par des poids configurables
Génération de graines bidirectionnelle : La stratégie RandomWalk dépasse les limitations de l'extension unidirectionnelle traditionnelle
Efficacité de l'apprentissage des SDRs : L'apprentissage des SDRs à partir de données historiques et en temps réel améliore significativement l'efficacité du fuzzing
Avantages de la fusion de données : La stratégie combinant l'étendue historique et l'adaptabilité en temps réel est optimale
Validation de la praticité : Démonstration de l'amélioration significative des performances sur les versions réelles du noyau
Limitation des dépendances sémantiques : Les relations d'appels système consécutifs capturées par Bigram ne correspondent pas toujours aux véritables dépendances sémantiques
Évolution des versions du noyau : L'efficacité des données historiques peut diminuer sur les nouvelles versions du noyau
Complexité computationnelle : La complexité des N-gram croît exponentiellement avec l'augmentation de N
Amélioration de la compréhension sémantique : Combinaison du code source et de la documentation des appels système pour extraire des SDRs plus précises
Extension du champ d'application : Application des SDRs apprises à d'autres étapes telles que la mutation des graines et l'ordonnancement
Intégration de l'apprentissage par renforcement : Combinaison avec des stratégies de fuzzing basées sur l'apprentissage par renforcement
Ensembles de données d'exécution du noyau (DongTing, ADFA-LD, etc.)
Méthodes d'extraction des dépendances des appels système
Évaluation globale : Ceci est un article de recherche en sécurité des systèmes de haute qualité qui propose une méthode innovante basée sur les données pour résoudre les problèmes clés du fuzzing du noyau. La conception expérimentale est rigoureuse, les résultats sont convaincants, et l'article possède une valeur académique et pratique importante.