
A benchmark for LLM-driven bug discovery: 77 challenges across 43 open-source projects (C/C++/Java).
Un benchmark para la reproducción de vulnerabilidades impulsada por LLM en 77 errores de día cero reales en 43 proyectos de código abierto (C / C++ / Java).
Cada desafío le da al agente solo el harness de fuzzing (el objetivo) y el código fuente del proyecto en la revisión vulnerable — sin parche, sin commit de corrección, sin línea objetivo. El agente debe descubrir una entrada que vuelva a disparar una falla bajo el sanitizador. Cada calificación es determinista (sin LLM como juez) y ocurre dentro de la imagen y sin conexión: el candidato se ejecuta a través del harness oficial instrumentado con sanitizador integrado en el contenedor del desafío, y la ejecución se puntúa por los fallos distintos que el agente haya disparado. Nada sale de la máquina y no es necesario que ningún servicio esté activo.
| Desafíos | Proyectos | Lenguajes | Calificador |
|---|---|---|---|
| 77 de extremo a extremo | 43 | C · C++ · Java | determinista — dentro de la imagen, sin conexión |
Nada en las imágenes ni en este repositorio revela qué es un error — los desafíos se nombran con un alias neutral (<proyecto>-NN, p. ej. avro-03), y la clave de respuestas (PoC, falla esperada, compilación corregida) no está en ninguno de los dos: permanece con el mantenedor.
Explora los 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 (y requerido en
# Debian/Ubuntu, PEP 668)
pip install -e . # requiere Python ≥ 3.10 y Docker
# pon tu(s) clave(s) de modelo en ./.env — se carga automáticamente en cada ejecución, no hace falta exportar
cat > .env <<'EOF'
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=...
DEEPSEEK_API_KEY=sk-...
EOF
fb-bench list # los 77 desafíos (por alias)
fb-bench models # modelos compatibles + qué claves están cargadas
(./.env se lee automáticamente; un simple export ANTHROPIC_API_KEY=... también funciona.)
Vuelve a ejecutar
source .venv/bin/activateen cada shell nueva. O sáltate el venv conpip install --break-system-packages -e .(no recomendado).
fb-bench run descarga la imagen pública del desafío, impulsa el bucle del agente en el host (llamando a tu API de modelo) y califica cada candidato dentro de esa imagen — sin red, nada que alcanzar. Solo se necesitan Docker y tu clave de modelo, y una ejecución puntúa los fallos distintos que el agente haya encontrado — la identidad de un fallo es su tipo de falla del sanitizador más sus marcos de pila superiores, así que la misma falla alcanzada veinte veces cuenta una sola.
El
--arm apipredeterminado no necesita nada más que lo anterior. Los backends--arm codexy--arm claudecodenecesitan CLIs de proveedor adicionales — opcionales, instalados por separado (nunca parte depip install -e .); consulta §4.
# Familia Claude (haiku es el más barato/rápido; cambia a opus/sonnet para ejecuciones más difíciles)
fb-bench run avro-03 --model claude-haiku-4-5
# Familia GPT
fb-bench run avro-03 --model gpt-5.5
# Familia Gemini
fb-bench run avro-03 --model gemini-3.1-pro-preview
# Familia DeepSeek (endpoint compatible con OpenAI; requiere 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
(cualquier id del catálogo funciona con --model; consulta fb-bench models).
fb-bench run acepta un error o muchos, un modelo o muchos. Una sola ejecución es solo una
matriz de tamaño uno, así que no hay un comando "sweep" separado:
# ejecución completa recomendada: un modelo sobre todo el corpus, salida nombrada, PoCs
# conservados (por defecto) para inspección posterior. El agente sigue buscando más allá de
# su primer fallo a menos que pases --stop-on-crash
fb-bench run all --model claude-haiku-4-5 --output run1 --max-turns 100
# la alineación curada de múltiples modelos, todos los desafíos, 4 celdas en paralelo
fb-bench run all --model default-lineup --output sweep1 --jobs 4
# un par de errores, 3 muestras cada uno
fb-bench run avro-03,jq-01 --model gpt-5.5 --samples 3 --output probe
# solo reimprime la tabla de clasificación de una ejecución existente
fb-bench run all --model claude-haiku-4-5 --output run1 --report-only
<bugs> es un alias, una lista separada por comas o all; --model es un id, una lista separada por comas,
default-lineup o all. Los resultados van a output/<nombre>/<error>/<modelo>/seed-N/
(score.json, episode.jsonl, transcript.jsonl, cost.json, traj.md destilado);
se imprime una tabla de clasificación al final. --output acepta un nombre simple
(anidado bajo output/) o una ruta (usada tal cual). Cada ejecución tiene su propia carpeta:
omite --output y va a output/run_<timestamp>; nombra una carpeta que ya exista
y una ejecución nueva se bifurca a <nombre>_<timestamp> en lugar de reanudarse en ella —
así dos ejecuciones nunca comparten resultados (--report-only es el único lector,
que abre una carpeta en su lugar).
run, elige el backend con --armLos tres backends de agente comparten una sola entrada. --arm selecciona cuál impulsa
el desafío; todo lo demás (<bugs>, --jobs, --samples, --output,
la carpeta por ejecución, la tabla de clasificación) es idéntico entre arms.
fb-bench run avro-03 --model gpt-5.5 # --arm api (predeterminado): modelo del proveedor
fb-bench run avro-03 --arm codex # CLI de OpenAI codex (gpt-5.5 por defecto)
fb-bench run avro-03 --arm claudecode --model sonnet --auth sub # CLI de Claude Code
fb-bench run all --arm codex --jobs 4 # corpus completo, por lotes
--arm codex impulsa codex exec de OpenAI sobre el servidor MCP del bench.
--model establece el modelo de codex (por defecto gpt-5.5), fijado a través de su config.toml.--arm claudecode impulsa la CLI de Claude Code. --model elige el modelo de claude
(sonnet/opus/haiku).Ambos arms de proveedor aceptan --auth {api,sub}: api = la clave API del proveedor
(OPENAI_API_KEY / ANTHROPIC_API_KEY, pago por uso, sin límite), sub = un
inicio de sesión de suscripción (codex: un plan de ChatGPT Plus/Pro/Business/Edu/Enterprise;
claudecode: OAuth de claude.ai). El predeterminado es auto — prefiere api cuando la clave API
está presente, si no, recurre a sub.
Estos son extras opcionales y no se instalan con pip install -e ..
El --arm api predeterminado nunca los necesita. Instala solo la CLI cuyo arm planees
ejecutar (ambas necesitan Node):
# --arm codex → CLI de OpenAI Codex. Autentícate una vez, acorde al --auth que uses:
npm install -g @openai/codex
# --auth api (predeterminado cuando OPENAI_API_KEY está configurada):
printenv OPENAI_API_KEY | codex login --with-api-key
# --auth sub (requiere un plan de ChatGPT Plus/Pro/Business/Edu/Enterprise; una cuenta
# gratuita de ChatGPT no puede usar los modelos de codex):
codex login # inicia sesión con tu plan de ChatGPT