syzkaller - Testeur de Noyau Guidé par Couverture
syzkaller est le testeur de noyau non supervisé et guidé par couverture de Google. Il génère des séquences d’appels système décrites par un langage déclaratif (syzlang), les exécute dans les VM, utilise la couverture du noyau (KCOV) pour diriger la mutation vers le code inexploré, et détecte les plantages via les sanitizers du noyau. Il s’exécute en continu sans entrée humaine et a trouvé des milliers de bugs du noyau Linux — le système de fuzzing continu syzbot est construit dessus. Il supporte également d’autres noyaux, y compris les BSD, Fuchsia et Windows.
Le fuzzing peut faire planter les noyaux par conception. Toujours exécuter dans des VM jetables, jamais sur une machine qui vous importe.
Prérequis
| Exigence | Note |
|---|
| Chaîne d’outils Go | Pour construire syzkaller |
| Source du noyau | Construit avec KCOV, KASAN et infos de débogage |
| Support VM | QEMU/KVM, GCE ou cartes physiques |
| Image disque | Un rootfs minimal pour l’invité |
Building
git clone https://github.com/google/syzkaller
cd syzkaller && make
| Binaire | Rôle |
|---|
syz-manager | Orchestre les VM, le corpus et les rapports |
syz-fuzzer | S’exécute dans l’invité, génère des programmes |
syz-executor | Exécute les programmes d’appels système dans l’invité |
syz-repro | Minimise un plantage en un reproducteur |
syz-prog2c | Convertit un programme syz en C |
Configuration du Noyau Requise
| Option | Objectif |
|---|
CONFIG_KCOV=y | Retour de couverture (essentiel) |
CONFIG_KASAN=y | Détection d’erreurs de mémoire |
CONFIG_DEBUG_INFO=y | Rapports symbolisés |
CONFIG_KASAN_INLINE=y | KASAN plus rapide |
CONFIG_FAULT_INJECTION=y | Explorer les chemins d’erreur |
CONFIG_DEBUG_KMEMLEAK=y | Détection des fuites (facultatif) |
Sans KCOV, le testeur est aveugle — le retour de couverture est ce qui le rend efficace plutôt qu’aléatoire.
Configuration du Manager
{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "/home/user/syzkaller/workdir",
"kernel_obj": "/home/user/linux",
"image": "/home/user/image/bullseye.img",
"sshkey": "/home/user/image/bullseye.id_rsa",
"syzkaller": "/home/user/syzkaller",
"procs": 8,
"type": "qemu",
"vm": { "count": 4, "kernel": "/home/user/linux/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 }
}
./bin/syz-manager -config my.cfg
| Champ | Objectif |
|---|
target | OS/arch en cours de test |
kernel_obj | Répertoire de compilation du noyau (pour symbolisation) |
image / sshkey | Rootfs invité et accès |
procs | Processus de fuzzing parallèles par VM |
vm.count | Nombre de VM simultanées |
http | Adresse du tableau de bord web |
Le Tableau de Bord Web
| Vue | Affiche |
|---|
| Plantages | Titres de plantage uniques + comptages |
| Corpus | Programmes contribuant à la couverture |
| Couverture | Quels fichiers/lignes du noyau sont atteints |
| Statistiques | Taux d’exécution, santé des VM |
La couverture est le nombre à regarder : si elle stagne, le testeur a épuisé ce que vos descriptions d’appels système peuvent atteindre.
syzlang (Descriptions d’Appels Système)
# Exemple simplifié : décrire la structure des arguments d'un appel système
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
Les bonnes descriptions sont ce qui permet au testeur de construire des programmes assez valides pour atteindre le code profond. Étendre sys/linux/*.txt pour un sous-système sous-testé est souvent la contribution de plus haute valeur.
Reproduction des Plantages
| Commande | Objectif |
|---|
| Automatique | Le manager exécute syz-repro sur les nouveaux plantages |
syz-repro -config my.cfg crash.log | Minimiser manuellement |
syz-prog2c -prog repro.syz | Émettre un reproducteur C autonome |
| Reproducteur C | Ce que vous attachez à un rapport de bug |
syzkaller vs Autres Testeurs
| Aspect | syzkaller | AFL++ | libFuzzer |
|---|
| Cible | Noyaux OS (appels système) | Binaires userspace | Bibliothèques in-process |
| Entrée | Programmes d’appels système | Fichiers/stdin | Tampons d’octets |
| Retour | KCOV | Couverture des arêtes | SanitizerCoverage |
| Meilleur pour | Chasse aux bugs du noyau | Fuzzing binaire général | API de bibliothèque |
Pour les cibles userspace utilisez AFL++ ou honggfuzz ; syzkaller est construit spécifiquement pour la limite d’appel système du noyau.
Ressources