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

Proof before merge.

Security findings, published only after sandbox proof.

For AppSec and engineering teams reviewing pull requests, Deton separates candidates from publishable findings. Today, execution is limited to the bundled recipe; other repository sources remain unavailable.

Create an accountInspect the proof flow
app.deton.dev/proof/482
Skip to dashboard content
detonMy workspace

Billing

Account

DDeton workspace

Dashboard

Read-only proof state

Candidate to proof packet

Inspect each candidate and its proof state. Deton treats only confirmed oracle evidence as a vulnerability finding.

2

Confirmed proof

1

Inconclusive

1

Unsupported

Recorded at: 2026-07-06T09:12:00.000Z

Runner boundary

Seeded app, isolated runner, no production target, no external exploitation.

Proof steps

1 Proof running

Coverage boundary

1 Unsupported

Redaction

1

Confirmed proof

Candidates

StateAffected surfaceOracle observation / Coverage boundaryPR

Selected proof moment

Confirmed proof

SQL injection

src/app/api/checkout/route.ts

A changed checkout route interpolates request input into a SQL predicate.

Proof steps

Evidence packet

Evidence

pkt_01JB7Q3M9E

Proof contract
sql-error-oracle.v1
Oracle observation
Database error oracle fired twice on seeded input; sanitized trace attached.
Runner boundary
Seeded app, isolated runner, no production target, no external exploitation.
Redaction
Request and response fragments are sanitized; no secrets or customer data shown.

Redaction

Request and response fragments are sanitized; no secrets or customer data shown.

Runner boundary

Seeded app, isolated runner, no production target, no external exploitation.

Coverage boundary

Proof-enabled in the first pack: SQL error oracle with seeded database boundary.

Packet ID
pkt_01JB7Q3M9E
Run ID
run_20260706_0912
Commit
8f42c1a
State
Confirmed proof

This product view does not scan your app or prove customer code.

A deterministic oracle produced evidence under the configured contract.

Ddeton[bot]commented onacme/payments #482

Exploit proven in sandboxSQLI-01 · src/routes/invites.ts

deton_sql_marker_001sandbox run 41s

Product tour · simulated repository

Deton speaks in your pull request — and only when it can prove it.

One check row. A comment only when a sandbox proof fired. Nothing else.

Showing the proven state: the Deton check requires action and a proof comment is posted.

github.com/acme/payments/pull/482

Add invite lookup by email#482Open

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

  • Conversation2
  • Commits3
  • Checks4
  • Files changed7
  • passedbuildSuccessful in 1m 12s
  • passedlintSuccessful in 24s
  • passedunitSuccessful in 48s
  • action requiredDeton proof gate1 confirmed exploitRequiredDetails

Merging is blocked

1 required check has not passed.

src/routes/invites.ts
@@ -44,9 +44,12 @@ export async function lookupInvite(req, res) {-removed:   const rows = await db.query(-removed:     'select * from invites where email = $1', [req.body.email]-removed:   );+added:   const filter = `email = '${req.body.email}'`;+added:   const rows = await db.query(+added:     `select * from invites where ${filter}`+added:   );
Ddeton[bot]commented on this pull request

SQL injection proven in changed code

highsrc/routes/invites.ts:48-52POST /api/invites/lookup

Attack path: req.body.email reaches db.query through POST /api/invites/lookup

Proof marker:deton_sql_marker_001

Replay: Replay boolean_error_timing_oracle and observe deton_sql_marker_001; oracle no longer fires after fix.

▸Fix guidance
Impact
Attacker-controlled input can alter a database query in the sandboxed fixture.
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.
Retest
Deton replays the seeded oracle and confirms the SQL oracle no longer fires.
▸Evidence packet
issueId:
issue_cand_sqli_01
family:
sqli
proof.oracleKind:
seeded_db_boolean_or_timing
proof.redactionStatus:
redacted
proof.validatorSignature:
deton-validator:v1:3f9a1c
labels:
deton, security, family:sqli, rule:deton.sqli.single-assignment-variable-taint
github.com/acme/payments/pull/482

Add invite lookup by email#482Open

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

  • Conversation1
  • Commits3
  • Checks4
  • Files changed7
  • passedbuildSuccessful in 1m 12s
  • passedlintSuccessful in 24s
  • passedunitSuccessful in 48s
  • neutralDeton proof gateNo confirmed exploits · 3 candidates unprovenRequiredDetails

All checks have passed

Merging can be performed automatically.

Deton posted nothing. That's the point — no comment means nothing was proven.

Real output format. Check name, comment body and proof fields are produced by Deton's shipped code; this run was detonated on our seeded target (2026-07-06). Deton posts a comment only when a sandbox oracle fired.

Current source boundary

Know what can run before relying on a verdict.

A configured runner can publish only a confirmed result. Unsupported, inconclusive, stale, error, and no-result outcomes are not vulnerability evidence.

Bootable source today
Only the bundled recipe can boot today: artifact://deton-fixture/deton-vulnerable-target@v1.
Other repository references
They return source_unavailable; no customer pull request is executed from this landing page.

A candidate becomes a finding only after a confirmed observation.

Only the bundled vulnerable-target recipe can boot today.

github.com/acme/payments/pull/482

GitHub App · acme

Install Deton

Read: code, pull requestsWrite: checks, comments

A deton.json manifest describes the bundled recipe. Other repository references return source_unavailable before execution.

deton app installed · PR checks enabled

bounded sandbox run · no customer source

  • SQLI-01src/routes/invites.tsexploited
  • CMDI-02src/jobs/thumbnailer.tsrunning
  • SQLI-03src/db/reports.tsqueued
$ sandbox boot acme/payments@feat/invite-lookup
▸ manifest deton.json resolved · image node20
▸ target up · POST /api/invites/lookup
▸ probing boolean / error / timing responses
▸ proof marker observed: deton_sql_marker_001
✓ SQLI-01 confirmed in ~2 s · sandbox destroyed
  • ✓buildSuccessful in 1m 12s
  • ✓lintSuccessful in 24s
  • ✓unitSuccessful in 48s
  • ●Deton proof gate1 confirmed exploit · Required

⨯Merging is blocked — 1 required check has not passed

deton[bot]botcommented 2 minutes ago

SQL injection proven in changed code

highsrc/routes/invites.ts:48-52

req.body.email reaches db.query through POST /api/invites/lookup

Proof markerdeton_sql_marker_001

Proof states are not safety guarantees.

A candidate becomes a publishable finding only when a deterministic observation confirms it. Unsupported, inconclusive, stale, and error outcomes preserve uncertainty.

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 a confirmed observation

Confirmed sandbox observation

SQL injectionConfirmed in sandbox

acme/payments · #482

src/routes/invites.ts:41

deton_sql_marker_001

sandbox observation recorded · review context included

  • Confirmed requires an observation

    A verdict can say "confirmed" only after the configured oracle records a measurable signal for the current run.

  • Unproven stays unproven

    Couldn't prove it? Deton says so and records what was attempted. The state is not promoted to keep a dashboard red.

  • The source boundary is explicit

    Today only the bundled recipe can boot. Other repository references return source_unavailable before execution.

  • Evidence remains reviewable

    A confirmed result records the request, observed effect, and run context needed for review.

Current source support is the bundled Node and TypeScript vulnerable-target recipe. Other sources and uncovered families do not produce publishable findings.

Current runtime and delivery boundaries.

Capabilities and delivery depend on the current runner and GitHub App configuration.

Configured delivery

GitHub

GitHub delivery appears only when this deployment has a configured GitHub App flow.

Not available hereGitLabBitbucket

What the bundled recipe exercises

The bundled recipe boots a Node process inside the configured runner.

bundled recipe → node process → readiness observed

The bundled recipe includes a TypeScript request path for the configured proof contract.

request input → configured sink → candidate state

The bundled recipe exposes an Express route used by its bounded proof contract.

POST /invites → configured request → observation recorded

Next.js is not part of the bootable bundled recipe; arbitrary repository sources remain unavailable.

customer source → source_unavailable
Bundled recipe databaseExecution is limited to the bundled recipe; customer sources are not accepted.

Configured delivery surface

  • GitHub pull request

    When the GitHub App flow is configured, a publishable result can be delivered as a pull-request check.

The questions security teams ask first.

  • What source can Deton evaluate today?

    Only the bundled vulnerable-target recipe can boot today. Other repository references return source_unavailable before execution.

  • 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 a confirmed observation?

    The candidate remains non-proof and cannot become a publishable finding. The result keeps the reason available for review.

  • Can this deployment add a pull-request check?

    Only when its GitHub App flow is configured. Repository setup is an Integrations action for an organization owner or admin.

  • 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.

Open the dashboard, then review setup.

Account creation opens the dashboard. Repository setup is an owner or admin action in Integrations and works only when the GitHub App flow is configured.

Create an accountSee pricing

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

Deton

Deton scans your pull requests, proves exploitability in an isolated sandbox, and ships evidence packets you can act on before merge.

Product

  • Pricing
  • Compare
  • Demo

Resources

  • Docs
  • Blog
  • Roadmap
  • API

Compliance

  • Security
  • Privacy
  • Terms
  • DPA
  • BAA

Company

  • About
  • Status
  • Feature requests

© 2026 Deton

Proof-gated AppSec · Next.js 16

PrivacyTermsCookies