Fuzzing guidé par couverture (Coverage-guided fuzzing)
Faites exécuter la cible réelle sous un feedback, avec l'oracle prévu et un cycle de vie reproductible. Un binaire de fuzzing en cours d'exécution ou un corpus croissant n'établit pas une couverture utile : « La valeur corpus count est un mauvais indicateur pour évaluer la qualité de la couverture » (AFL++ Fuzzing in Depth §3.g).
Sélectionner la voie appropriée
Lisez le point d'entrée de la cible, le graphe de construction, les fonctionnalités activées, l'environnement d'exécution/architecture, le décodeur et la propriété. Identifiez quels modules de la cible reçoivent l'instrumentation et ce qui change sous la construction de fuzzing ; un chemin instrumenté uniquement par le pilote ou une fonctionnalité activée seulement sur son wrapper peut manquer l'implémentation prévue. Les options de fonctionnalité de cargo-fuzz « contrôlent la crate fuzz_targets » jusqu'à ce qu'elles soient transmises, et libFuzzer sépare l'instrumentation (-fsanitize=fuzzer-no-link) du lien de son main() (Rust Fuzz Book guide, Cargo features, LLVM libFuzzer, Fuzzer Usage).
Utilisez le producteur existant adapté et le propriétaire de la construction. Choisissez uniquement la référence d'exécution applicable :
| Cible | Référence |
|---|---|
| Source/binaire natif, AFL++ ou libFuzzer | Exécuteurs natifs |
| Go ou Rust | Go et Rust |
| Extensions Python/natives ou JVM | Python et JVM |
| Domaines de propriétés C++ avec FuzzTest | C++ FuzzTest |
| Node.js (CJS, ESM, TypeScript via Jest) | Node.js avec Jazzer.js |
Le code d'application navigateur n'a pas de route guidée par couverture en processus : Jazzer.js place « les autres environnements d'exécution ou le support navigateur » hors de son périmètre (Jazzer.js architecture, Constraints). Orientez l'exploration d'interface utilisateur navigateur vers la compétence qui gère les séquences d'événements UI.
Vérifiez les prérequis de la version sélectionnée et l'aide installée avant de modifier la configuration. Les références enregistrent un instantané de la source daté, pas une promesse que chaque version/plateforme prend en charge les mêmes options. Invoquez dans le cadre de l'autorité existante de l'utilisateur ; cette compétence n'autorise pas elle-même les installations, les modifications de cible ou les dépenses externes.
Lancer un pilote informatif limité
Établissez le mode de découverte, l'instrumentation pertinente de la cible, la réinitialisation d'état et un oracle fonctionnel avant d'ajouter des workers. Le rejeu de seed Go, la régression Jazzer, la régression Jest Jazzer.js et le mode unitaire FuzzTest diffèrent de leurs modes de découverte : le simple go test exécute les seeds « un peu comme un test unitaire », « Jazzer fonctionne en mode régression sauf si le mode fuzzing est explicitement activé », Jazzer.js sous Jest utilise par défaut "regression", et le mode unitaire FuzzTest s'exécute « sans sanitizer ni instrumentation de couverture » (Go fuzzing, Running fuzz tests, Jazzer README, Regression mode, Jazzer.js fuzzing settings, mode, FuzzTest Bazel quickstart, Create and run a fuzz test).
Observez séparément l'admission du décodeur, l'opération prévue, les effets réussis et les évaluations de propriété par rapport à la couverture du moteur ; la mutation d'octets d'un format compressé peut laisser « pratiquement toutes les entrées générées invalides pour uncompress » (Google structure-aware fuzzing guide, Example: Compression). Diagnostiquez les formats rejetés, l'état caché ou les dépendances non satisfaites à l'aide de reach, reset and feedback. Sélectionnez le feedback de dictionnaire/comparaison ou la mutation structurelle face à un bloqueur démontré ; chacun modifie une partie différente de la recherche (AFL++ CmpLog, Google structure-aware fuzzing guide).
Gardez distincts les contrôles par entrée, par temps de fuzzing, par temps réel, par worker/CPU et par mémoire ; incluez le coût d'installation/rejeu dans l'enveloppe autorisée. AFL++ -V est « (temps de fuzzing seulement !) » et -E est « un nombre approximatif d'exécutions totales » ; aucun n'est un temps CPU de processus agrégé (AFL++ selected-ref CLI source, usage text). Le -timeout de Go ne limite pas la phase de fuzzing (Go et Rust). Utilisez des sorties séparées et un nettoyage limité des processus créés ; libFuzzer dit à propos des chemins d'artefact exacts : « N'utilisez pas le même chemin pour plusieurs processus parallèles » (LLVM libFuzzer, Options). Référez-vous à bugfinding-campaign pour les décisions d'allocation.
Interpréter et conserver les preuves
Préservez l'entrée exacte/les arguments typés, la construction/configuration/instrumentation, l'état initial ou la séquence, la commande/les limites, la sortie brute du moteur, les compteurs de cible/propriété et le matériel de rejeu émis. L'état inter-invocations et les différences de cycle de vie peuvent invalider la reproduction en un fichier : Go exige que « l'état d'une cible de fuzzing ne doit pas persister au-delà de la fin de chaque appel », et le PER_TEST par défaut de Jazzer est « plus susceptible de préserver involontairement l'état entre les exécutions de fuzzing » (Go fuzzing, Suggestions, Jazzer Lifecycle implementation).
Retournez ce qui a réellement été exécuté, la propriété observée, l'utilisation des ressources, les candidats et les omissions. Distinguez la découverte de la régression, la couverture de l'atteinte sémantique, et l'échec candidat de l'attribution au produit. Utilisez corpus-evolution pour la conservation/échange compatible, failure-reduction pour le rétrécissement préservant les témoins et evidence-based-triage pour l'attribution. Les résultats de sélection de seeds historiques dépendent de leur cible/ordonnanceur ; Rebert et al. ont trouvé une hypothèse « fausse sous l'ordonnancement optimal » tout en la testant à nouveau sous Round-Robin. Ne les transformez pas en promesses de débit ou de rendement universels (Rebert et al., pp.864,871,873).
Pour des exemples concrets d'exécutions trompeuses et leurs corrections, lisez common mistakes. Aucun nouveau framework spécifique à une cible ne découle de cette compétence.