Back to Blog
high SEVERITY5 min read

undici 8.10.0 Cache Poisoning: CVE-2026-85152 Auth Bypass

undici, the HTTP client used by Node.js's `fetch()` implementation, shipped a caching layer that did not properly isolate cached responses by origin, letting a response poisoned on one origin be served to requests for another. This created a path to cross-origin authentication bypass, tracked as CVE-2026-85152 and fixed in undici 8.10.2.

O
By Orbis AppSec
•Technically reviewed by Anupam Mediratta•Published October 2, 2026•Reviewed October 2, 2026

Answer Summary

undici releases up to and including 8.10.0 (any version prior to 8.10.2) failed to key cached HTTP responses by origin. An attacker who could get a response cached could poison that shared cache so a victim's cross-origin request received the attacker's cached response, enabling an authentication bypass. The fix is to upgrade undici to 8.10.2, which the project's `package.json` and lockfile now pin via `^8.10.2`. No CWE has been assigned to CVE-2026-85152 at the time of writing.

Vulnerability at a Glance

cweunknown
fixUpgrade the `undici` dependency from 8.10.0 to 8.10.2
riskA response cached for one origin can be served to requests for a different origin, undermining origin-scoped auth
languageJavaScript (Node.js)
root causeundici's cache layer did not isolate cache entries by origin
vulnerabilityAuthentication bypass via cross-origin cache poisoning

Introduction

undici is the HTTP/1.1 client that powers Node.js's built-in fetch(), and increasingly it's the networking layer underneath frameworks that advertise "zero-dependency" HTTP. When undici added request/response caching behavior to speed up repeated fetch() calls, it introduced a new trust boundary: cached entries now need to be scoped correctly, or a response fetched for one origin can leak into a request for a completely different origin.

That's the shape of CVE-2026-85152: an authentication bypass via cross-origin cache poisoning due to missing origin isolation. In plain terms, undici's cache implementation didn't key stored responses tightly enough by origin, so a cached entry populated by (or on behalf of) one origin could be returned for a request targeting another. If an application relies on origin boundaries to separate authenticated sessions — which almost every browser-adjacent or multi-tenant HTTP client does — this is exactly the kind of bug that turns a caching optimization into an authentication bypass.

This fix landed in this repository as a routine-looking dependency bump: undici moved from ^8.10.0 to ^8.10.2 in both package.json and the lockfile. No application code changed, because the vulnerable logic lives inside the undici package itself, not in first-party code.

Affected Versions

Affected undici releases up to and including 8.10.0 (any version prior to 8.10.2)
Fixed in 8.10.2
Ecosystem npm
CVE / GHSA CVE-2026-85152 / not assigned
CWE unknown

If your package.json or lockfile pins undici below 8.10.2, you are on a vulnerable release line. There is no GHSA advisory yet, and the upstream fix commit's internals aren't publicly detailed beyond the CVE summary, so treat the version boundary above as the authoritative signal.

The Vulnerability Explained

The advisory description is specific about the mechanism: a missing origin isolation in undici's response cache allowed cross-origin cache poisoning, which in turn enabled an authentication bypass. The practical failure mode is straightforward even without seeing undici's internal cache-key logic: a caching layer that stores and retrieves entries without binding them tightly to the requesting origin will, under the right request sequence, return origin A's cached response to a lookup made on behalf of origin B.

Why does that matter for authentication specifically? Any system that treats "this response came back for my origin" as an implicit trust signal — session cookies scoped to an origin, CSRF tokens tied to a Referer, or simply the assumption that a cached 200 response reflects this caller's authorized state — breaks the moment the cache can be poisoned cross-origin. An attacker who can get undici to cache a favorable response (for example, a successful authentication or authorization response) can then force or wait for a victim's request to hit that same cache entry, effectively bypassing whatever check should have happened on the live request path.

The PR that applied this fix is honest about its scope — it's a lockfile bump, not a code review of the exploit path:

-        "undici": "^8.10.0",
+        "undici": "^8.10.2",
-      "version": "8.10.0",
+      "version": "8.10.2",

That's the entire visible diff: a version range change in package.json and the resolved version in package-lock.json. The vulnerable logic — the cache key construction and lookup inside undici — isn't part of this repository's code, which is exactly why the fix is "upgrade the dependency" rather than "patch a function."

Attack scenario: any service using this project's undici-based fetch() calls to reach multiple origins (a proxy, an aggregator, a multi-tenant backend) is a candidate. If an attacker-controlled origin can get a response cached by undici's shared cache store, and a legitimate request to a different, trusted origin later resolves against that poisoned entry, the attacker's response — or the attacker's authentication state — can be returned instead of the real one. For a service whose name suggests it proxies requests on behalf of users (as the package.json here, serving a request-proxying project, does), this is a direct path from "cache bug" to "auth bypass."

The Fix

The fix is entirely a dependency upgrade: undici is bumped from 8.10.0 to 8.10.2 in both the dependency declaration and the lockfile.

Before:

"undici": "^8.10.0"

After:

"undici": "^8.10.2"

Because the vulnerable code lives inside the undici package, there's no first-party function to patch here — the correct remediation is simply to pull in the version where upstream maintainers corrected the cache key logic to enforce origin isolation. The lockfile change ensures npm install resolves the patched release deterministically rather than silently continuing to install 8.10.0 under the same ^8.10.0 range.

One caveat worth repeating from the PR itself: this fix was applied because undici appears in the dependency tree, without confirming that this application's code actually exercises undici's cache interceptor. If your usage of undici/fetch() never enables caching, your practical exposure may be lower — but since the fix is a no-risk patch bump with no API changes, there's little reason to delay applying it regardless.

Key Takeaways

  • A caching layer is a second access-control surface — if it doesn't key strictly by origin, every assumption your authentication logic makes about "this is my response" can be violated.
  • undici patch releases (8.10.0 → 8.10.2) can carry security fixes with no corresponding API change, so don't assume patch bumps are purely cosmetic.
  • When a dependency fix PR admits "I have not verified that your code reaches the affected function," that's a prompt to check whether your fetch() usage actually enables undici's caching behavior — not a reason to skip the upgrade.
  • Lockfile-only diffs can carry high-severity fixes; reviewing package.json/package-lock.json changes with the same scrutiny as application code matters.

How Orbis AppSec Detected This

  • Source: cross-origin HTTP requests handled through undici's fetch() implementation and its response-caching layer
  • Sink: cache lookup/retrieval that returns a stored response without verifying it matches the requesting origin
  • Missing control: origin isolation in the cache key, allowing a response cached for one origin to be returned for another
  • CWE: unknown (not assigned in the source advisory)
  • Fix: upgrade the undici dependency from 8.10.0 to 8.10.2, which

Prevention and further reading

Frequently Asked Questions

Does upgrading `undici` from 8.10.0 to 8.10.2 change its public `fetch()` or cache interceptor API?

No. This was a patch-level bump (8.10.0 → 8.10.2) with no changelog indication of a breaking API change, so callers of undici's `fetch()` or dispatcher interceptors should not need code changes.

Was it confirmed that this project's code actually reaches undici's affected caching path for CVE-2026-85152?

No. The upgrade PR explicitly states the fix was applied because `undici` was present in the dependency tree, without verifying that the application's request path exercises the vulnerable cache logic.

Why do both `package.json` and `package-lock.json` need to change to apply the CVE-2026-85152 fix?

`package.json` declares the version range (`^8.10.2`), while `package-lock.json` pins the exact resolved version and integrity metadata actually installed; both must be updated for `npm install` to deterministically fetch 8.10.2 instead of 8.10.0.

View the Security Fix

Check out the pull request that fixed this vulnerability

View PR #20

Related Articles

critical

Hybridauth Telegram OAuth Timing Attack in `authenticateCheckError()`

The Telegram OAuth provider in Hybridauth relied on `strcmp()` to validate HMAC-SHA256 signatures, exposing a timing side-channel that could allow attackers to forge authentication tokens character by character. The fix replaces this with PHP's timing-safe `hash_equals()` function, eliminating the information leak.

critical

Node.js Auth Query SQL Injection via Group Code Interpolation

A sign-in authorization check built its SQL query by mapping an `authorizedGroups` array into quoted string literals and joining them directly into a template literal, creating a classic SQL injection point in a critical authentication path. The fix replaces every interpolated value — including the previously "typed" parameter — with `?` placeholders bound through a value-builder helper, closing off the injection vector entirely.

high

PHP session_start() Missing Secure Cookie Flags in lasturl.php

The `session_start()` call in the last URL tracking component failed to set secure session cookie parameters, allowing session hijacking via man-in-the-middle attacks on HTTP connections or XSS exploitation. The fix configures `session_set_cookie_params()` with `httponly`, `secure`, and `samesite` attributes before starting the session.

critical

Tung Tung Tracker Admin API: Missing Authentication in `/api/sync`

The Tung Tung Tracker administrative API endpoints (`/api/sync`, `/api/backfill`, `/api/show`, `/api/overlay/hide`) relied solely on localhost origin and a static `X-Tracker` header for protection, allowing any local process to execute privileged operations. The fix introduces proper session-based authentication and a random IPC secret for desktop-to-server communication.

critical

POST /api/generate Lacks Authentication, Allowing Unauthenticated

A resume generation endpoint in a Node.js backend accepted requests from any caller with network access, allowing attackers to consume OpenAI API quota without restriction. The vulnerability stemmed from missing authentication middleware on a cost-bearing endpoint. The fix adds mandatory API key validation via HTTP headers before processing any generation requests.

high

adm-zip 0.6.0 Preserves SUID Bits From ZIPs: CVE-2026-102282

The `adm-zip` dependency resolved to 0.6.0 in this project's dependency tree, a version affected by CVE-2026-102282: during extraction it applies the Unix permission bits stored in each ZIP entry's external file attributes verbatim, including the setuid (`04000`), setgid (`02000`), and sticky bits. An attacker who controls an archive passed to `extractAllTo()` or `extractEntryTo()` can therefore have the extractor create a setuid binary owned by whatever user the extraction process runs as. The