Detection benchmark
A self-scan against our own product tells you we test ourselves; it doesn't tell you the engine works on applications we didn't build. So we run Aegis against public, intentionally-vulnerable apps and publish exactly what happened — including what it missed. It's reproducible: the harness is in our repo and you can run it yourself.
First published target below is OWASP Juice Shop. crAPI, WebGoat and a custom multi-tenant app follow — all runnable from the same harness.
Target: OWASP Juice Shop
The widely-used, deliberately-insecure OWASP web app. Run on 2026-08-18 against the current image. Juice Shop is an Angular single-page app, so — as a real user would — we supplied its documented REST API surface (Aegis supports OpenAPI import for exactly this; see Known limits). Only the non-destructive, read-only active suite was run.
| Metric | Result |
|---|---|
| API endpoints tested | 4 (seeded REST surface) |
| Requests sent | 86 (62 active probes) |
| Wall-clock | 3.8 seconds |
| Findings | 14 — 1 critical, 3 high, 2 medium, 6 low, 2 info |
| False positives | 0 |
What it found (all true positives)
| Finding | Severity | Class |
|---|---|---|
| Boolean-based blind SQL injection (repeatable true/false differential) | Critical | CWE-89 |
Exposed .env file (×3) | High | CWE-538 |
| Exposed config file | Medium | CWE-538 |
| Missing Content-Security-Policy header | Medium | — |
| Wildcard CORS policy (×4 endpoints) | Low | CWE-942 |
| Missing Referrer-Policy / Permissions-Policy | Low | — |
| Server advertises state-changing HTTP methods | Info | CWE-749 |
The headline is the critical SQL injection: Juice Shop's search API is injectable but returns JSON data, not a SQL error, so an error-based check would miss it. Aegis's boolean detector sends a matched always-true / always-false pair and confirms a repeatable, condition-driven change in the response (here: a true condition returned ~21,500 bytes of results versus ~30 for false) that a benign control input did not reproduce.
False positives: zero
Every finding is real. Notably, on a non-injectable probe the SQL-injection check produced a clean empty result and correctly stayed silent — low false-positive behaviour matters as much as detection.
Known limits (stated plainly)
- Single-page apps: Aegis's crawler reads server-returned HTML; it does not execute JavaScript, so client-rendered routes aren't auto-discovered. For SPAs and APIs, import your OpenAPI spec (supported in-product) or point Aegis at the API surface — then the full active suite runs against it, exactly as in this benchmark.
- One target so far. This is Juice Shop only. It is not a claim about detection rates across all apps; crAPI, WebGoat and a custom multi-tenant app are next, published the same way.
- Not every class applies to every app. Juice Shop exercised SQLi, headers, CORS and exposed files here; other targets exercise IDOR/BOLA, SSRF, XXE and business-logic differently.
Reproduce it
The harness (tools/benchmark.py) runs Aegis's real plugins through a real scan runtime and emits
the metrics above as JSON — no invented numbers. In short:
docker run -d --name juiceshop -p 3000:3000 bkimminich/juice-shop |
docker compose run --rm --network host -e TARGET_URL=http://localhost:3000 backend python /app/tools/benchmark.py |
Full instructions and target list are in tools/BENCHMARK.md. See also our
self-test (we test ourselves) and the full test catalogue.