Skip to content
Heist/ feed
Back to feed
HighFix available

undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects

Type: advisorySources: OSV

### Impact When an originless `Agent` composes the redirect and cache interceptors as `compose(redirect(), cache())` with a shared cache (`type: 'shared'`), the cache builds its key from the original request URL before the redirect handler changes the origin. The response produced after a redirect is then stored under the original key, even when the redirect crossed to a different origin. An attacker who controls the target of a redirect from a trusted URL can have their response cached under that trusted URL. A later caller requesting the trusted URL receives the attacker's body from the shared cache without either origin being contacted, allowing persistent cache poisoning. The same key confusion also discloses private data: when an authenticated request returns a `private, no-store` redirect to a user-specific resource, the final response is stored under the original URL and can be served to a later unauthenticated caller. The cache interceptor was introduced in undici 7.0.0, and all 7.x and 8.x releases before the patched versions are affected. Applications are affected only when an originless `Agent`, a shared `MemoryCacheStore` or `SqliteCacheStore`, and the composition `compose(redirect(), cache())` are all used. Origin-bound `Client` and `Pool` dispatchers, and the reverse composition `compose(cache(), redirect())`, are not affected. ### Patches Upgrade to `7.30.1` or `8.12.2`. Before storing a response, undici now verifies that the origin that produced it still match

Products
undici
Affected versions
Not specified
Fixed versions
7.30.1, 8.12.2
CVEs
CVE-2026-109829
Confirmed fixed CVEs
Not specified
Updated in this feed
2 Nov 2026, 13:56 UTC · Revision 1

Source evidence

undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects

core-osv · Original source

Published 27 Oct 2026, 19:02 UTC

### Impact When an originless `Agent` composes the redirect and cache interceptors as `compose(redirect(), cache())` with a shared cache (`type: 'shared'`), the cache builds its key from the original request URL before the redirect handler changes the origin. The response produced after a redirect is then stored under the original key, even when the redirect crossed to a different origin. An attacker who controls the target of a redirect from a trusted URL can have their response cached under that trusted URL. A later caller requesting the trusted URL receives the attacker's body from the shared cache without either origin being contacted, allowing persistent cache poisoning. The same key confusion also discloses private data: when an authenticated request returns a `private, no-store` redirect to a user-specific resource, the final response is stored under the original URL and can be served to a later unauthenticated caller. The cache interceptor was introduced in undici 7.0.0, and all 7.x and 8.x releases before the patched versions are affected. Applications are affected only when an originless `Agent`, a shared `MemoryCacheStore` or `SqliteCacheStore`, and the composition `compose(redirect(), cache())` are all used. Origin-bound `Client` and `Pool` dispatchers, and the reverse composition `compose(cache(), redirect())`, are not affected. ### Patches Upgrade to `7.30.1` or `8.12.2`. Before storing a response, undici now verifies that the origin that produced it still match

osv:GHSA-4w7w-5xrc-9h26

undici

Fixed versions: 7.30.1

undici

Fixed versions: 8.12.2

Complete source record
{
  "id": "9f7a44fa71bccfd7024e462badf70b804abbea85399a5208a83aa7e1f1ccba66",
  "url": "https://osv.dev/vulnerability/GHSA-4w7w-5xrc-9h26",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "undici vulnerable to cache poisoning and cross-user disclosure via cross-origin redirects",
    "summary": "### Impact When an originless `Agent` composes the redirect and cache interceptors as `compose(redirect(), cache())` with a shared cache (`type: 'shared'`), the cache builds its key from the original request URL before the redirect handler changes the origin. The response produced after a redirect is then stored under the original key, even when the redirect crossed to a different origin. An attacker who controls the target of a redirect from a trusted URL can have their response cached under that trusted URL. A later caller requesting the trusted URL receives the attacker's body from the shared cache without either origin being contacted, allowing persistent cache poisoning. The same key confusion also discloses private data: when an authenticated request returns a `private, no-store` redirect to a user-specific resource, the final response is stored under the original URL and can be served to a later unauthenticated caller. The cache interceptor was introduced in undici 7.0.0, and all 7.x and 8.x releases before the patched versions are affected. Applications are affected only when an originless `Agent`, a shared `MemoryCacheStore` or `SqliteCacheStore`, and the composition `compose(redirect(), cache())` are all used. Origin-bound `Client` and `Pool` dispatchers, and the reverse composition `compose(cache(), redirect())`, are not affected. ### Patches Upgrade to `7.30.1` or `8.12.2`. Before storing a response, undici now verifies that the origin that produced it still match",
    "evidence": "osv:GHSA-4w7w-5xrc-9h26",
    "products": [
      {
        "name": {
          "value": "undici",
          "evidence": "/affected/0/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "7.30.1",
            "evidence": "/affected/0/ranges"
          }
        ],
        "affected_versions": []
      },
      {
        "name": {
          "value": "undici",
          "evidence": "/affected/1/package/name"
        },
        "prerequisites": [],
        "fixed_versions": [
          {
            "value": "8.12.2",
            "evidence": "/affected/1/ranges"
          }
        ],
        "affected_versions": []
      }
    ],
    "severity": "high",
    "structured": {
      "id": "GHSA-4w7w-5xrc-9h26",
      "aliases": [
        "CVE-2026-109829",
        "GHSA-4w7w-5xrc-9h26"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "7.0.0"
                },
                {
                  "fixed": "7.30.1"
                }
              ]
            }
          ],
          "package": {
            "name": "undici",
            "purl": "pkg:npm/undici",
            "ecosystem": "npm"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-4w7w-5xrc-9h26/GHSA-4w7w-5xrc-9h26.json"
          }
        },
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "8.0.0"
                },
                {
                  "fixed": "8.12.2"
                }
              ]
            }
          ],
          "package": {
            "name": "undici",
            "purl": "pkg:npm/undici",
            "ecosystem": "npm"
          },
          "database_specific": {
            "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-4w7w-5xrc-9h26/GHSA-4w7w-5xrc-9h26.json"
          }
        }
      ],
      "modified": "2026-10-27T19:15:22.403656345Z",
      "provider": "osv",
      "references": [
        "https://github.com/nodejs/undici/security/advisories/GHSA-4w7w-5xrc-9h26",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-109829",
        "https://github.com/nodejs/undici/commit/26c2bfb3def0b67241ce878e80657ed5d6c3efa8",
        "https://github.com/nodejs/undici/commit/b20b82ad80a405a12b6ce1f341bcd418de390aa0",
        "https://cna.openjsf.org/security-advisories.html",
        "https://github.com/nodejs/undici",
        "https://github.com/nodejs/undici/releases/tag/v7.30.1",
        "https://github.com/nodejs/undici/releases/tag/v8.12.2"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-346",
          "CWE-524"
        ],
        "severity": "HIGH",
        "github_reviewed": true,
        "nvd_published_at": "2026-10-15T19:17:21Z",
        "github_reviewed_at": "2026-10-27T19:02:31Z"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-109829",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/database_specific/severity"
  },
  "source_id": "core-osv",
  "document_id": 484990,
  "published_at": "2026-10-27T19:02:31+00:00"
}