Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend HTTP request to exposed proxy endpoint
-
DeliverySupply crafted x-headroom-base-url header pointing to metadata or internal address
-
ExploitProxy resolves header value as upstream base URL without address validation
-
ExecutionProxy issues server-side HTTP request to internal/metadata target
-
PersistUpstream response returned verbatim to attacker
-
ImpactInternal service data or cloud IAM credentials disclosed
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 | Exploitation against the default docker-compose deployment requires no special conditions: the reference docker-compose.yml binds 0.0.0.0 and ships without a required HEADROOM_PROXY_TOKEN, so any host with network connectivity to the published port can send the crafted header. The proxy routes that are affected are the OpenAI-compatible data-plane routes and passthrough routes. For pip-installed deployments (non-Docker), the server defaults to binding 127.0.0.1, limiting exploitation to processes on the same host. Exploitation is further limited to services reachable from the proxy host's network namespace - cloud metadata endpoints (169.254.169.254) are reachable only from cloud-hosted deployments, and internal service access is scoped to the proxy host's network. Authorization header forwarding to attacker-controlled hosts requires an active client session with a bearer token to be in-flight. No privileged access, special configuration flag, or specific Headroom feature toggle beyond the default deployment is required for the SSRF condition itself. |
| Impact | The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/SC:H) assigns a 7.7 score reflecting network-accessible, zero-complexity, unauthenticated exploitation with high confidentiality impact on subsequent systems - an accurate characterization for docker-compose deployments. The critical aggravating factor beyond the CVSS score is Authorization header forwarding: an attacker can harvest API keys or bearer tokens passed by legitimate clients by designating an attacker-controlled host. Real-world risk is highly deployment-dependent: the pip console script defaults to 127.0.0.1 binding, confining the attack surface to local clients; however, the vendor-shipped docker-compose.yml overrides this to 0.0.0.0 and sets no HEADROOM_PROXY_TOKEN, exposing the data-plane globally on the published port. Organizations following the quickstart guide are therefore vulnerable without any misconfiguration on their part. No EPSS score or KEV listing is available in the provided data, so exploitation frequency cannot be quantified from signals beyond the vulnerability mechanics; the low product prevalence moderates aggregate real-world exposure but does not reduce per-instance risk for affected deployments. |
| Exploit ScenarioDerived | An attacker with network access to an internet-exposed Headroom instance running with the default docker-compose configuration sends a single HTTP request to a proxy data-plane route with the header x-headroom-base-url: http://169.254.169.254/latest/meta-data/iam/security-credentials/; the proxy fetches that URL from the EC2 instance metadata service and returns the IAM role credentials in the response body. In a second pass, the attacker replaces the base URL with an attacker-controlled server, then triggers a request from a legitimate client - the client's Authorization bearer token is forwarded to the attacker's server, yielding API credentials. No public exploit code has been identified, but the attack requires only standard HTTP client tooling and knowledge of the header name. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv2 – Aug 21, 2026
Server-side request forgery in Headroom LLM proxy (versions before 0.36.1) allows unauthenticated remote attackers to redirect proxy upstream requests to arbitrary internal, loopback, link-local, or RFC 1918 destinations - including cloud instance metadata endpoints such as 169.254.169.254 - by supplying a crafted x-headroom-base-url request header. The proxy returns upstream responses verbatim to the caller, disclosing internal service content; critically, it also forwards the original Authorization header to the attacker-designated host, enabling credential harvesting. Exploitation is trivially achievable against deployments using the vendor-shipped docker-compose.yml, which binds 0.0.0.0 and enforces no HEADROOM_PROXY_TOKEN by default - a configuration weakness the server itself warns about at startup. No public exploit or KEV listing is identified at time of analysis; a vendor patch is available in v0.36.1.
Earlier versions of this analysis (1)
Server-side request forgery in Headroom's LLM proxy allows unauthenticated network attackers to route proxy requests to loopback, link-local, RFC 1918, and cloud metadata addresses via the client-controlled x-headroom-base-url request header, with the upstream response returned directly to the caller. The reference docker-compose deployment ships with --host 0.0.0.0 and no required HEADROOM_PROXY_TOKEN - the configuration that existed until PR #2207 - making data-plane routes network-accessible without authentication and matching the CVSS PR:N rating. Forwarded Authorization headers compound the risk by exposing client credentials to attacker-designated hosts. No public exploit or CISA KEV listing is present, but the zero-prerequisite exploitation path on the shipped docker-compose configuration makes this a meaningful priority for affected operators.
RemediationAI
Upgrade Headroom to version 0.36.1 or later, which introduces upstream_guard.py to validate and restrict proxy upstream destinations; the fix is delivered via GitHub PR #2207 (https://github.com/headroomlabs-ai/headroom/pull/2207). Upstream fix is confirmed present at the tagged v0.36.1 release based on the presence of headroom/proxy/upstream_guard.py in that commit; independently verified patched release packaging is not confirmed beyond the GitHub tag. For deployments that cannot immediately upgrade, set HEADROOM_PROXY_TOKEN to a strong random value (openssl rand -hex 32) in your environment or .env file - this gates all data-plane routes and prevents unauthenticated SSRF exploitation from the network; note this does not eliminate the SSRF capability for authenticated clients. If running the docker-compose stack, update docker-compose.yml to require HEADROOM_PROXY_TOKEN using the :? syntax shown in PR #2207 so the stack refuses to start without a token. Additionally, restrict host-level network egress from the proxy container to block RFC 1918, loopback, and link-local ranges at the firewall or security group level; this eliminates SSRF reachability even if the header validation is bypassed, but may block legitimate internal upstream endpoints and must be tuned per deployment. On AWS, consider enabling IMDSv2 (token-required mode) as a defense-in-depth measure against metadata service access regardless of this patch.
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
Headroom is an LLM proxy (CPE: cpe:2.3:a:headroom_labs:headroom:*:*:*:*:*:*:*:*) that routes client requests to upstream AI provider APIs. The vulnerability exists in two functions: _resolve_openai_upstream_base in headroom/proxy/handlers/openai.py and _select_passthrough_base_url in headroom/providers/proxy_routes.py. Both read the x-headroom-base-url HTTP request header, parse it for a valid http/https scheme and hostname, and return it as the upstream destination without any allowlist or blocklist check against the resolved IP address space. CWE-918 (Server-Side Request Forgery) describes the root cause: the application issues server-side HTTP requests to a URL controlled by the client, making the proxy act as a network relay into otherwise-inaccessible address spaces. Cloud-hosted deployments are especially at risk because instance metadata services (AWS IMDSv1 at 169.254.169.254, GCP metadata at metadata.google.internal) are reachable from the proxy host and typically return sensitive data including IAM credentials without requiring authentication from the instance.
Know when Headroom 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:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N
Network-accessible via HTTP with no auth in docker-compose default; scope changes because SSRF crosses trust boundary into internal and metadata services with high confidentiality impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
3DescriptionCVE.org
Headroom's LLM proxy lets a client choose the upstream destination with the x-headroom-base-url request header. _resolve_openai_upstream_base in headroom/proxy/handlers/openai.py accepts the header value, requires only that it parse with an http or https scheme and a hostname, and returns it for use as the upstream base; _select_passthrough_base_url in headroom/providers/proxy_routes.py reads the same header for the passthrough routes. No check rejects loopback, link-local, or RFC 1918 destinations, and because the component is a proxy the upstream response is returned to the caller, so the request reaches internal services and cloud metadata addresses and their responses are disclosed. The Authorization header accompanying the request is forwarded unchanged to the caller-designated host. The pip console script binds 127.0.0.1 by default, but the reference docker-compose.yml ships --host 0.0.0.0 with published ports and no required HEADROOM_PROXY_TOKEN, which the server itself warns about at startup, so a deployment following the shipped compose exposes the affected data-plane routes to the network without authentication.
Executive ViewAI
Headroom LLM proxy versions before 0.36.1 are vulnerable to unauthenticated attacks that expose internal credentials and services to the internet. The vulnerability allows attackers to steal authentication tokens and access cloud infrastructure details, creating direct risk to backend systems and sensitive data. Patch availability makes remediation straightforward.
Apply vendor patch.
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.
Cross-user memory disclosure and tampering in Headroom's LLM proxy (versions before 0.36.1) lets a caller read or overwr
Cross-origin WebSocket hijacking in Headroom's proxy layer (prior to v0.35.0) allows an unauthenticated attacker-control
EUVD-2026-63904
GHSA-4j5r-9p93-j2px
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB