
A benchmark for LLM-driven bug discovery: 77 challenges across 43 open-source projects (C/C++/Java).
Um benchmark para reprodução de vulnerabilidades orientada por LLM em 77 bugs reais de dia zero em 43 projetos de código aberto (C / C++ / Java).
Cada desafio dá ao agente apenas o fuzz harness (o alvo) e o código-fonte do projeto na revisão vulnerável — sem patch, sem commit de correção, sem linha alvo. O agente deve descobrir uma entrada que re-dispare uma falha sob o sanitizer. Cada nota é determinística (sem LLM-como-juiz) e acontece dentro da imagem e offline: o candidato passa pelo harness oficial instrumentado com sanitizer embutido no contêiner do desafio, e a execução é pontuada pelas falhas distintas que o agente disparou. Nada sai da máquina e nenhum serviço precisa estar ativo.
| Desafios | Projetos | Linguagens | Avaliador |
|---|---|---|---|
| 77 ponta a ponta | 43 | C · C++ · Java | determinístico — dentro da imagem, offline |
Nada nas imagens ou neste repositório revela o que é um bug — os desafios são
nomeados por alias neutro (<projeto>-NN, ex.: avro-03), e o gabarito
(PoC, falha esperada, build corrigido) não está em nenhum dos dois: fica com o
mantenedor. Veja todos os 77: tools/sealed/CHALLENGES.md.
git clone https://github.com/fuzzingbrain/FuzzingBrain-Bench
cd FuzzingBrain-Bench
python3 -m venv .venv && source .venv/bin/activate # recomendado (e obrigatório no
# Debian/Ubuntu, PEP 668)
pip install -e . # precisa de Python ≥ 3.10 e Docker
# coloque sua(s) chave(s) de modelo em ./.env — carregada automaticamente a cada execução, sem export
cat > .env <<'EOF'
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=...
DEEPSEEK_API_KEY=sk-...
EOF
fb-bench list # os 77 desafios (por alias)
fb-bench models # modelos suportados + quais chaves estão carregadas
(./.env é lido automaticamente; um simples export ANTHROPIC_API_KEY=... também funciona.)
Re-
source .venv/bin/activateem cada novo shell. Ou pule o venv compip install --break-system-packages -e .(não recomendado).
fb-bench run baixa a imagem pública do desafio, conduz o loop do agente no
host (chamando sua API de modelo) e avalia cada candidato dentro dessa imagem —
sem rede, nada para alcançar. Apenas Docker + sua chave de modelo são necessários, e
uma execução pontua as falhas distintas que o agente encontrou — a identidade de
uma falha é seu tipo de falha do sanitizer mais seus principais frames de pilha,
então a mesma falha atingida vinte vezes conta uma vez.
O padrão
--arm apinão precisa de nada além do acima. Os backends--arm codexe--arm claudecodeprecisam de CLIs de fornecedor extras — opcionais, instalados separadamente (nunca parte dopip install -e .); veja §4.
# Família Claude (haiku é o mais barato/rápido; troque por opus/sonnet para execuções mais difíceis)
fb-bench run avro-03 --model claude-haiku-4-5
# Família GPT
fb-bench run avro-03 --model gpt-5.5
# Família Gemini
fb-bench run avro-03 --model gemini-3.1-pro-preview
# Família DeepSeek (endpoint compatível com OpenAI; precisa de DEEPSEEK_API_KEY)
fb-bench run avro-03 --model deepseek-v4-flash
Modelos: 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
(qualquer id do catálogo funciona via --model; veja fb-bench models).
fb-bench run aceita um bug ou muitos, um modelo ou muitos. Uma única execução é
apenas uma matriz de tamanho um, então não há comando separado de "varredura":
# execução completa recomendada: um modelo sobre todo o corpus, saída nomeada, PoCs
# preservados (o padrão) para inspeção posterior. O agente continua caçando além de
# sua primeira falha a menos que você passe --stop-on-crash
fb-bench run all --model claude-haiku-4-5 --output run1 --max-turns 100
# a escalação padrão entre modelos, todos os desafios, 4 células em paralelo
fb-bench run all --model default-lineup --output sweep1 --jobs 4
# alguns bugs, 3 amostras cada
fb-bench run avro-03,jq-01 --model gpt-5.5 --samples 3 --output probe
# apenas reimprimir o leaderboard de uma execução existente
fb-bench run all --model claude-haiku-4-5 --output run1 --report-only
<bugs> é um alias, uma lista separada por vírgula ou all; --model é um id, uma lista
separada por vírgula, default-lineup ou all. Os resultados ficam em output/<nome>/<bug>/<modelo>/seed-N/
(score.json, episode.jsonl, transcript.jsonl, cost.json, traj.md
destilado); um leaderboard é impresso ao final. --output aceita um nome simples
(aninhado em output/) ou um caminho (usado como está). Cada execução tem sua própria
pasta: omita --output e ela cai em output/run_<timestamp>; nomeie uma pasta
que já existe e uma nova execução cria <nome>_<timestamp> em vez de
retomar dentro dela — então duas execuções nunca compartilham resultados (--report-only é o único
leitor, abrindo uma pasta no lugar).
run, escolha o backend com --armOs três backends de agente compartilham uma entrada. --arm seleciona qual deles
conduz o desafio; todo o resto (<bugs>, --jobs, --samples, --output,
a pasta por execução, o leaderboard) é idêntico entre os arms.
fb-bench run avro-03 --model gpt-5.5 # --arm api (padrão): modelo do provedor
fb-bench run avro-03 --arm codex # CLI codex da OpenAI (padrão 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 # corpus inteiro, em lote
--arm codex conduz o codex exec da OpenAI sobre o servidor MCP do bench.
--model define o modelo do codex (padrão gpt-5.5), fixado via seu config.toml.--arm claudecode conduz a CLI do Claude Code. --model escolhe o modelo
claude (sonnet/opus/haiku).Ambos os arms de fornecedor aceitam --auth {api,sub}: api = a chave de API do
provedor (OPENAI_API_KEY / ANTHROPIC_API_KEY, pay-go, sem throttle), sub = um
login de assinatura (codex: um plano ChatGPT Plus/Pro/Business/Edu/Enterprise;
claudecode: OAuth do claude.ai). O padrão é auto — prefira api quando a chave de API
estiver presente, caso contrário caia para sub.
Estes são extras opcionais e não são instalados por pip install -e ..
O padrão --arm api nunca precisa deles. Instale apenas a CLI cujo arm você planeja
executar (ambas precisam de Node):
# --arm codex → CLI Codex da OpenAI. Autentique uma vez, combinando com o --auth que você usa:
npm install -g @openai/codex
# --auth api (padrão quando OPENAI_API_KEY está definida):
printenv OPENAI_API_KEY | codex login --with-api-key
# --auth sub (precisa de um plano ChatGPT Plus/Pro/Business/Edu/Enterprise; uma conta
# gratuita do ChatGPT não pode usar os modelos codex):
codex login # entre com seu plano ChatGPT
# --arm claudecode → CLI Claude Code.
npm install -g @anthropic-ai/claude-code
# --auth api (padrão quando ANTHROPIC_API_KEY está definida): nada a fazer
# --auth sub: login OAuth único no claude.ai
claude