
A benchmark for LLM-driven bug discovery: 77 challenges across 43 open-source projects (C/C++/Java).
Un benchmark per la riproduzione di vulnerabilità guidata da LLM su 77 bug zero-day reali in 43 progetti open-source (C / C++ / Java).
Ogni sfida fornisce all'agente solo l'harness di fuzzing (il target) e il sorgente del progetto alla revisione vulnerabile — nessuna patch, nessun commit di fix, nessuna riga target. L'agente deve scoprire un input che riattivi un fault sotto il sanitizer. Ogni valutazione è deterministica (nessun LLM-as-judge) e avviene in-image e offline: il candidato viene eseguito attraverso l'harness ufficiale instrumentato con sanitizer integrato nel container della sfida, e l'esecuzione viene valutata in base ai crash distinti che l'agente ha innescato. Nulla lascia la macchina e nessun servizio deve essere attivo.
| Sfide | Progetti | Linguaggi | Valutatore |
|---|---|---|---|
| 77 end-to-end | 43 | C · C++ · Java | deterministico — in-image, offline |
Nulla nelle immagini o in questo repository rivela quale sia il bug — le sfide
sono denominate con alias neutri (<progetto>-NN, es. avro-03), e la chiave
di risposta (PoC, fault atteso, build corretta) non è in nessuno dei due: resta
al manutentore.
Sfoglia tutte le 77: tools/sealed/CHALLENGES.md.
git clone https://github.com/fuzzingbrain/FuzzingBrain-Bench
cd FuzzingBrain-Bench
python3 -m venv .venv && source .venv/bin/activate # consigliato (e richiesto su
# Debian/Ubuntu, PEP 668)
pip install -e . # richiede Python ≥ 3.10 e Docker
# inserisci le tue chiavi modello in ./.env — caricato automaticamente a ogni esecuzione, nessun export necessario
cat > .env <<'EOF'
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=...
DEEPSEEK_API_KEY=sk-...
EOF
fb-bench list # le 77 sfide (per alias)
fb-bench models # modelli supportati + quali chiavi sono caricate
(./.env viene letto automaticamente; funziona anche un semplice export ANTHROPIC_API_KEY=....)
Esegui di nuovo
source .venv/bin/activatein ogni nuova shell. Oppure salta il venv conpip install --break-system-packages -e .(sconsigliato).
fb-bench run scarica l'immagine pubblica della sfida, guida il loop dell'agente
sull'host (chiamando la tua API modello) e valuta ogni candidato all'interno di quell'immagine —
nessuna rete, nulla da raggiungere. Servono solo Docker + la tua chiave modello, e
un'esecuzione valuta i crash distinti trovati dall'agente — l'identità di un crash è il
suo tipo di fault del sanitizer più i suoi stack frame principali, quindi lo stesso fault
raggiunto venti volte conta una sola volta.
Il
--arm apipredefinito non richiede altro che quanto sopra. I backend--arm codexe--arm claudecoderichiedono CLI del fornitore extra — opzionali, installati separatamente (mai parte dipip install -e .); vedi §4.
# Famiglia Claude (haiku è il più economico/veloce; sostituisci con opus/sonnet per run più difficili)
fb-bench run avro-03 --model claude-haiku-4-5
# Famiglia GPT
fb-bench run avro-03 --model gpt-5.5
# Famiglia Gemini
fb-bench run avro-03 --model gemini-3.1-pro-preview
# Famiglia DeepSeek (endpoint compatibile OpenAI; richiede DEEPSEEK_API_KEY)
fb-bench run avro-03 --model deepseek-v4-flash
Modelli: claude-haiku-4-5 · claude-sonnet-4-6 · claude-opus-4-8 ·
gpt-5.5 · gpt-5.4 · gpt-5 · gemini-3.1-pro-preview · gemini-2.5-flash ·
deepseek-v4-pro · deepseek-v4-flash
(qualsiasi id del catalogo funziona tramite --model; vedi fb-bench models).
fb-bench run accetta un bug o molti, un modello o molti. Un singolo run è solo una
matrice di dimensione uno, quindi non esiste un comando "sweep" separato:
# run completo consigliato: un modello su tutto il corpus, output nominato, PoC
# preservati (predefinito) per ispezione successiva. L'agente continua a cercare oltre
# il suo primo crash a meno che non passi --stop-on-crash
fb-bench run all --model claude-haiku-4-5 --output run1 --max-turns 100
# la rosa cross-modello curata, tutte le sfide, 4 celle in parallelo
fb-bench run all --model default-lineup --output sweep1 --jobs 4
# un paio di bug, 3 campioni ciascuno
fb-bench run avro-03,jq-01 --model gpt-5.5 --samples 3 --output probe
# ristampa solo la leaderboard da un run esistente
fb-bench run all --model claude-haiku-4-5 --output run1 --report-only
<bugs> è un alias, una lista separata da virgole, o all; --model è un id, una lista
separata da virgole, default-lineup, o all. I risultati finiscono in output/<nome>/<bug>/<modello>/seed-N/
(score.json, episode.jsonl, transcript.jsonl, cost.json, traj.md distillato);
una leaderboard viene stampata alla fine. --output accetta un nome semplice
(annidato sotto output/) o un percorso (usato così com'è). Ogni run ha la sua
cartella: ometti --output e finisce in output/run_<timestamp>; nomina una cartella
che esiste già e un nuovo run crea <nome>_<timestamp> invece di riprendere al suo
interno — quindi due run non condividono mai i risultati (--report-only è l'unico
lettore, che apre una cartella sul posto).
run, scegli il backend con --armI tre backend agente condividono un unico punto di ingresso. --arm seleziona quale
guida la sfida; tutto il resto (<bugs>, --jobs, --samples, --output,
la cartella per-run, la leaderboard) è identico tra gli arm.
fb-bench run avro-03 --model gpt-5.5 # --arm api (predefinito): modello del fornitore
fb-bench run avro-03 --arm codex # CLI OpenAI codex (predefinito gpt-5.5)
fb-bench run avro-03 --arm claudecode --model sonnet --auth sub # CLI Claude Code
fb-bench run all --arm codex --jobs 4 # intero corpus, in batch
--arm codex guida codex exec di OpenAI tramite il server MCP del bench.
--model imposta il modello codex (predefinito gpt-5.5), fissato tramite il suo config.toml.--arm claudecode guida la CLI Claude Code. --model sceglie il modello
claude (sonnet/opus/haiku).Entrambi gli arm del fornitore accettano --auth {api,sub}: api = la chiave API del
fornitore (OPENAI_API_KEY / ANTHROPIC_API_KEY, pay-go, nessun throttle), sub = un
accesso con abbonamento (codex: un piano ChatGPT Plus/Pro/Business/Edu/Enterprise;
claudecode: OAuth claude.ai). Il predefinito è auto — preferisci api quando la chiave API
è presente, altrimenti ripiega su sub.
Questi sono extra opzionali e non vengono installati da pip install -e ..
Il --arm api predefinito non ne ha mai bisogno. Installa solo la CLI dell'arm che intendi
eseguire (entrambe richiedono Node):
# --arm codex → CLI OpenAI Codex. Autenticati una volta, in base al --auth che usi:
npm install -g @openai/codex
# --auth api (predefinito quando OPENAI_API_KEY è impostata):
printenv OPENAI_API_KEY | codex login --with-api-key
# --auth sub (richiede un piano ChatGPT Plus/Pro/Business/Edu/Enterprise; un account
# ChatGPT gratuito non può usare i modelli codex):
codex login # accedi con il tuo piano ChatGPT
# --arm claudecode → CLI Claude Code.
npm install -g @anthropic-ai/claude-code
# --auth api (predefinito quando ANTHROPIC_API_KEY è impostata): nulla da fare
# --auth sub: login OAuth claude.ai una tantum
claude