@haxtheweb/open-apis Credential Exposure via SSRF in cacheAddress Endpoint (CVE-2026-46391)
by bradyjmcl · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-46391 (GHSA-4fg7-f244-3j49)
- Category
- web
- Affected product
- @haxtheweb/open-apis (HAXcms/HAX ecosystem web service APIs)
- Affected versions
- Per source repository (pre-patch @haxtheweb/open-apis)
- Disclosed
- 2026-07-05
- Patch status
- unpatched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-07 |
| Author / Researcher | bradyjmcl |
| CVE / Advisory | CVE-2026-46391 (GHSA-4fg7-f244-3j49) |
| Category | web |
| Severity | High |
| CVSS Score | Not specified in source |
| Status | PoC |
| Tags | haxtheweb, haxcms, open-apis, ssrf, cwe-918, credential-exposure, cacheaddress |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | @haxtheweb/open-apis (HAXcms/HAX ecosystem web service APIs) |
| Versions Affected | Per source repository (pre-patch @haxtheweb/open-apis) |
| Language / Platform | Go (PoC/exploit tool); target is a Node.js-based web API |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
The cacheAddress endpoint in @haxtheweb/open-apis (/api/services/website/cacheAddress) performs a server-side fetch of a URL supplied by the caller without adequately restricting the destination, resulting in a Server-Side Request Forgery (SSRF) vulnerability. An attacker who controls the target of this server-side request can point it at an attacker-controlled listener, and the request that arrives includes service account credentials sent as part of the callback, allowing exfiltration of secrets the server didn’t intend to expose externally.
Vulnerability Details
Root Cause
The cacheAddress API accepts a URL from the client and has the server issue an outbound HTTP request to it without validating that the destination is an allow-listed, internal-only address. Because the server-side request carries service account credentials/headers, redirecting it to an attacker-controlled host leaks those credentials to the attacker.
Attack Vector
- Stand up a listener reachable by the target server (directly, or via a tunnel such as Cloudflare Tunnel).
- Send a request to the target’s
cacheAddressendpoint (/api/services/website/cacheAddress) with a URL parameter pointing at the attacker’s listener, using a path suffix (/.aanda.psu.edu) crafted to satisfy the target’s substring validation check. - The vulnerable server issues a server-side HTTP request to the attacker’s listener, including service account credentials in the callback.
- The PoC’s listener captures the inbound request and extracts the leaked credentials.
Impact
Exposure of internal service account credentials to an external attacker via SSRF, which can be leveraged for further authenticated access to internal services or the HAXcms/HAX API surface.
Environment / Lab Setup
Target: A web root running the vulnerable @haxtheweb/open-apis service (e.g. http://10.10.0.80:3000)
Attacker: Go 1.x toolchain; a reachable listener IP or public tunnel (e.g. Cloudflare Tunnel)
Proof of Concept
PoC Script
See
main.go(withmain_test.go,go.mod) in this folder.
| |
Triggers the SSRF against the target’s cacheAddress endpoint, starts a local listener to receive the resulting server-side callback, and captures the service account credentials embedded in the inbound request.
Detection & Indicators of Compromise
Outbound requests from the HAXcms/open-apis server to unexpected external hosts following a cacheAddress API call
Signs of compromise:
cacheAddressAPI calls with URL parameters pointing to non-internal or attacker-controlled hosts- Unexpected outbound HTTP connections from the application server carrying service-account authentication headers
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update @haxtheweb/open-apis to the patched version that validates/restricts cacheAddress destinations and strips credentials from outbound server-side requests |
| Interim mitigation | Restrict outbound network access from the application server via egress filtering; disable or gate the cacheAddress endpoint until patched |
References
Notes
Mirrored from https://github.com/bradyjmcl/cve-2026-46391 on 2026-07-05. The repository’s demo GIF (.assets/poc.gif, ~12 MB) was excluded from this mirror per size policy; only source code and tests were kept.
| |