AI-Assisted Fuzzing & Automated Vulnerability Discovery
Reading time: 6 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica
I modelli di linguaggio di grandi dimensioni (LLM) possono potenziare i tradizionali pipeline di ricerca delle vulnerabilità generando input semanticamente ricchi, evolvendo grammatiche, ragionando sui dati di crash e persino proponendo patch multi-bug. Questa pagina raccoglie i modelli più efficaci osservati durante le finali della sfida AI Cyber Challenge (AIxCC) della DARPA e altre ricerche pubbliche.
Ciò che segue non è una descrizione di un sistema di competizione specifico, ma un'astrazione delle tecniche in modo che tu possa riprodurle nei tuoi flussi di lavoro.
1. Input Seed Generati da LLM
I fuzzers tradizionali guidati dalla copertura (AFL++, libFuzzer, Honggfuzz…) iniziano con un piccolo corpus di semi e mutano i byte alla cieca. Quando il formato di input target è complesso (SQL, URL, protocolli binari personalizzati), le mutazioni casuali di solito rompono la sintassi prima che si raggiungano rami interessanti.
Gli LLM possono risolvere questo problema di avvio emettendo generatori di semi – brevi script che producono input sintatticamente corretti ma rilevanti per la sicurezza. Ad esempio:
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.
# gen_sqli_seeds.py (truncated)
PAYLOADS = [
"1 OR 1=1 -- ",
"' UNION SELECT NULL,NULL--",
"0; DROP TABLE users;--",
...
]
for p in PAYLOADS:
print(p)
Esegui una volta e alimenta l'output direttamente nel corpus iniziale del fuzzer:
python3 gen_sqli_seeds.py > seeds.txt
afl-fuzz -i seeds.txt -o findings/ -- ./target @@
Benefici:
- Validità semantica → copertura più profonda all'inizio.
- Rigenerabile: modifica il prompt per concentrarti su XSS, traversamento di percorso, blob binari, ecc.
- Economico (< 1 ¢ con GPT-3.5).
Suggerimenti
- Istruisci il modello a diversificare la lunghezza e la codifica del payload (UTF-8, URL-encoded, UTF-16-LE) per bypassare filtri superficiali.
- Richiedi un singolo script autonomo – evita problemi di formattazione JSON.
2. Fuzzing dell'Evoluzione della Grammatica
Una variante più potente è lasciare che il LLM evolva una grammatica invece di semi concreti. Il flusso di lavoro (“Grammar Guy” pattern) è:
- Genera una grammatica ANTLR/Peach/LibFuzzer iniziale tramite prompt.
- Fuzz per N minuti e raccogli metriche di copertura (edge / blocchi colpiti).
- Riassumi le aree del programma non coperte e reinserisci il riassunto nel modello:
La grammatica precedente ha attivato il 12 % degli edge del programma. Funzioni non raggiunte: parse_auth, handle_upload. Aggiungi / modifica regole per coprire questi.
- Unisci le nuove regole, ri-fuzz, ripeti.
Scheletro di pseudo-codice:
for epoch in range(MAX_EPOCHS):
grammar = llm.refine(grammar, feedback=coverage_stats)
save(grammar, f"grammar_{epoch}.txt")
coverage_stats = run_fuzzer(grammar)
Punti chiave:
- Mantieni un budget – ogni affinamento utilizza token.
- Usa istruzioni
diff
+patch
in modo che il modello modifichi piuttosto che riscrivere. - Fermati quando Δcoverage < ε.
3. Generazione di PoV (Exploit) Basata su Agenti
Dopo aver trovato un crash, hai ancora bisogno di una proof-of-vulnerability (PoV) che lo attivi in modo deterministico.
Un approccio scalabile è generare migliaia di agenti leggeri (<process/thread/container/prisoner>), ciascuno in esecuzione con un diverso LLM (GPT-4, Claude, Mixtral) o impostazione di temperatura.
Pipeline:
- L'analisi statica/dinamica produce candidati bug (struttura con crash PC, input slice, messaggio del sanitizzatore).
- L'orchestratore distribuisce i candidati agli agenti.
- Passaggi di ragionamento dell'agente:
a. Riproduci il bug localmente con
gdb
+ input. b. Suggerisci un payload di exploit minimo. c. Valida l'exploit in sandbox. Se ha successo → invia. - I tentativi falliti vengono ri-inseriti come nuovi semi per il fuzzing di copertura (feedback loop).
Vantaggi:
- La parallelizzazione nasconde l'affidabilità di un singolo agente.
- Auto-tuning della temperatura / dimensione del modello basato sul tasso di successo osservato.
4. Fuzzing Diretto con Modelli di Codice Affinati
Affina un modello a peso aperto (ad es. Llama-7B) su sorgente C/C++ etichettato con schemi di vulnerabilità (overflow intero, copia di buffer, stringa di formato). Poi:
- Esegui un'analisi statica per ottenere l'elenco delle funzioni + AST.
- Invia un prompt al modello: “Fornisci voci del dizionario di mutazione che probabilmente romperanno la sicurezza della memoria nella funzione X”.
- Inserisci quei token in un
AFL_CUSTOM_MUTATOR
personalizzato.
Esempio di output per un wrapper sprintf
:
{"pattern":"%99999999s"}
{"pattern":"AAAAAAAA....<1024>....%n"}
Empiricamente, questo riduce il tempo fino al crash di oltre 2× su obiettivi reali.
5. Strategie di Patching Guidate dall'AI
5.1 Super Patches
Chiedi al modello di raggruppare le firme di crash e proporre una singola patch che rimuova la causa radice comune. Invia una volta, risolvi diversi bug → meno penalità di accuratezza in ambienti in cui ogni patch errata costa punti.
Schema del prompt:
Here are 10 stack traces + file snippets. Identify the shared mistake and generate a unified diff fixing all occurrences.
5.2 Rapporto di Patch Speculativi
Implementa una coda in cui le patch convalidate da PoV confermate e le patch speculative (senza PoV) sono alternate in un rapporto 1:N regolato dalle regole di punteggio (ad es. 2 speculative : 1 confermata). Un modello di costo monitora le penalità rispetto ai punti e si auto-regola su N.
Mettere Tutto Insieme
Un CRS (Cyber Reasoning System) end-to-end può collegare i componenti in questo modo:
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]
Riferimenti
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.