ctoth/coverage-guided-fuzzing

Construit et exploite des campagnes de fuzzing instrumentées avec des sémantiques de découverte, réinitialisation et rejeu propres à chaque environnement d'exécution. À utiliser pour configurer AFL++, libFuzzer, Go fuzzing, cargo-fuzz, Atheris, Jazzer, Jazzer.js ou FuzzTest, ou pour diagnostiquer une faible couverture utile dans une campagne existante.

Qu'est-ce que coverage-guided-fuzzing ?

Cette compétence fournit un guide complet pour mettre en place des campagnes de fuzzing guidé par couverture sur divers langages et frameworks, incluant des environnements natifs (AFL++, libFuzzer), Go, Rust, Python (Atheris), JVM (Jazzer), Node.js/TypeScript (Jazzer.js) et C++ (FuzzTest). Elle explique comment sélectionner la bonne voie de fuzzing, lancer un pilote informatif limité, interpréter les retours de couverture et conserver les preuves. Attention : le code JavaScript navigateur n'a pas de route guidée par couverture dans ce contexte. La compétence met en garde contre les indicateurs trompeurs comme le simple nombre de corpus, insiste sur la distinction entre les modes découverte et régression, et oriente vers les références appropriées pour chaque cible. Elle ne gère pas les autorisations d'installation ni les dépenses externes, et se concentre sur l'exécution technique et le diagnostic du fuzzing.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ctoth/computational-bugfinding-skills-plugin/tree/HEAD/plugins/bugfinding/skills/coverage-guided-fuzzing

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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 :

CibleRéférence
Source/binaire natif, AFL++ ou libFuzzerExécuteurs natifs
Go ou RustGo et Rust
Extensions Python/natives ou JVMPython et JVM
Domaines de propriétés C++ avec FuzzTestC++ 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.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés