Skip to main content

waku CVE-2026-49456

| EUVDEUVD-2026-70655 LOW
URL Redirection to Untrusted Site (Open Redirect) (CWE-601)
2026-07-08 https://github.com/wakujs/waku GHSA-43fc-v873-qw85
3.1
CVSS 3.1 · Vendor: https://github.com/wakujs/waku

Severity by source

Vendor (https://github.com/wakujs/waku) PRIMARY
3.1 LOW
AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:L/A:N
vuln.today AI
4.3 MEDIUM

AC:L because crafting the exploit URL is trivial once vulnerable code is deployed; UI:R requires victim click; no direct C or A impact.

3.1 AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:A/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/wakujs/waku).

CVSS VectorVendor: https://github.com/wakujs/waku

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

1
Analysis Generated
Jul 08, 2026 - 22:01 vuln.today

DescriptionCVE.org

Summary

The unstable_redirect() helper exported from waku/router/server (packages/waku/src/router/define-router.tsx:156-161) accepts an arbitrary string and reflects it unchanged into the HTTP Location response header with no URL validation, scheme restriction, or path-only enforcement. Any application that passes user-controlled input to this helper - the natural pattern documented in the JSDoc and official fixtures - is vulnerable to open redirect attacks. An attacker who convinces a victim to click a crafted link can silently redirect the browser to an arbitrary external domain, enabling phishing, credential harvesting, and OAuth token theft. Additionally, scheme-relative URLs (//evil.example/) bypass naive https?://-only allow-list filters that developers might add as ad-hoc mitigations.

Dynamic PoC confirmed against waku 1.0.0-beta.0 (commit 8e9f542) in an isolated Docker environment. Two independent dynamic runs produced identical results.

---

Root Cause

packages/waku/src/router/define-router.tsx:156-161:

ts
export function unstable_redirect(
  location: string, // only URL `pathname` is supported.
  status: 303 | 307 | 308 = 307,
): never {
  throw createCustomError('Redirect', { status, location });
}

The JSDoc comment states "only URL pathname is supported", but this constraint is expressed as documentation only - the function performs no validation. The location value propagates via createCustomError (custom-errors.ts:22-26) into an error digest, is recovered by getErrorInfo in the request handler (handler.ts:79-89), and reflected directly into headers.location of the outgoing Response with no sanitization:

ts
if (info?.location) {
  headers.location = info.location;   // handler.ts:87 - unvalidated reflection
}
return new Response(body, { status, headers });

---

Trigger (one-line summary)

Any developer-supplied user input passed to unstable_redirect() is reflected unchanged into the HTTP Location header, enabling navigation to an attacker-controlled domain.

---

Affected Entry Surfaces

  • unstable_redirect(location, status?) - waku/router/server public export
  • Any page/route component that passes searchParams, query, or other user-

controlled strings to unstable_redirect (the standard post-login or callback redirect pattern)

  • All waku adapters (Node.js, Cloudflare Workers, Vercel Edge, Deno) share the same

handler.ts reflection path; cross-runtime CRLF parity is unaudited (see note below)

---

Additional Defense-in-Depth Concern

On Node.js, CRLF injection via the Location header is rejected by node:_http_outgoing.setHeader (ERR_INVALID_CHAR). This defense is platform-specific and not present in the waku source. Cloudflare Workers, Deno Deploy, and other edge runtimes have not been verified to offer equivalent protection. A cross-runtime audit is recommended.

---

Suggested Fix Outline

Validate the location argument inside unstable_redirect before the error is thrown: reject any value that does not begin with a single / (no //), and reject any value containing control characters (\x00-\x1f). An opt-in allow-list for intentional cross-origin redirects can be provided via a framework configuration option.

---

Disclosure

FieldValue
Reporterj0hndo (dohyun4466@gmail.com)
Discovery date2026-05-17
Embargo90 days from acknowledgment
Patched versionNot yet available
Public referencesCWE-601; OWASP A01:2021

AnalysisAI

Open redirect in waku's unstable_redirect() server-side router helper allows a network attacker to redirect victims' browsers to arbitrary external domains - including phishing sites for credential harvesting and OAuth token theft - by injecting a malicious location string into any waku route that passes user-controlled query parameters to the function. The vulnerability affects waku 1.0.0-beta.0 across all supported runtime adapters (Node.js, Cloudflare Workers, Vercel Edge, Deno), as the reflection path in handler.ts is shared. A dynamic proof-of-concept was confirmed by the reporter in two independent Docker-based runs against commit 8e9f542; no vendor-released patch is confirmed at time of analysis, though a v1.0.0-beta.1 release tag appears in advisory references.

Technical ContextAI

Waku is a React-based full-stack framework distributed as the waku npm package (CPE: pkg:npm/waku). The affected API is unstable_redirect() exported from waku/router/server, implemented in packages/waku/src/router/define-router.tsx at lines 156-161. The function accepts an arbitrary location: string and throws it as a custom error via createCustomError(), which propagates through getErrorInfo() in the request handler (handler.ts:79-89). At line 87, headers.location = info.location places the raw, unvalidated string directly into the HTTP Location response header before returning a 3xx Response. CWE-601 (URL Redirection to Untrusted Site) is the root cause: no scheme restriction is applied, no path-only enforcement exists, and scheme-relative URLs such as //evil.example/ bypass any naive https?:// prefix checks developers might add as ad-hoc defenses. The JSDoc comment reads 'only URL pathname is supported', but this is purely documentary - no runtime enforcement is present in the framework code.

RemediationAI

No vendor-released patch has been confirmed at time of analysis. The advisory references a v1.0.0-beta.1 release at https://github.com/wakujs/waku/releases/tag/v1.0.0-beta.1 - operators should inspect this release for the fix and upgrade if it addresses GHSA-43fc-v873-qw85. Until a patch is confirmed, apply application-level input validation at every call site of unstable_redirect(): reject any location value that does not begin with exactly one / (blocking //evil.example scheme-relative bypasses), and reject strings containing control characters (\x00-\x1f). Do not rely solely on https?:// prefix rejection, as scheme-relative URLs circumvent this filter. Adding an explicit allowlist of permitted redirect destinations - limiting acceptable values to known application paths - is the most robust compensating control. Be aware that CRLF injection protection in the Location header is provided by Node.js via ERR_INVALID_CHAR, but this is platform-specific and is NOT guaranteed on Cloudflare Workers, Deno Deploy, or Vercel Edge; a cross-runtime CRLF audit is recommended before relying on this as a defense.

More in Docker

View all
CVE-2024-55964 CRITICAL POC
9.8 Mar 26

An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl

CVE-2019-5736 HIGH POC
8.6 Feb 11

runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac

CVE-2023-32077 HIGH POC
7.5 Aug 24

Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2023-5815 HIGH POC
8.1 Nov 22

The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post

CVE-2026-66384 MEDIUM POC
5.3 Aug 12

Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten

CVE-2014-9357 CRITICAL
10.0 Dec 16

Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build

CVE-2026-52806 CRITICAL POC
9.9 Jun 23

Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config

CVE-2026-56274 HIGH POC
8.7 Jun 23

Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per

CVE-2026-34156 CRITICAL POC
9.9 Mar 30

Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l

CVE-2019-15752 HIGH POC
7.8 Aug 28

Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c

CVE-2025-34221 CRITICAL POC
10.0 Sep 29

Vasion Print (formerly PrinterLogic) Virtual Appliance Host prior to version 25.2.169 and Application prior to version 2

Share

CVE-2026-49456 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy