Aller au contenu

syzkaller - Testeur de Noyau Guidé par Couverture

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

ExigenceNote
Chaîne d’outils GoPour construire syzkaller
Source du noyauConstruit avec KCOV, KASAN et infos de débogage
Support VMQEMU/KVM, GCE ou cartes physiques
Image disqueUn rootfs minimal pour l’invité

Building

git clone https://github.com/google/syzkaller
cd syzkaller && make
BinaireRôle
syz-managerOrchestre les VM, le corpus et les rapports
syz-fuzzerS’exécute dans l’invité, génère des programmes
syz-executorExécute les programmes d’appels système dans l’invité
syz-reproMinimise un plantage en un reproducteur
syz-prog2cConvertit un programme syz en C

Configuration du Noyau Requise

OptionObjectif
CONFIG_KCOV=yRetour de couverture (essentiel)
CONFIG_KASAN=yDétection d’erreurs de mémoire
CONFIG_DEBUG_INFO=yRapports symbolisés
CONFIG_KASAN_INLINE=yKASAN plus rapide
CONFIG_FAULT_INJECTION=yExplorer les chemins d’erreur
CONFIG_DEBUG_KMEMLEAK=yDé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
ChampObjectif
targetOS/arch en cours de test
kernel_objRépertoire de compilation du noyau (pour symbolisation)
image / sshkeyRootfs invité et accès
procsProcessus de fuzzing parallèles par VM
vm.countNombre de VM simultanées
httpAdresse du tableau de bord web

Le Tableau de Bord Web

VueAffiche
PlantagesTitres de plantage uniques + comptages
CorpusProgrammes contribuant à la couverture
CouvertureQuels fichiers/lignes du noyau sont atteints
StatistiquesTaux 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

CommandeObjectif
AutomatiqueLe manager exécute syz-repro sur les nouveaux plantages
syz-repro -config my.cfg crash.logMinimiser manuellement
syz-prog2c -prog repro.syzÉmettre un reproducteur C autonome
Reproducteur CCe que vous attachez à un rapport de bug

syzkaller vs Autres Testeurs

AspectsyzkallerAFL++libFuzzer
CibleNoyaux OS (appels système)Binaires userspaceBibliothèques in-process
EntréeProgrammes d’appels systèmeFichiers/stdinTampons d’octets
RetourKCOVCouverture des arêtesSanitizerCoverage
Meilleur pourChasse aux bugs du noyauFuzzing binaire généralAPI 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