Skip to content
  • DETON
  • Pricing
  • Sign in
  • Sign up

Inspect the proof boundary.

Inspect the candidate-to-finding boundary.

For AppSec and engineering reviewers, Deton maps supplied records to PR output without claiming live customer execution.

Create an accountInspect the proof boundary
  • 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}`)
    Deton proof gateIllustrative supplied-record formatter preview (no execution or delivery) · Deton confirmed security finding (1, advisory)

    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}`)
    Deton proof gateIllustrative supplied-record formatter preview (no execution or delivery) · Deton confirmed security finding (1, advisory)

    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}`
    Deton proof gateIllustrative supplied-record formatter preview (no execution or delivery) · Deton completed with summary-only outcomes

    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

Synthetic pull-request fixtures. Check titles and advisory text come from Deton’s production formatter; requests, observations and logs are hand-authored examples, not captured runner evidence. No target was executed and nothing was delivered to GitHub.

Choose the evidence question you need to answer.

Exploit-validation contractSynthetic proof-flow demoCurrent availability boundaries

Decision rule

A candidate is not a verdict.

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.

Same changed line
  const filter = `name = '${req.query.q}'`;

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.

What Deton adds

  1. 01

    Observation

    Illustrative supplied-record value: the deterministic oracle observed its expected effect; raw markers are withheld.

  2. 02

    Replay

    Prospective replay instruction for the supplied record.

  3. 03

    Illustrative merge-state preview

    Hand-authored UI state only; confirmed findings are advisory and Deton does not block merge.

Eligible issue preview

Illustrative supplied-record state accepted as confirmed

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.

How the illustrative pull-request output is shaped.

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.

github.invalid/acme/payments/pull/482

Add user search#482Open

maya-b wants to merge 3 commits into main from feat/invite-lookup

  • Conversation2
  • Commits3
  • Checks4
  • Files changed7
  • passedbuildIllustrative status preview · no check executed
  • passedlintIllustrative status preview · no check executed
  • passedunitIllustrative status preview · no check executed
  • passedDeton proof gateIllustrative supplied-record formatter preview (no execution or delivery) · Deton confirmed security finding (1, advisory)Details

Illustrative advisory success preview; Deton does not block merge.

Confirmed security finding: review and fix recommended. No check was posted.

src/routes/users.ts
+added:   const filter = `name = '${req.query.q}'`;+added:   const rows = await db.query(+added:     `select * from users where ${filter}`
▸View full diff
@@ -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:   );
src/routes/users.ts
@@ -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:   );
Dillustrative-botillustrative comment preview

Deton confirmed SQL injection in changed code

Code: src/routes/users.ts:48-52

Illustrative revision link · disabledgithub.invalid/acme/payments/blob/0123456789abcdef0123456789abcdef01234567/src/routes/users.ts#L48-L52

Why confirmed

SQL injection confirmed by a deterministic control/treatment sentinel observation in the isolated fixture (CWE-89).

Impact

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.

Reproduce

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.

Proof logs

- 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

Propose a fix

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.

github.invalid/acme/payments/pull/482

Add user search#482Open

maya-b wants to merge 3 commits into main from feat/invite-lookup

  • Conversation1
  • Commits3
  • Checks4
  • Files changed7
  • passedbuildIllustrative status preview · no check executed
  • passedlintIllustrative status preview · no check executed
  • passedunitIllustrative status preview · no check executed
  • neutralDeton proof gateIllustrative supplied-record formatter preview (no execution or delivery) · Deton completed with summary-only outcomesDetails

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

Know what can run before relying on a verdict.

Only supplied records accepted as confirmed are eligible for formatting. Other outcomes are not proof of a vulnerability or delivery.

Bootable source paths today
The bundled recipe boots directly. The runner can also read a valid deton.json from an already-extracted absolute local source directory, but the product has no transport that creates one from a customer pull request.
Customer GitHub source references
The public walkthrough is synthetic. Configured GitHub runs fetch an exact commit archive and hand only a signed, hash-bound source reference to the isolated runner.

A supplied record becomes eligible for an in-memory issue only after the pure evaluator accepts it.

The bundled fixture and exact-revision archives with a supported deton.json can boot in the isolated runner.

github.invalid/acme/payments/pull/482

Illustrative supplied-record setup · not a live install

GitHub App · acme

Install Deton

Read: metadata, pull requestsWrite: checks, comments

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

  • SQLI-01src/routes/users.tssupplied-record confirmed preview
  • CMDI-02src/jobs/thumbnailer.tssupplied-record in-progress preview
  • SQLI-03src/db/reports.tssupplied-record queued preview
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
  • ✓buildIllustrative status preview · no check executed
  • ✓lintIllustrative status preview · no check executed
  • ✓unitIllustrative status preview · no check executed
  • ✓Deton proof gateIllustrative supplied-record confirmed-state payload · no delivery

✓Illustrative advisory success preview; Deton does not block merge.

illustrative-botbotillustrative timestamp

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.

Proof states are not safety guarantees.

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

SQL injectionIllustrative supplied-record confirmed preview

illustrative.invalid/payments · illustrative-pr

illustrative/path.ts:41

illustrative-marker

Hand-authored preview; not authenticated provenance or custody.

  • Confirmed requires an accepted supplied record

    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.

  • Unproven stays unproven

    Non-proof outcomes remain non-proof. The current scan path stores candidate verdict fields, not validation-attempt or evidence-artifact rows.

  • The source boundary is explicit

    The control plane stages an exact GitHub commit archive behind a short-lived, hash-bound reference. Only the isolated runner fetches and boots it.

  • No captured artifact in the product path

    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.

Current runtime and delivery boundaries.

What the bundled recipe runs, what the configured customer path runs, and where execution fails closed.

Delivery

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

  • GitLab
  • Bitbucket

Runner boundary

The bundled recipe boots a zero-dependency Node ESM process through node:http.

server.mjs → node:http → /health readiness

The bundled recipe uses a synthetic in-memory store; it starts no PostgreSQL or other database service.

db.mjs → synthetic usersTable array → deterministic sentinel

Not in the bundled recipe

  • TS

    TypeScript

    TypeScript is not part of the bootable bundled recipe; its files are plain JavaScript ESM (.mjs).

  • ex

    Express

    Express is not part of the bootable bundled recipe; the HTTP server uses node:http directly.

  • N

    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.

The questions security teams ask first.

  • What source can Deton evaluate today?

    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.

  • Does no published finding mean the code is safe?

    No. Unsupported, inconclusive, stale, error, and no-result states are not proof of safety. They remain non-publishable outcomes.

  • What happens without an evaluator-accepted supplied result?

    The candidate remains a non-finding, with no in-memory issue eligibility, delivery, or publication. Its supplied state can still retain a review reason.

  • Can this deployment add a pull-request check?

    Yes, when GitHub, storage, and the sandbox worker are configured. Delivery failures stay visible, and only proof-gated results can be published.

  • Where should I verify data handling and retention?

    Review the published data-processing documents for the deployment you use. This page states no retention or residency commitment.

  • How much does it cost?

    See the pricing page for the tiers and amounts currently presented by this deployment.

Review the proof boundary where pull requests are decided.

Create an account to connect the configured GitHub App and inspect repository runs. A scan starts only from an authorized pull-request event.

Create an accountSee pricing

Current source limit shown above · non-proof states stay non-findings.

Deton

Deton analyzes authorized pull-request changes through an isolated, proof-gated runner. Unsupported and inconclusive results are never published as confirmed findings.

Product

  • Pricing
  • Compare
  • Demo

Resources

  • Docs
  • Blog
  • Roadmap
  • API

Compliance

  • Security
  • Privacy
  • Terms
  • DPA
  • BAA

Company

  • About
  • Status
  • Feature requests

© 2026 Deton

AppSec boundary preview · Next.js 16

PrivacyTermsCookies
Create an account