SockFuzzer : framework de fuzzing du noyau XNU
État du projet
SockFuzzer, conçu à l'origine comme un fuzzer axé sur le réseau pour le noyau XNU (utilisé dans macOS et iOS), a évolué pour devenir un framework complet de fuzzing du noyau. Tout en conservant son nom d'origine en hommage à ses racines, SockFuzzer couvre désormais un large éventail de sous-systèmes du noyau, notamment BSD, Mach, la mémoire virtuelle et bien d'autres. Le projet met en œuvre une approche unique en convertissant le noyau XNU en une bibliothèque qui peut être « démarrée » et fuzzée dans l'espace utilisateur, ce qui permet une découverte et une reproduction efficaces des vulnérabilités dans plusieurs sous-systèmes.
Objectifs du projet
- Tester de manière exhaustive le noyau XNU dans un environnement contrôlé
- Découvrir et reproduire des vulnérabilités dans divers sous-systèmes XNU
- Fournir un framework pour le fuzzing continu et l'amélioration de la sécurité de XNU
- Démontrer la valeur de la mise en œuvre de techniques avancées de fuzzing dans la recherche sur les noyaux
- Permettre des tests efficaces des interactions complexes et des sous-systèmes du noyau
Vue d'ensemble de l'architecture
SockFuzzer utilise une conception hôte/« invité XNU », où le noyau XNU est compilé en tant que bibliothèque et exécuté dans un environnement personnalisé en espace utilisateur. Cette architecture comprend plusieurs composants clés :
- Environnement hôte
- Bibliothèque invitée XNU
- Ordonnanceur personnalisé (basé sur Concurrence)
- Moteur de fuzzing (Centipede du projet fuzztest de Google)
- Exécuteur de tests et harnais
Environnement hôte
L'environnement hôte fournit la base pour exécuter la bibliothèque invitée XNU et gérer le processus de fuzzing. Il comprend :
- Implémentations personnalisées des services essentiels du noyau
- Interface hypercall pour la communication entre l'hôte et l'invité XNU
- Exécuteur de tests et harnais pour exécuter les tests de fuzzing
Bibliothèque invitée XNU
Le noyau XNU est compilé en tant que bibliothèque (libxnu) avec des modifications minimales pour s'exécuter dans l'espace utilisateur. Les aspects clés comprennent :
- Préfixage et gestion des symboles pour éviter les conflits avec les symboles de l'hôte
- Exposition sélective des fonctions XNU internes via un script de version
- Prise en charge de plusieurs sous-systèmes : BSD, Mach, mémoire virtuelle, threads, processus, etc.
- Couche pmap nulle pour la prise en charge de la mémoire virtuelle (avec des plans pour prendre en charge le pmap ARM à l'avenir)
Ordonnanceur personnalisé
Basé sur le projet Concurrence amélioré, l'ordonnanceur personnalisé prend désormais en charge des capacités de threading complètes :
- Executor : fournit la création, la suppression et la commutation de contexte des threads
- FuzzedScheduler : gère les états des threads et les décisions d'ordonnancement
- Intégration avec la bibliothèque invitée XNU pour une prise en charge correcte du multithreading
Exécuteur de tests et harnais
L'exécuteur de tests et le harnais gèrent l'exécution des tests de fuzzing et fournissent :
- Initialisation de l'environnement invité XNU
- Exécution des entrées de fuzzing dans divers sous-systèmes
- Détection et signalement des crashs
Fonctionnalités clés
- Couverture complète du noyau XNU : testez plusieurs sous-systèmes, notamment BSD, Mach, la mémoire virtuelle, les threads et les processus
- Exécution XNU en espace utilisateur : exécutez les composants du noyau XNU dans un environnement contrôlé en espace utilisateur
- Prise en charge complète du threading : exploitez la version améliorée de Concurrence pour des capacités de multithreading correctes
- Prise en charge de la mémoire virtuelle : utilisez une couche pmap nulle avec des plans pour la prise en charge du pmap ARM
- Fuzzing MIG : prise en charge du fuzzing des interfaces Mach Interface Generator (MIG)
- Interface hypercall : facilite la communication entre l'hôte et les composants de l'invité XNU
Fonctionnalités prises en charge
- BSD
- Mach
- Mémoire virtuelle (avec couche pmap nulle)
- Threads et processus
- Réseau
- Messages Mach
- Interfaces MIG
Flux de travail
- Le noyau XNU est compilé en tant que bibliothèque avec les modifications nécessaires
- L'environnement hôte initialise la bibliothèque invitée XNU et l'ordonnanceur personnalisé
- Centipede génère des entrées structurées à l'aide de définitions protobuf
- Le harnais de test exécute les entrées, en invoquant des appels système, des messages Mach et d'autres interfaces du noyau
- L'ordonnanceur personnalisé gère l'exécution des threads dans l'invité XNU
- ASAN surveille les problèmes de corruption de mémoire
- Les crashs et les informations de couverture sont collectés et analysés
Limites et travaux futurs
- Prise en charge d'IOKit : l'implémentation actuelle ne prend pas en charge les sous-systèmes IOKit
- Fuzzing binaire uniquement : l'approche repose actuellement sur le code source, qui n'inclut pas tous les modules
Les travaux futurs comprennent :
- La mise en œuvre de la prise en charge d'IOKit
- L'intégration de la prise en charge du pmap ARM pour la mémoire virtuelle
- L'adaptation des techniques pour les scénarios de fuzzing binaire uniquement
- La poursuite de l'extension de la couverture et de la prise en charge des sous-systèmes XNU
Limites de la version publique
Afin de maintenir ce dépôt bien structuré, plusieurs dépendances devront être ajoutées par les utilisateurs eux-mêmes dans third_party, telles que xnu, bootstrap_cmds et quelques autres bibliothèques.