← Back to Feed CACHED · 2026-09-04 17:56:44 · CACHE_KEY CVE-2026-85152
CVE-2026-85152 · CWE-346 · Disclosed 2026-09-04

undici 8.10.0 omits the destination origin from the cache and request-deduplication keys when the cache or…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Opt-in interceptors + 2-version window = downgrade; monitor for JWKS-poisoning chain POCs"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Application uses undici cache/deduplicate interceptor with multi-origin dispatcher

The target Node.js application must explicitly compose 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.
Conditions required:
  • Application runs undici 8.10.0 or 8.10.1
  • Cache or deduplicate interceptor is explicitly enabled
  • Single dispatcher handles ≥2 distinct origins
Where this breaks in practice:
  • 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
Detection/coverage: npm audit / npm ls undici will flag the GHSA. Snyk, Socket, and Dependabot should alert within 48 hours of the GHSA publication.
STEP 02

Attacker controls one upstream origin's responses

The attacker must be able to influence the HTTP responses returned by one of the origins the application talks to. This could be a public third-party API, a user-supplied webhook URL, or a compromised internal microservice. The attacker crafts responses that are cacheable (appropriate Cache-Control headers, 200 OK status).
Conditions required:
  • Application proxies to or fetches from an attacker-influenced origin
  • Attacker can set response body and headers on that origin
Where this breaks in practice:
  • 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
STEP 03

Cache key collision with trusted origin

Because the origin is not part of the cache key, the attacker's response is stored under a key based on method + path + qualifying headers only. A subsequent legitimate request to a *different* trusted origin with the same path (e.g., 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.
Conditions required:
  • Method + path + headers match between attacker and target origin
  • Attacker's response has cache-eligible headers
  • Legitimate request occurs within the cache TTL
Where this breaks in practice:
  • 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
Detection/coverage: Application-level logging comparing response bodies to expected schemas would catch anomalies. WAF rules are not applicable here as the poisoning happens server-side.
STEP 04

Impact: cross-origin data substitution or JWKS poisoning

The poisoned cache entry causes the application to act on attacker-controlled data as if it were from a trusted source. In the worst case — JWKS poisoning — the application caches the attacker's public key set as the trusted issuer's JWKS, allowing the attacker to forge JWTs that pass signature validation. This grants unauthorized access to any resource protected by that JWT validation logic.
Conditions required:
  • Application uses cached JWKS keys for JWT validation
  • Application fetches JWKS from ≥2 issuers through the same dispatcher
Where this breaks in practice:
  • 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
Detection/coverage: JWT validation failures from legitimate tokens would be a symptom. Monitoring for unexpected JWKS key IDs in validated tokens would detect this.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. Not KEV-listed. No campaign reporting as of 2026-09-05.
Proof-of-conceptNo public PoC. Disclosed 2026-09-04; advisory describes the attack conceptually but no weaponized code is available.
EPSSNot yet scored. CVE was published <48 hours ago; EPSS model has not ingested it. Expect low percentile given the opt-in prerequisite.
KEV statusNot listed on CISA KEV as of 2026-09-05.
CVSS vectorCVSS: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 versionsundici 8.10.0 and 8.10.1 only. Earlier 8.x and all 7.x releases are unaffected.
Fixed versionundici 8.10.2 (adds origin to cache and deduplication keys).
Scanning / exposureThis 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 date2026-09-04 via GitHub Security Advisory GHSA-vp8m-p9jh-q5pm.
Reporter / creditReported through undici's coordinated disclosure process. Specific researcher not publicly credited at time of writing.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.5/10)

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.

HIGH Vulnerability mechanics and affected version range
MEDIUM Fraction of deployments using cache/deduplicate interceptors
LOW Downstream JWKS-poisoning chain feasibility in production

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() and interceptors.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 Client or Pool instances (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:H already 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.

05 · Compensating Control

What to do — in priority order.

  1. Pin or upgrade undici to 8.10.2+ — The definitive fix. Run npm audit fix or npm 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.
  2. Use per-origin dispatchers — If you cannot upgrade immediately, ensure each upstream origin gets its own Pool or Client instance rather than sharing a single Agent across origins. This prevents cross-origin key collisions regardless of the bug. Review your undici dispatcher topology.
  3. Disable cache/deduplicate interceptors temporarily — If the interceptors are not performance-critical, remove interceptors.cache() and interceptors.deduplicate() from your dispatcher composition until you upgrade. This eliminates the vulnerability at the cost of increased upstream request volume.
  4. Audit SBOM for undici 8.10.0–8.10.1 — Run npm ls undici across 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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 0
07 · Bottom Line

If you remember one thing.

TL;DR
This is a MEDIUM after reassessment — no mitigation SLA applies under the noisgate framework, so go straight to the 365-day noisgate remediation SLA. That said, the fix is a one-line version bump (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

  1. GitHub Security Advisory GHSA-vp8m-p9jh-q5pm
  2. undici GitHub Releases
  3. undici npm package
  4. undici Security Advisories (GitLab GLAD)
  5. Snyk — undici security vulnerabilities
  6. stack.watch — undici 2026 vulnerabilities
  7. Node.js undici repository
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.