undici vulnerable to caching and replay of unsafe HTTP method responses
### Impact undici's `interceptors.cache()` documents that it caches only safe HTTP methods. However, its internal skip-list is built by subtracting the configured methods from the safe-methods set, so an unsafe method (`POST`, `PUT`, `PATCH`, `DELETE`) never lands in the skip-list and is looked up against the cache store. Combined with the storage gate (`canCacheResponse`) having no method check, a heuristically-cacheable response (for example a `404`) with an explicit `Cache-Control: max-age=...` to an unsafe method is stored and replayed on a subsequent identical request. The application's state-changing request never reaches the origin, and undici serves a fabricated response from the cache instead. This occurs with the default configuration (`methods: ['GET']`), which the public API does not allow widening to unsafe methods, so no application misuse is required; an untrusted origin can trigger it purely through its own response headers. ### Patches Upgrade to `7.29.1` or `8.10.2`. The cache interceptor no longer reads from or writes to the cache for unsafe HTTP methods, while still invalidating existing cache entries on successful unsafe requests. ### Workarounds None.
GHSA-8436-99hf-9mmv
Primary source · Revision 1
Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.
Security context
Source reference: osv:GHSA-8436-99hf-9mmv
undici
Source reference: /affected/0/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 7.29.1
Source reference:
/affected/0/ranges - Prerequisites
- Not stated in this record
undici
Source reference: /affected/1/package/name
- Affected versions
- Not stated in this record
- Fixed versions
- 8.10.2
Source reference:
/affected/1/ranges - Prerequisites
- Not stated in this record
Structured affected-version data
Original package identities and version rules from this source.
[
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "7.0.0"
},
{
"fixed": "7.29.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/09/GHSA-8436-99hf-9mmv/GHSA-8436-99hf-9mmv.json"
}
},
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "8.0.0"
},
{
"fixed": "8.10.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/09/GHSA-8436-99hf-9mmv/GHSA-8436-99hf-9mmv.json"
}
}
]- Related CVEs
- CVE-2026-85008
Source reference:
/aliases
Publisher severity
low
Source reference: /database_specific/severity
- Event
- #31146 · Revision 1
- Added to Heist Feed
- Publisher date