This release includes 2 security fixes for security teams reviewing exposed deployments.
Topics
+4 more
Affected surfaces
Summary
AI summaryBroad release touches Patch Changes, Minor Changes, Ed25519, and PyNaCl.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Adds hand‑rolled Standard Webhooks detection with manual‑review grading for undecidable compares. Adds hand‑rolled Standard Webhooks detection with manual‑review grading for undecidable compares. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Adds n8n agentic-callback ruleset and workflow‑JSON adapter. Adds n8n agentic-callback ruleset and workflow‑JSON adapter. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Feature | Low |
Adds Remix support for action route modules detection. Adds Remix support for action route modules detection. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Feature | Low |
Adds queue‑handler reachability overlay and Ed25519 Discord provider. Adds queue‑handler reachability overlay and Ed25519 Discord provider. Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Feature | Low |
Implements queue-handler reachability overlay (manual-review for verified queues). Implements queue-handler reachability overlay (manual-review for verified queues). Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Adds Ed25519 Discord interaction provider support. Adds Ed25519 Discord interaction provider support. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Detects Cloudflare Workers, Vercel Edge, and Deno edge‑runtime webhook handlers. Detects Cloudflare Workers, Vercel Edge, and Deno edge‑runtime webhook handlers. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Introduces `multi-signature-mishandled` rule for handlers lacking signature iteration logic. Introduces `multi-signature-mishandled` rule for handlers lacking signature iteration logic. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Bugfix | Medium |
Recognizes `req.text()` and `req.arrayBuffer()` as raw‑body access. Recognizes `req.text()` and `req.arrayBuffer()` as raw‑body access. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Makes `scan` fail loudly on unscannable targets. Makes `scan` fail loudly on unscannable targets. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Accepts `--no-trivia` and `--no-update-notifier` flags in `scan`. Accepts `--no-trivia` and `--no-update-notifier` flags in `scan`. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Prevents generic HTTP headers from driving provider attribution (Postmark). Prevents generic HTTP headers from driving provider attribution (Postmark). Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Recognizes Stripe v2 verify calls (`parseThinEvent`, `constructEventAsync`). Recognizes Stripe v2 verify calls (`parseThinEvent`, `constructEventAsync`). Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Stops flagging non‑webhook routes that merely import a provider SDK (e.g., Stripe). Stops flagging non‑webhook routes that merely import a provider SDK (e.g., Stripe). Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Fixes file:line hyperlink generation and footer tally trimming. Fixes file:line hyperlink generation and footer tally trimming. Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Bugfix | Medium |
Fixes provider‑attribution bug where generic crypto primitives misattributed hand‑rolled HMAC to Anthropic Agent SDK. Fixes provider‑attribution bug where generic crypto primitives misattributed hand‑rolled HMAC to Anthropic Agent SDK. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Bugfix | Low |
Corrects file:line hyperlinks and trims zero‑tier footer tally in scan output. Corrects file:line hyperlinks and trims zero‑tier footer tally in scan output. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
Full changelog
Minor Changes
-
46c2a97: Add the n8n agentic-callback ruleset. The engine gains a workflow-JSON adapter that ingests
*.workflow.jsonfiles and n8n community custom-nodes (package.json#n8n.nodes,INodeType/IWebhookFunctionssources), synthesizing handler models from n8n trigger/webhook nodes. A new n8n rule pack detects unverified-body agent/tool sinks (VAS/BYP ongetBodyData(),$json,items[0].jsonreaching agent-tool calls) while staying silent on mitigated, signature-verified shapes. ThehookwardenCLI now scans n8n projects end-to-end (scansurfaces n8n findings and malformed-workflow parse errors). -
056ba21: Add queue-handler + edge-runtime reachability overlays and the first asymmetric (Ed25519) provider.
- REACH-01 — queue-handler reachability: a handler that enqueues the raw body via bullmq / SQS / inngest / Kafka and has a verifying consumer of that queue reachable now resolves to
manual-reviewinstead ofnot-verified(the engine can't prove same-payload verification across the queue boundary, so it never claimsverified). A queue enqueue with no verifying consumer staysnot-verified. - REACH-02 — edge-runtime detection: webhook handlers on Cloudflare Workers (
export default { fetch }), Vercel Edge (runtime: 'edge'), and Deno (Deno.serve) are now detected (Next.js App Router was already covered), so the HMAC-over-raw-body rules evaluate them instead of missing or mis-flagging. The full rule pack'sapplies_tonow includescloudflare-workers/vercel-edge/deno. - DISCORD-01 — Ed25519 provider: Discord interactions are the first asymmetric provider (
signature_scheme: ed25519, verified against the app public key). The rule recognizesverifyKey(discord-interactions-js),nacl.sign.detached.verify(tweetnacl),nacl.signing.VerifyKey(...).verify(...)(PyNaCl), andsodium_crypto_sign_verify_detached(PHP) as verified; a Discord handler with no Ed25519 verification isnot-verified. Discord interaction paths are now detected.
Engine purity preserved; existing HMAC providers untouched.
- REACH-01 — queue-handler reachability: a handler that enqueues the raw body via bullmq / SQS / inngest / Kafka and has a verifying consumer of that queue reachable now resolves to
-
c10427a: v0.8 launch — webhook integrity, from first line to final audit.
This is the stable v0.8 cut of the CLI + engine + rules cluster. It rolls up the
v0.8 milestone surface: the n8n agentic-callback ruleset (detecting unverified
agent/tool webhook sinks, shipped after the Cisco Talos n8n abuse report), the
Anthropic Agent SDK tool-callback ruleset, and thecompliance_mappingsschema
(SOC 2 + ISO 27001 + EU AI Act Annex III + NIST AI RMF) surfaced in
hookwarden --version --verbose, with the v1.1 evidence pack carrying the EU AI
Act Annex III high-risk classification and an embedded offline-verifiable
signing key.The MCP server shipped earlier in the v0.8 cycle and versions independently of
this fixed cluster, so it is intentionally not part of this changeset.
Patch Changes
-
8f8c131: Real-app correctness + scan-robustness + terminal-UX fixes (found auditing dub / cal.com / documenso):
-
engine:
req.text()/req.arrayBuffer()now count as raw-body access. The raw-body evidence
detector recognizedexpress.raw,req.body,php://input, etc. but not the Web Fetch API reads
used by Next.js App Router / Remix / Hono — exactly the pattern Stripe's docs prescribe
(const buf = await req.text(); stripe.webhooks.constructEvent(buf, sig, secret)). Correctly-verified
App Router webhooks were flaggedstripe/raw-body-misuse— a false-positive critical on textbook
code. Now recognized (incl..clone()d request vars likeclonedReq.text()), without
over-suppressing genuine misuse (response.text()still doesn't count). -
scanfails loud on an unscannable target. A nonexistent / unreadable / non-file-or-dir path
used to walk an empty tree → exit 0 "No findings" — a false all-clear for a CI security gate. It now
exits 3 witherror: cannot scan '<path>': …. (inventory, a listing command, stays graceful.)
/dev/nulland broken symlinks no longer leak an internalENOTDIRbaseline path. -
--no-trivia/--no-update-notifierare now accepted. Both were documented in--helpand
consumed byscanbut missing from the flag allowlist, so they were rejected as unknown flags. -
file:line hyperlinks anchor correctly. Scanning a single file emitted a doubled-basename link
(…/x.js/x.js:3:1);inventoryresolved links againstprocess.cwd()instead of the scan root.
Both now anchor to the scan directory. -
footer tally trims zero tiers.
Found 2 critical · 0 high · 0 medium · 0 low · 0 info · 0 manual-review
→Found 2 critical. Only non-zero severities show;manual-reviewshows only when present.
-
-
ade4609: Cut real-app false positives from provider over-detection / mis-attribution (found scanning dub):
-
Generic HTTP headers no longer drive provider attribution. Postmark's catalog
signature_header
isauthorization(its Basic-Auth scheme), butAuthorizationis read by nearly every
authenticated route — so OAuth token endpoints, cron jobs, and admin routes were attributed to
postmark and flagged as unverified postmark webhooks. A generic-header read (Authorization,
Content-Type, …) is now recorded provider-agnostically; real postmark webhooks are still attributed
by their specific signals (/postmark/*paths, SDK,POSTMARK_*env), and postmark's rules detect
Basic-Auth via reachable symbols, not this header. -
Stripe v2 verify calls recognized.
stripe.parseThinEvent(...)(v2 API / thin events) and
webhooks.constructEventAsync(...)(Edge/Workers async API) are now treated as signature
verification, so correctly-verified v2 webhooks are no longer flagged
stripe/missing-signature-verification.
Combined with the
req.text()raw-body fix, false-positive criticals on the dub codebase dropped
from 20 to 9 (the remaining 9 are genuine unverified webhook routes plus two non-webhook routes that
merely import the Stripe SDK — a separate over-detection class tracked for follow-up). -
-
c7f1046: Add Remix support. Remix
actionroute modules underapp/routes/**receive a Web Fetch API
Request — identical to Next.js App Router — but were undetected, so a real Remix webhook scanned to
0 handlers and silently reported "clean" (a false negative; found scanning documenso, whose Stripe
webhook isapps/remix/app/routes/api+/stripe.webhook.ts). NewremixAdapterdetectsaction
exports and derives the route from the remix-flat-routes filename (api+/stripe.webhook→
/api/stripe/webhook); rules apply to remix via the nextjs equivalence inruleAppliesToFramework
(no per-rule YAML churn).remixadded to the engine Framework union + the rulesapplies_toenum. -
729c7a1: Stop flagging non-webhook routes that merely import a provider SDK (found scanning dub:
billing/cancel,billing/payment-methods). Next.js App Router admits everyroute.tsPOST
regardless of path, so a route at a non-webhookish path whose only provider signal isimport Stripe
(used to callstripe.subscriptions.update, not to receive webhooks) was attributed to stripe and
flagged stripe/missing-signature-verification — a false-positive critical. Such a route is
statically indistinguishable from a real webhook, so it's now demoted to providerunknown(no
provider rules fire), matching the engine's existing "ambiguous route → unknown → no finding" stance.
A webhookish path (the canonical/webhookbug, whose only stripe signal is also the import) or any
receiving signal (signature-header read, verify call, raw-body read, webhook secret, conventional
path) keeps the attribution. Combined with the earlier raw-body / generic-header / parseThinEvent
fixes, false-positive criticals on the dub codebase dropped from 20 to 7 (the 7 remaining are
genuine unverified webhook routes). -
1bd1791: Complete the Standard Webhooks detector with the hand-rolled prong (Clerk CVE-2025-53548) and fix a provider-attribution bug it surfaced.
- STDWH-01 hand-rolled prong: a handler that re-implements the Standard Webhooks spec by hand — HMAC-SHA256 over the canonical
{msg_id}.{timestamp}.{body}string — is now graded three ways. With no comparison reachable it isnot-verified(the Clerk CVE-2025-53548 shape, where the signature is computed but never checked); with only an undecidable local compare wrapper (safeCompare()/verifySig()) it ismanual-review; with a recognized constant-time compare it defers. Covers JS/TS (Babel), Python (tree-sitter), and PHP (tree-sitter source-walk). Plan 16 shipped only the library-import prong, so hand-rolled re-implementations were previously missed. multi-signature-mishandled: a new rule for thev1,<sig1> v1,<sig2>rotation list — a manual-HMAC handler with no signature-iteration symbol reachable ismanual-review(it likely breaks the moment a secret is rotated).- Provider-attribution fix: a correctly-verified hand-rolled handler (
crypto.createHmac+crypto.timingSafeEqual) was mis-attributed toanthropic-agent-sdkand graded by the wrong provider's rules. Generic stdlib crypto primitives that some catalog entries list as VAS-01 suppression anchors no longer drive provider attribution; the VAS-01 suppression itself is unchanged.
No
whsec_hardcoded-secret rule is added — the existing Stripe rule already matches it provider-agnostically. Engine purity preserved. - STDWH-01 hand-rolled prong: a handler that re-implements the Standard Webhooks spec by hand — HMAC-SHA256 over the canonical
Security Fixes
- CVE-2025-53548
- CVE-2025-53548
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Hookwarden
All releases →Related context
Beta — feedback welcome: [email protected]