-
-
Mélodie at a glance: try it, built on, measured, shipped.
-
The live app: run #1, PROVEN, with the canary planted for this run.
-
Same input, run again: a different canary. Not a recording.
-
A harmless input returns NOT PROVEN: no false alarm.
-
How a verdict is made: the sealed replay decides, never the model.
-
/eval: Nemotron 3 Super measured, including its limit (GitPython 0/4).
-
Plant a secret, replay the exploit, check whether it leaked.
-
What it is, and isn't.
-
Scanners say "vulnerable". Is it exploitable in your app?
Inspiration
Security teams drown in scanner findings. A scanner matches package versions; it never runs the exploit, so "critical" often means "maybe". In CTEM terms, the hard step is validation: proving which findings actually fire in your code, so you fix what's proven first. Meanwhile, LLMs are increasingly asked to judge exploitability, and a model's confidence is not evidence. I wanted a verdict that nobody, including the model, can fake.
What it does
Mélodie is a runtime proof harness for a known finding in a supported vulnerability class. You submit an exploit input; Mélodie replays it in a sealed Nebius Token Factory Sandbox against a fresh database that holds a freshly planted random secret (a canary):
- canary leaks into the output → PROVEN
- canary stays put → NOT PROVEN (never "safe")
The canary is new on every run, so a PROVEN can't come from a recording or a cached answer, and you can type your own payload to check. The live demo runs the ormar SQL injection (CVE-2026-26198): the example payload is PROVEN, a harmless input (price) is NOT PROVEN, and every verdict shows the 6 real steps it took.
Scope, stated plainly: exploit validation for a known finding in a supported class. Not discovery, not a scanner, not arbitrary-CVE coverage.
How I built it
- Nebius Token Factory Sandboxes (ConTree): every live verdict is a real, disposable microVM run from a pre-baked image (
python:3.12-slim+ ormar). Pipeline: pre-flight gates → boot sandbox + fresh DB → harden SQLite → plant canary + deliver input as a file → replay → observe the canary in stdout. The input is delivered as data, never shell-interpolated; SQLite extension loading and ATTACH are disabled; 25 s budget per run. - NVIDIA Nemotron 3 Super via the Token Factory API: the agent I measured. Given a vulnerability claim and a sandbox, it locates the flaw and proposes exploit payloads; the same sealed replay judges every proposal. Nemotron proposes. The replay judges. Super for the agent loop; Nano, Lightning and Ultra only for comparison, with every call's tokens (including reasoning tokens) cost-logged.
- Tavily: the agent's advisory tool. CVE lookups are pinned to authoritative sources (GitHub Advisories, NVD, OSV, cve.org) twice over: Tavily's
include_domainsin restrict mode, then our own URL allowlist. The agent gets at most 2 lookups per run, and every source's URL, title and relevance score is recorded by our code, not by the model. Tavily grounds context; it is never a verdict input. That separation is the point: retrieval informs, execution decides. - Serving: one AWS Lambda behind a public Function URL serves the React/TypeScript UI and the model-free
/api/verify; secrets live in SSM + KMS. The live path makes zero model or Tavily calls, so it costs essentially nothing to keep online through judging. - Release engineering: CI (lint, type-check, 40 Python checks, 23 Vitest tests, build), a daily black-box check of the live URL (example → PROVEN,
price→ NOT PROVEN, fresh canary, build identity), build identity in the UI footer, and immutable GitHub releases. The demo servesv1.0.2 · acb81cf.
Measured honestly
29 valid receipts (2 excluded and disclosed), Wilson 95% intervals, about 0.43 USD in total (217 Nemotron calls ≈ 0.21 USD + 28 Tavily credits ≈ 0.22 USD). Reproducible from a fresh clone with python -m prover.eval_report, and visible in the demo via /eval.
- Harness discrimination: the patched version returns NOT PROVEN on all 4 targets (1/1 each).
- Nemotron, unaided: Starlette path traversal located 4/5 and weaponised 4/5; GitPython command injection weaponised 0/4. The limit is shown, not hidden.
- Fix verification: FIX VERIFIED on Starlette, GitPython and ormar.
Challenges I ran into
- Making a verifier credible, not just able to say PROVEN. I added a model-free matched negative control: the same exploit against the fixed version must return NOT PROVEN, or the harness is broken.
- Model wording vs evidence. On a patched target, Nemotron concluded the code "effectively prevents" the attack, a universal safety claim no run can support. So the product never says "safe".
- No client-side timeout in the sandbox SDK: a slow image bake looked exactly like a hang. I wrapped every run in a wall-clock budget (reported in my feedback).
- Keeping a public, no-login demo cheap and safe: model-free live path, input caps, rate limits, a concurrency ceiling and a budget alert.
Accomplishments that I am proud of
- A live, public proof that anyone can re-run with their own payload, getting a new canary every time.
- An honest evaluation that publishes its own failure (GitPython 0/4) next to its successes.
- A sealed release: a fresh-clone audit reproduces the eval and the tests, gitleaks finds no secrets in the history, and the demo is checked daily.
What I learned
Model confidence is not evidence; execution is. Small-n results need intervals, not percentages. And a second run finds what a first run can't: the two-run witness caught a display bug before release.
What's next for Mélodie
More live classes (path traversal and command injection already work as recorded replays), persisted receipts for every live run, a CI gate that blocks a merge only when a finding is PROVEN, and the existing MCP server (verify_proof) so coding agents can ask the harness instead of guessing.
Fresh project
Built solo during the Submission Period. The first commit (30 Sep 2026) is the learning phase (kept in archive/); the product was built 5–29 Oct 2026. Nothing pre-existing is reused beyond open-source dependencies and the third-party libraries used as vulnerable targets (Starlette, GitPython, ormar, pinned and unmodified).
Built With
- aws-lambda
- aws-sam
- contree
- github-actions
- nebius-token-factory
- nvidia-nemotron
- python
- react
- sqlite
- tavily
- typescript
- vite
Log in or sign up for Devpost to join the conversation.