Candidate
Static-analysis hypothesis
Request-derived input reaches the query builder.
Illustrative preview · no supplied marker accepted · no in-memory issue eligibility
No pull-request finding comment. No merge decision from Deton.
Inspect the proof boundary.
For AppSec and engineering reviewers, Deton maps supplied records to PR output without claiming live customer execution.
github.invalid/acme/payments
Add user search#482
Open
src/routes/users.ts
- db.query('select * from users where name = $1', [q])+ db.query(`select * from users where name = ${q}`)
detonbotillustrative comment preview
Deton confirmed SQL injection in changed code
Code: src/routes/users.ts:48-52
SQL injection confirmed by a deterministic control/treatment sentinel observation in the isolated fixture (CWE-89).
CVSS 4.0: not scored. Missing evidence for AV, AC, AT, PR, UI, VC, VI, VA, SC, SI, SA. This synthetic fixture does not establish deployment exposure or impact.
Propose a fix: Use parameterized queries, ORM-safe APIs, and allowlisted dynamic clauses.
Illustrative confirmed-state preview
github.invalid/acme/reporting
Add ping route#219
Open
src/routes/ping.ts
- execFile('ping', ['-c', '1', host])+ exec(`ping -c 1 ${host}`)
detonbotillustrative comment preview
Deton confirmed command injection in changed code
Code: src/routes/ping.ts:31-34
command injection confirmed by a deterministic benign command marker observation in the isolated fixture (CWE-78).
CVSS 4.0: not scored. Missing evidence for AV, AC, AT, PR, UI, VC, VI, VA, SC, SI, SA. This synthetic fixture does not establish deployment exposure or impact.
Propose a fix: Avoid shell execution, pass argv arrays, and allowlist command names and arguments.
Illustrative confirmed-state preview
github.invalid/acme/billing
Filter invoices by status#77
Open
src/routes/invoices.ts
- const q = 'select * from invoices'+ const q = `select * from invoices where status = ${status}`
Illustrative payload with no finding comment
Looks like the same pattern — a value interpolated into a query.
Illustrative supplied-record non-observation: this state is inconclusive, not safe or a false positive, and no finding payload is prepared.
Inconclusive preview
Decision rule
A suspicious line remains a hypothesis. In this illustrative preview, the pure evaluator reads a supplied record whose deterministic field is a schema enum value.
const filter = `name = '${req.query.q}'`;Candidate
Request-derived input reaches the query builder.
Illustrative preview · no supplied marker accepted · no in-memory issue eligibility
No pull-request finding comment. No merge decision from Deton.
What Deton adds
Observation
Illustrative supplied-record value: the deterministic oracle observed its expected effect; raw markers are withheld.
Replay
Prospective replay instruction for the supplied record.
Illustrative merge-state preview
Hand-authored UI state only; confirmed findings are advisory and Deton does not block merge.
Eligible issue preview
In this illustrative preview, the pure evaluator accepted the supplied record and the builder may construct an in-memory issue value.
Eligible for an in-memory issue value · no delivery or publication occurred
Illustrative code line, not a live customer run. Production runs use an exact GitHub commit archive, signed storage, and an isolated runner; unsupported recipes remain non-publishable.
A concise, formatter-derived advisory inside a hand-authored pull-request preview.
Showing an illustrative supplied-record confirmed-state payload: the formatter would prepare an advisory check and a replayable finding comment. No delivery occurred.
Illustrative synthetic fixture. The check and advisory text use the production formatter, but the request, observations, logs, and signature were authored for this preview; no target or runner was executed.
Add user search#482Open
maya-b wants to merge 3 commits into main from feat/invite-lookup
Illustrative advisory success preview; Deton does not block merge.
Confirmed security finding: review and fix recommended. No check was posted.
+added: const filter = `name = '${req.query.q}'`;+added: const rows = await db.query(+added: `select * from users where ${filter}`
@@ -44,9 +44,12 @@ export async function searchUsers(req, res) {-removed: const rows = await db.query(-removed: 'select * from users where name = $1', [req.query.q]-removed: );+added: const filter = `name = '${req.query.q}'`;+added: const rows = await db.query(+added: `select * from users where ${filter}`+added: );
@@ -44,9 +44,12 @@ export async function searchUsers(req, res) {-removed: const rows = await db.query(-removed: 'select * from users where name = $1', [req.query.q]-removed: );+added: const filter = `name = '${req.query.q}'`;+added: const rows = await db.query(+added: `select * from users where ${filter}`+added: );
Code: src/routes/users.ts:48-52
Illustrative revision link · disabledgithub.invalid/acme/payments/blob/0123456789abcdef0123456789abcdef01234567/src/routes/users.ts#L48-L52
SQL injection confirmed by a deterministic control/treatment sentinel observation in the isolated fixture (CWE-89).
Attacker-controlled input can alter a database query in the sandboxed fixture.
CVSS 4.0: not scored. Missing evidence for AV, AC, AT, PR, UI, VC, VI, VA, SC, SI, SA. This synthetic fixture does not establish deployment exposure or impact.
Illustrative isolated fixture; this preview did not run a target.
- Use a local synthetic users fixture with a known sentinel row.
- baseline: GET /api/users/search q=nonexistent_user_test1234
- treatment-1: GET /api/users/search q=nonexistent_user_test1234' OR '1'='1
- treatment-2: GET /api/users/search q=x' UNION SELECT id, username, sentinelMarker FROM users WHERE username='deton_sentinel' --
Expected: The treatment reaches the sentinel row while the control does not.
Retest: replay the same requests after the fix; Deton replays the seeded oracle and confirms the SQL oracle no longer fires.
- baseline: marker absent
- treatment-1: seeded marker observed
- treatment-2: seeded marker observed
Observation captured 2026-09-26T00:00:00.000Z · validator illustrative-only-not-runner-evidence · 2 treatment replay(s)
Runner request recipe version: illustrative-sqli-v1 · PR head record: 0123456789abcdef0123456789abcdef01234567
Use parameterized queries, ORM-safe APIs, and allowlisted dynamic clauses.
Bad fix warning: Do not escape strings manually or concatenate allowlist checks after the query is built.
Add user search#482Open
maya-b wants to merge 3 commits into main from feat/invite-lookup
Illustrative neutral-check preview; no checks executed.
No finding comment prepared; no external action completed.
Illustrative supplied-record inconclusive stateIllustrative supplied-record preview: the formatter would prepare a summary check, not a finding comment. No proof or publication is claimed, and no delivery occurred.
This is an example of the advisory format, including reproduction steps and CVSS 4.0 left unscored. Its proof package is not captured runner evidence and no check or comment was delivered to GitHub.
Current source boundary
Only supplied records accepted as confirmed are eligible for formatting. Other outcomes are not proof of a vulnerability or delivery.
The bundled fixture and exact-revision archives with a supported deton.json can boot in the isolated runner.
Illustrative supplied-record setup · not a live install
GitHub App · acme
The public walkthrough uses a bundled recipe. Production GitHub runs stage an exact-revision archive and resolve a supported deton.json recipe inside the isolated runner.
installation_performed=false
illustrative supplied-record preview · no live customer execution
Illustrative flow preview · an isolated runner would boot a reserved target ▸ illustrative supplied-record preview · bundled recipe would resolve ▸ illustrative supplied-record preview · target endpoint would become available ▸ prospective supplied-record observation · a runner would probe bounded responses ▸ illustrative supplied-record marker preview · no live observation authenticated
✓ illustrative supplied-record confirmed-state preview · no live execution or delivery
✓Illustrative advisory success preview; Deton does not block merge.
Code: src/routes/users.ts:48-52
SQL injection confirmed by a deterministic control/treatment sentinel observation in the isolated fixture (CWE-89).
CVSS 4.0: not scored. Missing evidence for AV, AC, AT, PR, UI, VC, VI, VA, SC, SI, SA. This synthetic fixture does not establish deployment exposure or impact.
A configured run can supply an isolated-runner observation to the evaluator. Non-proof states preserve uncertainty and never establish safety.
Possible SQL injection — needs review
src/routes/orders.ts:17 · medium
Potential command injection — unverified
src/api/search.ts:30 · high
Tainted input may reach query
src/lib/db/query.ts:43 · low
User input flows into exec call
src/routes/export.ts:56 · medium
Possible path traversal — low confidence
src/middleware/session.ts:69 · high
Hardcoded credential suspected
src/api/upload.ts:82 · medium
Unsanitized template interpolation
src/lib/shell.ts:95 · high
Potential XSS sink — needs manual check
src/routes/orders.ts:108 · low
Possible SQL injection — needs review
src/api/search.ts:121 · medium
Potential command injection — unverified
src/lib/db/query.ts:134 · high
Tainted input may reach query
src/routes/export.ts:147 · medium
User input flows into exec call
src/middleware/session.ts:160 · high
Possible path traversal — low confidence
src/api/upload.ts:173 · low
Hardcoded credential suspected
src/lib/shell.ts:186 · medium
Unsanitized template interpolation
src/routes/orders.ts:18 · high
Potential XSS sink — needs manual check
src/api/search.ts:31 · medium
Possible SQL injection — needs review
src/lib/db/query.ts:44 · high
Potential command injection — unverified
src/routes/export.ts:57 · low
Tainted input may reach query
src/middleware/session.ts:70 · medium
User input flows into exec call
src/api/upload.ts:83 · high
Possible path traversal — low confidence
src/lib/shell.ts:96 · medium
Hardcoded credential suspected
src/routes/orders.ts:109 · high
Unsanitized template interpolation
src/api/search.ts:122 · low
Potential XSS sink — needs manual check
src/lib/db/query.ts:135 · medium
Possible SQL injection — needs review
src/routes/export.ts:148 · high
Potential command injection — unverified
src/middleware/session.ts:161 · medium
Tainted input may reach query
src/api/upload.ts:174 · high
User input flows into exec call
src/lib/shell.ts:187 · low
Possible path traversal — low confidence
src/routes/orders.ts:19 · medium
Hardcoded credential suspected
src/api/search.ts:32 · high
Unsanitized template interpolation
src/lib/db/query.ts:45 · medium
Potential XSS sink — needs manual check
src/routes/export.ts:58 · high
Possible SQL injection — needs review
src/middleware/session.ts:71 · low
Potential command injection — unverified
src/api/upload.ts:84 · medium
Tainted input may reach query
src/lib/shell.ts:97 · high
User input flows into exec call
src/routes/orders.ts:110 · medium
Possible path traversal — low confidence
src/api/search.ts:123 · high
Hardcoded credential suspected
src/lib/db/query.ts:136 · low
Unsanitized template interpolation
src/routes/export.ts:149 · medium
Potential XSS sink — needs manual check
src/middleware/session.ts:162 · high
Possible SQL injection — needs review
src/api/upload.ts:175 · medium
Potential command injection — unverified
src/lib/shell.ts:188 · high
Tainted input may reach query
src/routes/orders.ts:20 · low
User input flows into exec call
src/api/search.ts:33 · medium
Possible path traversal — low confidence
src/lib/db/query.ts:46 · high
Hardcoded credential suspected
src/routes/export.ts:59 · medium
Unsanitized template interpolation
src/middleware/session.ts:72 · high
Candidate without an accepted supplied record
Illustrative candidate queue — not measured scan output.
Illustrative supplied-record confirmed preview
illustrative.invalid/payments · illustrative-pr
illustrative/path.ts:41
illustrative-marker
Hand-authored preview; not authenticated provenance or custody.
In the core contract, confirmed means the evaluator accepted an identity-matching supplied oracle record carrying the deterministic schema enum value. It does not authenticate live execution or establish independent custody.
Non-proof outcomes remain non-proof. The current scan path stores candidate verdict fields, not validation-attempt or evidence-artifact rows.
The control plane stages an exact GitHub commit archive behind a short-lived, hash-bound reference. Only the isolated runner fetches and boots it.
Production scan code does not write validation attempts, findings, or proof artifacts. The details shown here are illustrative.
Runnable customer inputs require a supported recipe and configured GitHub, storage, and sandbox providers. Uncovered inputs create no eligible issue.
What the bundled recipe runs, what the configured customer path runs, and where execution fails closed.
GitHub App
Configured runs can update the exact pull-request head; a delivery failure stays visible.
Pull-request check
Configured runs can post a GitHub check on the exact PR head. A delivery failure stays visible and never changes the proof verdict.
Configured boundary
The bundled recipe boots a zero-dependency Node ESM process through node:http.
server.mjs → node:http → /health readinessThe bundled recipe uses a synthetic in-memory store; it starts no PostgreSQL or other database service.
db.mjs → synthetic usersTable array → deterministic sentinelNot in the bundled recipe
TypeScript
TypeScript is not part of the bootable bundled recipe; its files are plain JavaScript ESM (.mjs).
Express
Express is not part of the bootable bundled recipe; the HTTP server uses node:http directly.
Next.js
Next.js is not part of the bundled recipe. Customer runs require a supported deton.json recipe after exact-revision transport and defensive extraction.
The runner accepts the bundled fixture and supported manifests from hash-verified exact-revision archives. Unsupported recipes fail visibly.
A configured deployment fetches the exact GitHub commit archive, stages it in signed storage, and boots supported recipes in the isolated runner. Unsupported recipes fail visibly.
No. Unsupported, inconclusive, stale, error, and no-result states are not proof of safety. They remain non-publishable outcomes.
The candidate remains a non-finding, with no in-memory issue eligibility, delivery, or publication. Its supplied state can still retain a review reason.
Yes, when GitHub, storage, and the sandbox worker are configured. Delivery failures stay visible, and only proof-gated results can be published.
Review the published data-processing documents for the deployment you use. This page states no retention or residency commitment.
See the pricing page for the tiers and amounts currently presented by this deployment.
Create an account to connect the configured GitHub App and inspect repository runs. A scan starts only from an authorized pull-request event.
Current source limit shown above · non-proof states stay non-findings.