This release includes 2 security fixes for security teams reviewing exposed deployments.
Topics
+4 more
Affected surfaces
ReleasePort's take
Light signalHookwarden 0.8.0 fixes a false‑positive critical alert for correctly verified GitHub webhook handlers and improves detection of raw‑body accesses, Stripe verification calls, and Remix routes.
Why it matters: The fix eliminates the incorrect critical flag on valid GitHub webhooks (severity 90) and broadens accurate provider detection across common frameworks; operators should upgrade to benefit from these clarifications.
Summary
AI summaryBroad release touches Patch Changes, Minor Changes, Ed25519, and PyNaCl.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Fixes false‑positive critical on correctly verified GitHub webhook handlers. Fixes false‑positive critical on correctly verified GitHub webhook handlers. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Security | Medium |
Adds Ed25519 provider for Discord interactions with asymmetric verification detection. Adds Ed25519 provider for Discord interactions with asymmetric verification detection. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Medium |
Adds Remix support for detecting webhook routes in `app/routes/**`. Adds Remix support for detecting webhook routes in `app/routes/**`. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Feature | Low |
Adds n8n agentic-callback ruleset detecting unverified agent/tool webhook sinks. Adds n8n agentic-callback ruleset detecting unverified agent/tool webhook sinks. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Introduces queue-handler reachability overlay resolving to manual-review when verifying consumer reachable across queues. Introduces queue-handler reachability overlay resolving to manual-review when verifying consumer reachable across queues. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Detects edge-runtime webhook handlers in Cloudflare Workers, Vercel Edge, and Deno. Detects edge-runtime webhook handlers in Cloudflare Workers, Vercel Edge, and Deno. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Implements hand‑rolled Standard Webhooks detector grading based on comparison method presence. Implements hand‑rolled Standard Webhooks detector grading based on comparison method presence. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Introduces `multi-signature-mishandled` rule for manual-HMAC handlers lacking signature iteration symbol. Introduces `multi-signature-mishandled` rule for manual-HMAC handlers lacking signature iteration symbol. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Feature | Low |
Releases stable v0.8 with n8n ruleset, Anthropic Agent SDK tool‑callback ruleset, and compliance_mappings schema (SOC 2, ISO 27001, EU AI Act Annex III, NIST AI RMF). Releases stable v0.8 with n8n ruleset, Anthropic Agent SDK tool‑callback ruleset, and compliance_mappings schema (SOC 2, ISO 27001, EU AI Act Annex III, NIST AI RMF). Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Dependency | Low |
Updates dependencies: @hookwarden/engine, @hookwarden/rules, @hookwarden/fix to 0.8.0. Updates dependencies: @hookwarden/engine, @hookwarden/rules, @hookwarden/fix to 0.8.0. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Recognizes `req.text()` / `req.arrayBuffer()` as raw‑body access in Next.js, Remix, Hono. Recognizes `req.text()` / `req.arrayBuffer()` as raw‑body access in Next.js, Remix, Hono. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
Recognizes Stripe v2 verification calls (`stripe.parseThinEvent`, `webhooks.constructEventAsync`). Recognizes Stripe v2 verification calls (`stripe.parseThinEvent`, `webhooks.constructEventAsync`). Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
`scan` now fails loudly on unscannable targets instead of silent success. `scan` now fails loudly on unscannable targets instead of silent success. Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Bugfix | Medium |
Prevents flagging non‑webhook routes that merely import a provider SDK (e.g., Stripe). Prevents flagging non‑webhook routes that merely import a provider SDK (e.g., Stripe). Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Bugfix | Medium |
Prevents generic HTTP headers (e.g., Authorization) from driving provider attribution. Prevents generic HTTP headers (e.g., Authorization) from driving provider attribution. Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Bugfix | Medium |
Fixes provider-attribution bug causing mis‑attribution of correctly verified hand‑rolled handlers to anthropic-agent-sdk. Fixes provider-attribution bug causing mis‑attribution of correctly verified hand‑rolled handlers to anthropic-agent-sdk. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
| Bugfix | Low |
Accepts undocumented flags `--no-trivia` and `--no-update-notifier` in `scan`. Accepts undocumented flags `--no-trivia` and `--no-update-notifier` in `scan`. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Low |
Corrects file:line hyperlinks and trims zero‑tier tally in scan output. Corrects file:line hyperlinks and trims zero‑tier tally in scan output. Source: llm_adapter@2026-06-03 Confidence: high |
— |
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
-
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
-
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.
-
-
a7424fc: Fix a false-positive
criticalon correctly-verified GitHub webhook handlers. The
github-timing-safe-equalpredicate (backinggithub/missing-timing-safe-equaland
github/timing-unsafe-comparison) returned"verified"on the safe path; because the engine
builds a finding for any non-null verdict and stamps it with the rule's fixedcriticalseverity
and "verification missing" message, a textbook-correct hand-rolled handler
(crypto.createHmac+crypto.timingSafeEqual, exactly per GitHub's docs) surfaced two
false-positive criticals and failed the build. The safe path now returnsnull(no finding) —
the positive signal remains the job of the info-severitygithub/library-verifiedrule, matching
the convention every other provider's critical rules already follow.Also makes
--fail-ongating state-aware so exit codes match the documented summary legend:
verifiedfindings never gate (a correctly-verified handler is not a build failure),
manual-reviewfindings gate only at--fail-on low/info(not the defaulthigh), and
not-verifiedfindings continue to gate by severity. -
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). -
Updated dependencies [8f8c131]
-
Updated dependencies [a7424fc]
-
Updated dependencies [46c2a97]
-
Updated dependencies [ade4609]
-
Updated dependencies [056ba21]
-
Updated dependencies [c7f1046]
-
Updated dependencies [729c7a1]
-
Updated dependencies [1bd1791]
-
Updated dependencies [c10427a]
- @hookwarden/[email protected]
- @hookwarden/[email protected]
- @hookwarden/[email protected]
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]