AI-Assisted Fuzzing & Automated Vulnerability Discovery

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Overview

Les modĂšles de langage de grande taille (LLMs) peuvent dynamiser les pipelines de recherche de vulnĂ©rabilitĂ©s traditionnels en gĂ©nĂ©rant des entrĂ©es sĂ©mantiquement riches, en faisant Ă©voluer des grammaires, en raisonnant sur les donnĂ©es de crash, et mĂȘme en proposant des correctifs multi-bugs. Cette page collecte les modĂšles les plus efficaces observĂ©s lors des finales du dĂ©fi cybernĂ©tique de l'IA de la DARPA (AIxCC) et d'autres recherches publiques.

Ce qui suit n'est pas une description d'un systÚme de compétition spécifique, mais une abstraction des techniques afin que vous puissiez les reproduire dans vos propres flux de travail.


1. LLM-Generated Seed Inputs

Les fuzzers traditionnels guidés par la couverture (AFL++, libFuzzer, Honggfuzz
) commencent avec un petit corpus de graines et mutent les octets à l'aveugle. Lorsque le format d'entrée cible est complexe (SQL, URLs, protocoles binaires personnalisés), les mutations aléatoires cassent généralement la syntaxe avant d'atteindre des branches intéressantes.

Les LLMs peuvent rĂ©soudre ce problĂšme de dĂ©marrage en Ă©mettant des gĂ©nĂ©rateurs de graines – de courts scripts qui produisent des entrĂ©es syntaxiquement correctes mais pertinentes pour la sĂ©curitĂ©. Par exemple :

prompt
SYSTEM: You are a helpful security engineer.
USER:
Write a Python3 program that prints 200 unique SQL injection strings targeting common anti-pattern mistakes (missing quotes, numeric context, stacked queries).  Ensure length ≀ 256 bytes / string so they survive common length limits.
python
# gen_sqli_seeds.py (truncated)
PAYLOADS = [
"1 OR 1=1 -- ",
"' UNION SELECT NULL,NULL--",
"0; DROP TABLE users;--",
...
]
for p in PAYLOADS:
print(p)

Exécutez une fois et alimentez la sortie directement dans le corpus initial du fuzzer :

bash
python3 gen_sqli_seeds.py > seeds.txt
afl-fuzz -i seeds.txt -o findings/ -- ./target @@

Avantages :

  1. ValiditĂ© sĂ©mantique → couverture plus profonde tĂŽt.
  2. Régénérable : ajustez l'invite pour se concentrer sur XSS, traversée de chemin, blobs binaires, etc.
  3. Peu coûteux (< 1 ¹ avec GPT-3.5).

Conseils

  • Instruisez le modĂšle pour diversifier la longueur et l'encodage des charges utiles (UTF-8, URL-encoded, UTF-16-LE) pour contourner les filtres superficiels.
  • Demandez un script autonome unique – Ă©vite les problĂšmes de formatage JSON.

2. Fuzzing par Évolution de Grammaire

Une variante plus puissante consiste à laisser le LLM faire évoluer une grammaire au lieu de graines concrÚtes. Le flux de travail (modÚle "Grammar Guy") est :

  1. Générer une grammaire ANTLR/Peach/LibFuzzer initiale via une invite.
  2. Fuzzer pendant N minutes et collecter des métriques de couverture (bords / blocs touchés).
  3. Résumer les zones du programme non couvertes et renvoyer le résumé dans le modÚle :
prompt
La grammaire précédente a déclenché 12 % des bords du programme. Fonctions non atteintes : parse_auth, handle_upload. Ajoutez / modifiez des rÚgles pour couvrir ces points.
  1. Fusionner les nouvelles rÚgles, re-fuzzer, répéter.

Squelette de pseudo-code :

python
for epoch in range(MAX_EPOCHS):
grammar = llm.refine(grammar, feedback=coverage_stats)
save(grammar, f"grammar_{epoch}.txt")
coverage_stats = run_fuzzer(grammar)

Points clés :

  • Gardez un budget – chaque raffinement utilise des tokens.
  • Utilisez des instructions diff + patch pour que le modĂšle Ă©dite plutĂŽt que réécrive.
  • ArrĂȘtez-vous lorsque Δcoverage < Δ.

3. Génération de PoV (Exploit) basée sur des agents

AprÚs qu'un crash soit trouvé, vous avez toujours besoin d'une preuve de vulnérabilité (PoV) qui le déclenche de maniÚre déterministe.

Une approche évolutive consiste à créer des milliers d'agents légers (<process/thread/container/prisonnier>), chacun exécutant un LLM différent (GPT-4, Claude, Mixtral) ou un réglage de température différent.

Pipeline :

  1. L'analyse statique/dynamique produit des candidats de bogue (struct avec PC de crash, tranche d'entrée, msg de désinfection).
  2. L'orchestrateur distribue les candidats aux agents.
  3. Étapes de raisonnement de l'agent : a. Reproduire le bogue localement avec gdb + entrĂ©e. b. SuggĂ©rer une charge utile d'exploit minimale. c. Valider l'exploit dans un bac Ă  sable. Si succĂšs → soumettre.
  4. Les tentatives échouées sont remises en file d'attente comme nouvelles graines pour le fuzzing de couverture (boucle de rétroaction).

Avantages :

  • La parallĂ©lisation cache l'instabilitĂ© d'un agent unique.
  • Auto-ajustement de la tempĂ©rature / taille du modĂšle basĂ© sur le taux de succĂšs observĂ©.

4. Fuzzing dirigé avec des modÚles de code finement ajustés

Affinez un modÚle à poids ouvert (par exemple, Llama-7B) sur du code source C/C++ étiqueté avec des motifs de vulnérabilité (débordement d'entier, copie de tampon, chaßne de format). Ensuite :

  1. Exécutez une analyse statique pour obtenir la liste des fonctions + AST.
  2. Invitez le modĂšle : “Donnez des entrĂ©es de dictionnaire de mutation susceptibles de compromettre la sĂ©curitĂ© de la mĂ©moire dans la fonction X”.
  3. Insérez ces tokens dans un AFL_CUSTOM_MUTATOR.

Exemple de sortie pour un wrapper sprintf :

{"pattern":"%99999999s"}
{"pattern":"AAAAAAAA....<1024>....%n"}

Empiriquement, cela rĂ©duit le temps jusqu'Ă  l'Ă©crasement de plus de 2× sur des cibles rĂ©elles.


5. Stratégies de Patching Guidées par l'IA

5.1 Super Patches

Demandez au modĂšle de regrouper les signatures de crash et de proposer un patch unique qui Ă©limine la cause racine commune. Soumettez une fois, corrigez plusieurs bugs → moins de pĂ©nalitĂ©s de prĂ©cision dans les environnements oĂč chaque mauvais patch coĂ»te des points.

Plan de l'invite :

Here are 10 stack traces + file snippets.  Identify the shared mistake and generate a unified diff fixing all occurrences.

5.2 Ratio de Patch Spéculatif

ImplĂ©mentez une file d'attente oĂč les patches validĂ©s par PoV confirmĂ©s et les patches spĂ©culatifs (sans PoV) sont entrelacĂ©s dans un ratio de 1:​N ajustĂ© aux rĂšgles de scoring (par exemple, 2 spĂ©culatifs : 1 confirmĂ©). Un modĂšle de coĂ»t surveille les pĂ©nalitĂ©s par rapport aux points et ajuste automatiquement N.


Mettre le Tout Ensemble

Un CRS (SystÚme de Raisonnement Cybernétique) de bout en bout peut cùbler les composants comme ceci :

mermaid
graph TD
subgraph Discovery
A[LLM Seed/Grammar Gen] --> B[Fuzzer]
C[Fine-Tuned Model Dicts] --> B
end
B --> D[Crash DB]
D --> E[Agent PoV Gen]
E -->|valid PoV| PatchQueue
D -->|cluster| F[LLM Super-Patch]
PatchQueue --> G[Patch Submitter]

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks