SSRF in Decolua 9router
CVE-2026-72860
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.
Published · last modified .
CVSS v3 metric
CVSS v3 base score 8.5 (High). Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N.
EPSS exploit prediction
EPSS: 0.004 (30.1th percentile), scored .
Very low probability of exploitation in the next 30 days; routine patching cadence is appropriate. 30th percentile — 30.1% of CVEs in the catalogue have a lower EPSS than this one. How to read EPSS.
EPSS over last 30 days · oldest: 0.002 · newest: 0.004 · change: +0.002
Affected products
Weakness classification (CWE)
References
- GitHub Issue #3293 (issue-tracking)
- assertPublicUrl and the unreachable IPv4-mapped branch in isBlockedIpv6 (technical-description)
- validate route applying the guard and reflecting 200 bytes (technical-description)
- Proposed fix judging mapped addresses by address rather than spelling (not merged) (issue-tracking)
- github.com/decolua/9router (product)
- VulnCheck Advisory: 9router Server-Side Request Forgery via /api/provider-nodes/validate Because the IPv4-Mapped IPv6 Denylist Check Is Unreachable (third-party-advisory)
Frequently asked questions
- What is CVE-2026-72860?
- CVE-2026-72860 is a high-severity vulnerability in Decolua 9router, classified under Incomplete List of Disallowed Inputs. CVSS score: 8.5/10. Published 2026-08-20.
- How severe is CVE-2026-72860?
- High severity. CVSS v3 base score is 8.5 out of 10.