A shared hotel-room key that opens every room on the floor because nobody stamped the room number on it
CVE-2026-85152 affects undici 8.10.0 and 8.10.1 only. When an application composes the interceptors.cache() or interceptors.deduplicate() interceptor with a dispatcher that handles requests to multiple origins, the destination origin is omitted from the cache and deduplication keys. This means two requests to *different* origins but with the same method, path, and qualifying headers will collide — an attacker-controlled origin's response can be served in place of a trusted origin's response. The chain can escalate to JWKS cache poisoning (accepting attacker-signed JWTs as if they came from a legitimate issuer) in applications that fetch signing keys from multiple issuers through the same undici dispatcher with caching enabled.
The vendor scored this HIGH 7.4 with AC:H already baked in, acknowledging the multi-origin dispatcher prerequisite. That's fair as a *theoretical ceiling*, but it overstates the risk for most enterprises. The cache and deduplicate interceptors are opt-in — they are not enabled by default and were introduced relatively recently in undici's interceptor API. The affected version window is razor-thin: only two minor releases (8.10.0, 8.10.1) before the fix in 8.10.2. No exploitation in the wild has been observed, no public PoC exists yet, and the CVE is not KEV-listed. For the vast majority of Node.js deployments that either don't use undici directly, don't use these interceptors, or aren't on the narrow affected range, this is noise.
4 steps from start to impact.
Application uses undici cache/deduplicate interceptor with multi-origin dispatcher
interceptors.cache() or interceptors.deduplicate() onto a dispatcher (e.g., Agent, Pool, Client) that makes requests to more than one origin. This is common in BFF (backend-for-frontend) patterns and API gateway services that proxy upstream microservices. Without this specific configuration, the vulnerability is not reachable.- Application runs undici 8.10.0 or 8.10.1
- Cache or deduplicate interceptor is explicitly enabled
- Single dispatcher handles ≥2 distinct origins
- Cache/deduplicate interceptors are opt-in; most apps use undici without them
- Many deployments pin to LTS Node.js which bundles older undici versions
- Developers using separate Pool/Client per origin are not affected
npm ls undici will flag the GHSA. Snyk, Socket, and Dependabot should alert within 48 hours of the GHSA publication.Attacker controls one upstream origin's responses
Cache-Control headers, 200 OK status).- Application proxies to or fetches from an attacker-influenced origin
- Attacker can set response body and headers on that origin
- Most server-to-server calls go to trusted internal services, not attacker-controlled endpoints
- Strict allowlists on upstream origins reduce exposure
- mTLS between services would not prevent this but limits who can be an upstream
Cache key collision with trusted origin
GET /.well-known/openid-configuration or GET /.well-known/jwks.json) hits the poisoned cache entry. The application receives the attacker's response as if it came from the trusted origin.- Method + path + headers match between attacker and target origin
- Attacker's response has cache-eligible headers
- Legitimate request occurs within the cache TTL
- Path collisions between origins are not guaranteed — different APIs often have different paths
- Short cache TTLs reduce the exploitation window
- Deduplicate interceptor requires concurrent in-flight requests to the same path
Impact: cross-origin data substitution or JWKS poisoning
- Application uses cached JWKS keys for JWT validation
- Application fetches JWKS from ≥2 issuers through the same dispatcher
- Most JWT validation libraries (e.g., jose, jsonwebtoken) manage their own JWKS caching, bypassing undici's cache interceptor
- OIDC libraries like get-jwks have their own fetch/cache logic
- The JWKS poisoning chain requires a very specific architectural choice
The supporting signals.
| In-the-wild exploitation | None observed. Not KEV-listed. No campaign reporting as of 2026-09-05. |
|---|---|
| Proof-of-concept | No public PoC. Disclosed 2026-09-04; advisory describes the attack conceptually but no weaponized code is available. |
| EPSS | Not yet scored. CVE was published <48 hours ago; EPSS model has not ingested it. Expect low percentile given the opt-in prerequisite. |
| KEV status | Not listed on CISA KEV as of 2026-09-05. |
| CVSS vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N — Network-reachable, high complexity, no privileges needed, no user interaction. Confidentiality and integrity impact are high; no availability impact. |
| Affected versions | undici 8.10.0 and 8.10.1 only. Earlier 8.x and all 7.x releases are unaffected. |
| Fixed version | undici 8.10.2 (adds origin to cache and deduplication keys). |
| Scanning / exposure | This is a library-level vuln, not a network-exposed service. Shodan/GreyNoise/Censys are not applicable. Exposure is determined by SBOM/dependency scanning (npm audit, Snyk, Socket, Dependabot). |
| Disclosure date | 2026-09-04 via GitHub Security Advisory GHSA-vp8m-p9jh-q5pm. |
| Reporter / credit | Reported through undici's coordinated disclosure process. Specific researcher not publicly credited at time of writing. |
noisgate verdict.
The single most decisive factor is the extremely narrow affected version range (only 8.10.0 and 8.10.1) combined with the opt-in nature of the cache/deduplicate interceptors, which means the reachable population is a small fraction of undici's already-large install base. The theoretical JWKS-poisoning chain is severe but requires a specific multi-issuer, single-dispatcher, cache-interceptor architecture that represents well under 1% of real-world undici deployments.
Why this verdict
- Narrow version window: Only undici 8.10.0 and 8.10.1 are affected — released August 3 and ~September 1, 2026 respectively. Any organization not aggressively tracking undici minor releases is likely still on 8.9.x or 7.x and is unaffected.
- Opt-in interceptors: The
interceptors.cache()andinterceptors.deduplicate()APIs are not enabled by default. An application developer must explicitly compose them. This is a gating prerequisite that eliminates the majority of undici consumers. - Multi-origin dispatcher prerequisite: The vulnerability only fires when a single dispatcher handles requests to ≥2 origins. Applications using per-origin
ClientorPoolinstances (the common pattern for connection pooling) are not vulnerable. - Role multiplier: undici is a general-purpose Node.js HTTP client library, not a canonically high-value-role component. *High-value scenario:* An API gateway or BFF service using undici's cache interceptor to fetch JWKS from multiple OIDC issuers — chain ends in token forgery (identity-tier blast radius). However, this requires the app to bypass dedicated JWKS libraries (get-jwks, jose) in favor of raw undici cache, which is architecturally unusual. Estimated <0.5% of the affected-version installed base occupies this role. The floor test does not trigger because the high-value role share is well below the 1% threshold.
- No exploitation signal: Zero in-the-wild activity, no PoC, no KEV listing. The CVSS
AC:Halready penalizes complexity but does not capture the opt-in and version-range friction.
Why not higher?
Upgrading to HIGH would require either evidence of active exploitation, a broader affected version range, or the interceptors being enabled by default. None of these conditions are met. The JWKS-poisoning chain, while theoretically severe, demands an unusual architectural stack that most Node.js applications don't use — the realistic blast radius for typical deployments is cross-origin data leakage in a backend service, not fleet-wide identity compromise.
Why not lower?
The vulnerability is network-reachable with no authentication required (PR:N), and the theoretical impact on confidentiality and integrity is genuinely high when the chain lands. A PoC could emerge quickly given the straightforward mechanics (cache key missing a field), and JWKS-poisoning scenarios — however unlikely — have outsized downstream consequences. Dropping below MEDIUM would understate the risk for the small population that IS exposed.
What to do — in priority order.
- Pin or upgrade undici to 8.10.2+ — The definitive fix. Run
npm audit fixornpm install [email protected]in affected projects. This adds the destination origin to cache and deduplication keys. No mitigation SLA applies at MEDIUM — go straight to the 365-day remediation window, though the trivial fix cost justifies doing it this week. - Use per-origin dispatchers — If you cannot upgrade immediately, ensure each upstream origin gets its own
PoolorClientinstance rather than sharing a singleAgentacross origins. This prevents cross-origin key collisions regardless of the bug. Review your undici dispatcher topology. - Disable cache/deduplicate interceptors temporarily — If the interceptors are not performance-critical, remove
interceptors.cache()andinterceptors.deduplicate()from your dispatcher composition until you upgrade. This eliminates the vulnerability at the cost of increased upstream request volume. - Audit SBOM for undici 8.10.0–8.10.1 — Run
npm ls undiciacross all Node.js services to identify which projects transitively depend on the affected versions. Prioritize services that act as API gateways, BFFs, or OIDC/JWKS consumers.
- WAF rules — the cache poisoning happens server-side inside the Node.js process; no network-layer device can observe or block the cache key collision.
- Network segmentation — isolating the Node.js service from untrusted networks does not help if the application itself fetches from an attacker-influenced upstream origin as part of its normal operation.
- Upgrading Node.js without upgrading undici — if undici is installed as a direct dependency (not the Node.js-bundled copy), upgrading Node.js alone does not change the undici version.
Crowdsourced verification payload.
Run this on any host or CI runner with Node.js and npm/npx available. No special privileges required. Invoke: bash check_cve_2026_85152.sh /path/to/project where the argument is the root of a Node.js project with a node_modules directory.
#!/usr/bin/env bash
# check_cve_2026_85152.sh — Detect undici versions affected by CVE-2026-85152
# Usage: bash check_cve_2026_85152.sh /path/to/node/project
# Exit codes: 0 = PATCHED/not present, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
PROJECT_DIR="${1:-.}"
if [ ! -d "$PROJECT_DIR/node_modules" ]; then
echo "UNKNOWN — no node_modules found in $PROJECT_DIR"
exit 2
fi
# Find all installed undici versions
VULN_FOUND=0
while IFS= read -r pkg_json; do
version=$(node -e "try { console.log(require('$pkg_json').version) } catch(e) { console.log('') }" 2>/dev/null || true)
if [ -z "$version" ]; then
continue
fi
case "$version" in
8.10.0|8.10.1)
echo "VULNERABLE — undici $version found at $pkg_json"
VULN_FOUND=1
;;
*)
echo "PATCHED — undici $version found at $pkg_json (not affected)"
;;
esac
done < <(find "$PROJECT_DIR/node_modules" -path '*/undici/package.json' -not -path '*/node_modules/*/node_modules/*' 2>/dev/null)
if [ "$VULN_FOUND" -eq 1 ]; then
exit 1
fi
# Check if undici was found at all
if ! find "$PROJECT_DIR/node_modules" -path '*/undici/package.json' -print -quit 2>/dev/null | grep -q .; then
echo "PATCHED — undici not installed in this project"
fi
exit 0If you remember one thing.
npm install [email protected]), so there is no reason to wait. Monday morning: run npm ls undici across your Node.js fleet, identify any services on 8.10.0 or 8.10.1, and upgrade them in your next deployment cycle. Prioritize any service that acts as an API gateway, BFF, or OIDC consumer using undici's cache or deduplicate interceptors — those have the highest theoretical blast radius. If you cannot upgrade immediately, switch to per-origin dispatchers or disable the cache/deduplicate interceptors as a compensating control. There is no active exploitation and no public PoC, so this is a scheduled-maintenance item, not an emergency.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.