Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to 9router dashboard
-
DeliverySend POST /api/provider-nodes/validate with IPv4-mapped IPv6 baseUrl
-
ExploitSSRF guard regex fails on WHATWG-canonicalized hostname
-
ExecutionServer issues HTTP request to loopback or cloud metadata target
-
Impact200-byte internal response body returned to attacker
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Credential Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Default configuration requires a valid 9router dashboard session (PR:L); if the requireLogin setting is disabled, no authentication is required and exploitation is open to any network-reachable caller. The vulnerable endpoint is POST /api/provider-nodes/validate, which must not be blocked by an intermediary control such as a WAF or API gateway. The partial response disclosure path (200-byte truncation) is triggered only when the custom-embedding validation type is invoked and the internal service returns a non-2xx, non-401, non-403 status; other validation types remain usable for blind port scanning via status codes and timing. The DNS-hostname bypass (a named host resolving to an internal IP) requires that no egress DNS filtering or firewall prevents outbound connections from the 9router host. No user interaction, no client-side component, and no non-default server configuration beyond disabling requireLogin are needed for the primary IPv6-mapped bypass. |
| Impact | The CVSS 3.1 score of 8.5 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N) accurately reflects the network-accessible exploitation surface, low attack complexity, and changed scope reaching internal infrastructure. The PR:L rating is correct for the default configuration requiring a dashboard session; if requireLogin is disabled, the effective privilege requirement drops to PR:N, raising real-world risk substantially beyond the scored value. No EPSS score or CISA KEV listing appears in the available intelligence, meaning no confirmed active exploitation exists at time of analysis. However, the bypass is mechanically trivial once understood - the full technique is derivable from the publicly available fix PR diff (#3370) and the detailed GitHub issue (#3293) without additional reverse engineering. The partial response disclosure (200-byte truncation on error status codes) and blind port-scanning capability via status and timing differences add concrete post-SSRF utility beyond theoretical access. A residual DNS-rebinding gap acknowledged in the PR comment means that even after the IPv6 fix is applied, the guard remains bypassable via hostname-to-internal-IP resolution - defenders operating any version of this product should layer egress firewall controls regardless of patch status. |
| Exploit ScenarioDerived | An attacker holding a valid 9router dashboard session sends POST /api/provider-nodes/validate with baseUrl set to http://[::ffff:a9fe:a9fe]/latest/meta-data/ (the AWS EC2 instance metadata endpoint encoded as an IPv4-mapped IPv6 address in WHATWG-canonicalized hextet form). The SSRF guard's regex fails to match the canonicalized hostname, the application issues the request server-side, and the first 200 bytes of the metadata response are returned to the attacker via the custom-embedding error path. No public exploit code has been identified, but the technique is fully derivable from the public fix PR diff and issue discussion. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 20, 2026
Server-side request forgery in decolua 9router ≤ 0.5.55 allows session-authenticated users (or unauthenticated callers when requireLogin is disabled) to reach internal network resources via the POST /api/provider-nodes/validate endpoint. The SSRF guard's IPv4-mapped IPv6 branch is structurally unreachable: WHATWG URL canonicalization rewrites dotted-quad notation to hextet form before the string regex is evaluated, so addresses such as http://[::ffff:7f00:1] (loopback) and http://[::ffff:a9fe:a9fe] (cloud metadata) pass unchecked. No public exploit has been identified at time of analysis, though the root cause and bypass technique are fully documented in the public GitHub issue and fix PR.
RemediationAI
Upstream fix is available as pull request #3370 (https://github.com/decolua/9router/pull/3370), which replaces the unreachable string-regex IPv6 check with a byte-level normalization function (ipv6ToBytes) that correctly handles WHATWG-canonicalized addresses in both hextet and dotted-quad spellings. A released tagged version incorporating this fix has not been independently confirmed - the fix exists only as an open PR at time of analysis. Until a patched release ships, operators should: disable or firewall the POST /api/provider-nodes/validate endpoint if not operationally required (trade-off: loss of provider-node validation functionality); ensure requireLogin remains enabled, since disabling it eliminates the authentication barrier entirely; and deploy host-level egress filtering on the 9router server blocking outbound connections to 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, and ::1, noting that firewall controls cannot defend against DNS-rebinding attacks and do not substitute for fixing the application-layer guard. Reference: https://www.vulncheck.com/advisories/9router-server-side-request-forgery-via-api-provider-nodes-validate-because-the-ipv4-mapped-ipv6-denylist-check-is-unreachable
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The vulnerability resides in assertPublicUrl within src/shared/utils/ssrfGuard.js (CPE: cpe:2.3:a:decolua:9router:*:*:*:*:*:*:*:*). The function guards the POST /api/provider-nodes/validate route, which accepts a caller-supplied baseUrl and issues server-side HTTP requests to it. The WHATWG URL standard - as implemented by Node.js new URL() - canonicalizes an IPv4-mapped IPv6 address from its dotted-quad spelling (::ffff:127.0.0.1) to pure hextet form (::ffff:7f00:1) before any application code sees the hostname. The guard's regex ^::ffff:(\d+\.\d+\.\d+\.\d+)$ therefore never matches anything produced by the parser, rendering the entire v4-mapped protection branch dead code. Because the guard also performs no DNS resolution, hostnames whose A records resolve to RFC 1918 or loopback addresses pass unchecked as well. A secondary disclosure path exists in the custom-embedding branch: the upstream response body is truncated to 200 bytes and returned to the caller when the upstream status is neither 2xx, 401, nor 403, leaking the beginning of internal responses. The caller-supplied apiKey is forwarded as an Authorization Bearer header to whatever internal destination is reached. CWE-918 (Server-Side Request Forgery) is the correct root-cause classification.
Know when 9Router gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:L/SA:N
Network-reachable endpoint, trivial bypass complexity; PR:L reflects mandatory default session authentication; S:C captures internal infrastructure reach; I:L covers apiKey forwarding to internal targets.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
The POST /api/provider-nodes/validate route in 9router takes a caller-supplied baseUrl and issues server-side HTTP requests to it, guarding the destination with assertPublicUrl from src/shared/utils/ssrfGuard.js. That guard compares hostname strings only: it resolves no DNS, does not revalidate after a redirect, and its IPv4-mapped IPv6 branch is unreachable. The branch matches ^::ffff:(\d+\.\d+\.\d+\.\d+)$, but the WHATWG URL parser canonicalizes such literals to hextets before the guard runs, so new URL("http://[::ffff:127.0.0.1]/").hostname yields [::ffff:7f00:1] and the pattern is tested against a string it is never handed. Every IPv4-mapped address therefore passes, and http://[::ffff:7f00:1] and http://[::ffff:a9fe:a9fe] reach loopback and link-local metadata addresses; a hostname whose A record points at an internal address passes as well because no resolution occurs. In the custom-embedding branch the upstream response body is truncated to 200 bytes and returned to the caller whenever the upstream status is neither 2xx nor 401 nor 403, which discloses the beginning of internal responses, and the other validation types remain usable for blind internal port scanning through status and timing differences. The caller-supplied apiKey is forwarded to the internal destination as an Authorization Bearer header. A dashboard session is required by default, and none is required when requireLogin is disabled.
Executive ViewAI
decolua 9router versions 0.5.55 and earlier contain a server-side request forgery vulnerability in the provider node validation endpoint that allows authenticated users (or unauthenticated users when requireLogin is disabled) to reach internal network resources and cloud metadata services. Organizations using decolua 9router face risk of unauthorized access to internal infrastructure, credentials, and sensitive metadata.
No vendor-released patch identified at time of analysis. Interim mitigations: enforce requireLogin=true to block unauthenticated exploitation; implement network segmentation restricting internal connectivity from application servers; deploy WAF rules blocking POST requests to /api/provider-nodes/validate; disable the endpoint if not operationally required; monitor for anomalous internal network access patterns from affected systems.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
Unauthenticated CRUD on the provider-management API in 9Router (through 0.4.41) lets remote attackers with no credential
Server-Side Request Forgery (SSRF) in 9Router 0.5.4 and earlier allows unauthenticated remote attackers to probe interna
Authentication bypass in 9Router (npm package '9router') before 0.5.6 lets a remote, unauthenticated attacker reach the
Remote unauthenticated code execution in 9router 0.4.59 (by decolua) lets an attacker chain three flaws - a hardcoded de
Remote authorization bypass in decolua 9router up to version 0.3.47 allows unauthenticated network attackers to access t
Improper restriction of excessive authentication attempts (CWE-307) in the 9Router AI router package (decolua/9router) b
Unauthenticated API key disclosure in 9Router (npm package '9router' by decolua) through version 0.4.41 lets any remote
Authenticated remote code execution in 9Router before 0.5.2 lets a logged-in attacker run arbitrary OS commands on the h
Unauthenticated information disclosure in 9Router (decolua/9router) through version 0.4.41 lets remote attackers read ev
Authentication bypass in 9Router (AI router & token saver) prior to 0.5.4 lets any authenticated user disable applicatio
Authorization-gate bypass in 9Router (decolua/9router) before 0.5.2 lets a remote unauthenticated attacker reach protect
Server-side request forgery in 9Router before 0.4.72 lets an authenticated (PR:L) or locally-connected user abuse the /v
EUVD-2026-63681
GHSA-cqgh-7h49-q3mr
NVD
CVE.org
EPSS
Exploit-DB