For tool builders
A benchmark with no cheat sheet inside
Point a tool at the shop and it has to find the flaws itself. Score what it finds against a held-back key, and a run becomes a number instead of an opinion.
No answer key inside the target
This is what makes the score mean something. The vulnerable app ships with no list of its own flaws: no manifest in the code, no labels, no solutions. A scanner or an AI agent has to actually find things, not read them off a cheat sheet in the repo.
The answer key is held back. For each exercise it records the exact spot, the class, and a proof that fires it, roughly like this:
{
"id": "FF-001",
"cwe": "CWE-89",
"endpoint": "GET /api/sweets/search",
"parameter": "q",
"proof": "' UNION SELECT email,password_hash FROM customers-- "
} Score a run
Run your tool against the shop, then line its findings up against the held-back key: found, missed, or false positive. The human write-up for each exercise lives here on the site, so you can check your work once you are done.
The rules that keep it honest
- The key is fixed before any tool runs, and never edited to flatter a score.
- Misses are reported next to finds. A tool that catches 13 of 15 and says so is worth more than one that claims 15.
- The target carries no hints, so a good score reflects the tool, not the answer key leaking into the code.
FreeFungi is vendor-neutral. Benchmark posts here report every tool the same way, finds and misses alike.