Skip to main content

Headroom EUVDEUVD-2026-63905

| CVE-2026-77776 CRITICAL
Authorization Bypass Through User-Controlled Key (CWE-639)
2026-08-21 VulnCheck GHSA-5vg3-c628-vf56
9.3
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach exposed 0.0.0.0 proxy port
  2. Delivery
    Send request with forged x-headroom-user-id header
  3. Exploit
    Proxy trusts header as owner identity
  4. Execution
    Read or overwrite victim's stored LLM memory
  5. Impact
    Exfiltrate secrets or poison future model context

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
Exploitation Conditions

The affected data-plane routes must be network-reachable, which is the case for deployments following the shipped docker-compose.yml (--host 0.0.0.0, published ports, and no HEADROOM_PROXY_TOKEN set). Under those conditions exploitation is remote and unauthenticated (CVSS PR:N/UI:N): the attacker only needs to send the x-headroom-user-id header naming a target user against the chat-completion or websocket path and know or guess a victim's identifier. Limiting factors: the pip console script binds 127.0.0.1 by default, so a loopback-only install is not remotely exploitable; deployments that set a proxy token or restrict the bind/published port to loopback are protected; and the attacker must reach the exposed port and reference a valid user identifier.

Impact

This is a genuine high-priority issue for network-exposed deployments, not merely a high-CVSS paper cut. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H) rates it 9.3, and the mechanism supports that: forging one header value yields both read and write access to another user's memory with no authentication and no user interaction. The critical caveat is deployment-dependent - the pip console script binds 127.0.0.1 and is not remotely reachable, so the network-unauthenticated rating applies specifically to installs following the reference docker-compose.yml, which ships --host 0.0.0.0 with published ports and no mandatory proxy token (a state the server itself warns about at startup). EPSS is not provided and this is not on CISA KEV, so widespread automated exploitation is not evidenced; the realistic risk is targeted abuse against any operator who deployed the stock compose file on a reachable network. Any team running the Docker reference deployment should treat patching to 0.36.1 as urgent, since memory poisoning can also feed manipulated context back into downstream LLM interactions.

Exploit ScenarioDerived

An attacker who can reach a Headroom proxy deployed via the stock docker-compose (0.0.0.0, no token) sends a chat-completion or websocket request with x-headroom-user-id set to a victim's identifier. The proxy treats that header as the authenticated owner, returning the victim's stored LLM memory and accepting writes to it. No exploit code is published, but the attack is trivial to reproduce from the description and PR diff, requiring only a crafted HTTP header.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv2 – Aug 21, 2026

Cross-user memory disclosure and tampering in Headroom's LLM proxy (versions before 0.36.1) lets a caller read or overwrite any user's stored LLM memory by simply naming another user's identifier in the client-supplied x-headroom-user-id request header. The proxy trusts this header as the authenticated identity across the chat-completion and websocket data-plane paths in headroom/proxy/handlers/openai.py, with nothing binding the value to the actual caller. The console script binds loopback by default, but the shipped docker-compose.yml publishes the proxy on 0.0.0.0 with no required proxy token, so a stock Docker deployment exposes these routes to the network unauthenticated. Reported by VulnCheck; no public exploit identified at time of analysis.

Earlier versions of this analysis (1)
v1 Aug 21, 2026 - 11:50 CVSS 9.1

Cross-user memory access in Headroom's LLM proxy (through v0.29.0-era builds, fixed in v0.36.1) lets a caller impersonate any user by setting the x-headroom-user-id request header, which the proxy trusts as an authenticated identity without binding it to the caller. Any client that can reach the chat-completion or websocket routes can read or overwrite another user's stored LLM memory. Reported by VulnCheck; no public exploit identified at time of analysis and the flaw is not listed in CISA KEV.

RemediationAI

Vendor-released patch: upgrade to Headroom 0.36.1 or later (PR #2207), which adds resolve_memory_identity so the x-headroom-user-id header is honored only for loopback or allowlisted callers and identity is otherwise bound to the proxy-token fingerprint or OS user. If you cannot upgrade immediately, do not expose the proxy on the network: keep the bind on 127.0.0.1 (the pip console-script default) rather than 0.0.0.0, and if you use the reference docker-compose, set a strong HEADROOM_PROXY_TOKEN (openssl rand -hex 32) and confine the published port to host loopback so the data plane is never open without a token - note the trade-off that this removes remote/multi-host access. Additionally set NEO4J_AUTH to non-default credentials and keep the Neo4j Bolt port loopback-only, and leave Neo4j APOC file import/export disabled, since the same advisory/PR flags the shipped default Neo4j password and APOC settings as an exposed-database risk. Advisory and patch: https://github.com/headroomlabs-ai/headroom/pull/2207 and https://www.vulncheck.com/advisories/headroom-proxy-treats-the-client-supplied-x-headroom-user-id-header-as-an-authenticated-identity.

Affected VersionsENISA

Headroom 0 <0.36.1

Affected Packages

euvd headroom fix: 0.36.1

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/memory layer (CPE cpe:2.3:a:headroom_labs:headroom) that stores per-user memory a model can read and write. The vulnerability is a classic CWE-639 (Authorization Bypass Through User-Controlled Key / IDOR): the memory owner is derived from an attacker-controllable request header rather than from an authenticated session or credential. Because the identifier IS the authorization key and is caller-supplied, any value the client sends is honored. The fix (PR #2207) centralizes identity resolution in a new headroom/proxy/identity.py resolve_memory_identity seam that only honors the header for loopback or explicitly allowlisted callers, and otherwise binds identity to the proxy-token fingerprint or the OS user. The same PR hardens the deployment surface: docker-compose now requires HEADROOM_PROXY_TOKEN and NEO4J_AUTH (removing published default credentials), keeps the Neo4j Bolt port loopback-only, and leaves APOC file import/export disabled.

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

Vendor (VulnCheck) PRIMARY 9.3 CRITICAL
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
vuln.today AI 9.1 CRITICAL

Network-reachable exposed compose deployment needs no auth or interaction (AV:N/AC:L/PR:N/UI:N); forged header grants read and write to another user's memory (C:H/I:H), no availability impact.

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

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

3
CVSS changed
Aug 21, 2026 - 12:22 NVD
9.1 (CRITICAL) 9.3 (CRITICAL)
Patch available
Aug 21, 2026 - 12:01 EUVD
CVE Published
Aug 21, 2026 - 11:22 cve.org
CRITICAL 9.1

DescriptionCVE.org

Headroom's LLM proxy derives the memory owner from the x-headroom-user-id request header. The header is read directly at several points in headroom/proxy/handlers/openai.py, including the chat completion and websocket paths, and nothing binds the value to the caller. A client can therefore name another user's identifier and read or write that user's stored LLM memory. The fix introduces a single resolve_memory_identity seam in headroom/proxy/identity.py that honors the header only for loopback or allowlisted callers and otherwise binds the identity to the proxy-token fingerprint or the operating system user. 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

Why It Matters

Headroom LLM proxy versions before 0.36.1 contain a critical authentication bypass that allows any network user to read and modify other users' stored LLM conversation data without requiring credentials. The standard Docker deployment configuration exposes the vulnerable proxy to the network unauthenticated, putting all user data at immediate risk of cross-user breaches.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 72% exploitable
Prevalence
Low
niche AI LLM-memory proxy, limited real-world enterprise footprint
Social Media
5
Sightings
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
Very High
Technical Impact
Total

Priority Score

46
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

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