Like a mail clerk who stops reading a package after it gets too heavy and marks it 'delivered' anyway
CVE-2026-84947 affects undici's optional interceptors.dump() feature, which reads and discards HTTP response bodies up to a configurable maxSize (default 1 MiB). When an upstream server sends a chunked transfer-encoded response without a Content-Length header that exceeds maxSize, the interceptor terminates early but fails to properly abort the underlying request. The downstream application receives a misleading HTTP 200 status with a silently truncated body. Affected versions are v7.1.0 through v7.29.0 and v8.0.0 through v8.10.1, fixed in v7.29.1 and v8.10.2.
The vendor rated this LOW at CVSS 3.7, and that rating is accurate. The dump interceptor is explicitly opt-in — developers must manually compose it into their dispatcher chain. The attack requires a *malicious or compromised upstream server* sending specially crafted chunked responses, which already assumes significant attacker positioning. The impact is purely integrity-related: a truncated response body. There is no confidentiality breach, no remote code execution, and no denial of service. For the narrow population of Node.js applications that both use interceptors.dump() AND consume bodies from untrusted upstreams, this is a real but bounded concern.
3 steps from start to impact.
Application uses opt-in dump interceptor
interceptors.dump() into its undici dispatcher chain. This is not a default configuration — developers add it to maintain connection health by discarding response bodies after error responses. Without this opt-in, the vulnerability is not reachable.- Application imports and composes
interceptors.dump()on its Agent, Client, or Pool
- The dump interceptor is one of eight optional interceptors; most undici users never enable it
- Typical use case is discarding error response bodies, not processing trusted content
Attacker controls upstream HTTP server
Content-Length header, with a body exceeding the configured maxSize.- Attacker controls or compromises an upstream endpoint the application fetches from
- Response uses chunked transfer encoding without Content-Length
- Requires attacker to be the upstream server or perform MITM — not a client-side attack
- Most internal Node.js services talk to trusted backends, not arbitrary external endpoints
Response exceeds maxSize and triggers silent truncation
maxSize (default 1 MiB), the dump interceptor terminates early but fails to properly abort the request. Instead of raising a RequestAbortedError, it passes a 200 status with a truncated body to the application. The application processes incomplete data as if it were a successful, complete response.- Response body exceeds the configured
maxSizelimit - Response lacks Content-Length header
- Default maxSize is 1 MiB — response must exceed this threshold
- Applications that validate response integrity (checksums, JSON schema validation) will catch the truncation
The supporting signals.
| In-the-wild exploitation | None observed. No known campaigns, no mentions in threat intel feeds as of 2026-09-05. |
|---|---|
| Proof-of-concept | Not publicly available. No PoC repos found. Exploitation is trivial to construct (any HTTP server sending large chunked responses) but impact is minimal. |
| EPSS score | Not yet scored — CVE disclosed 2026-09-04, EPSS data typically lags 24-48 hours. Expected to be very low given the opt-in prerequisite and integrity-only impact. |
| KEV status | Not listed. No CISA KEV entry. |
| CVSS vector | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N — Network-reachable but high complexity, no privileges required, integrity-only impact. The AC:H reflects the opt-in nature and specific chunked-encoding precondition. |
| Affected versions | undici v7.1.0–v7.29.0 and v8.0.0–v8.10.1. Earlier v6.x line is not affected. |
| Fixed versions | v7.29.1 and v8.10.2. Patch enforces maxSize on both declared and received body sizes, aborting with RequestAbortedError instead of returning incomplete responses. |
| Scanning/exposure data | undici has ~113–157M weekly npm downloads, but the dump interceptor is opt-in. No Shodan/GreyNoise/Censys exposure surface — this is a library-level issue, not a network service. |
| Disclosure date | 2026-09-04 via GitHub Security Advisory GHSA-2gqq-gqf2-x968. |
| Reporter | Not publicly attributed in the advisory. |
noisgate verdict.
The single most decisive factor is that the dump interceptor is opt-in — it requires explicit developer action to enable, limiting the reachable population to a small fraction of undici's installed base. Combined with integrity-only impact (truncated response body, no RCE or data leak) and the requirement that the attacker control an upstream server, the vendor's LOW rating accurately reflects real-world risk.
Why this verdict
- Opt-in gating: The dump interceptor must be explicitly composed into the dispatcher chain. This is not a default behavior of undici or Node.js's built-in
fetch(). The reachable population is a small subset of undici's ~150M weekly downloads. - Attacker positioning: Exploitation requires the attacker to *be* or *control* the upstream HTTP server, or perform a network-level MITM. This is a server-side positioning requirement that dramatically narrows real-world exploitability.
- Integrity-only, bounded blast radius: The impact is a silently truncated response body. There is no path to code execution, privilege escalation, or data exfiltration. Applications with any form of response validation (JSON parsing, checksums, schema validation) will detect the truncation immediately.
- Role multiplier: undici is a general-purpose HTTP client library. In high-value roles (CI/CD pipelines fetching artifacts, API gateways proxying traffic), the dump interceptor could cause corrupted data to propagate — but only if explicitly enabled AND the upstream is malicious. In proxy/gateway deployments, dump is atypical because those applications *forward* response bodies rather than discard them. The blast radius even in worst-case scenarios is limited to a single truncated response per request, not fleet-scale or identity-scale compromise. No high-value role floor is triggered.
Why not higher?
There is no path to remote code execution, privilege escalation, or confidentiality breach. The feature is opt-in, requiring explicit developer action to enable the vulnerable code path. The attacker must already control an upstream server — a position that typically implies the attacker already has more impactful options than sending a truncated response.
Why not lower?
The vulnerability is real and can cause silent data corruption in applications that trust response integrity without secondary validation. In proxy or gateway patterns where the dump interceptor is used (however rarely), a truncated response forwarded downstream could cause application-level logic errors. Dismissing it entirely would be inappropriate for the narrow set of affected deployments.
What to do — in priority order.
- Validate response body integrity at the application layer — Add JSON schema validation, content-length checks, or checksum verification on responses from untrusted upstreams. This catches any truncation regardless of the underlying HTTP client behavior. No SLA deadline — this is a LOW-severity backlog item.
- Pin or upgrade undici to v7.29.1+ or v8.10.2+ — The patch enforces proper abort semantics when maxSize is exceeded. Since this is a library dependency, update via
npm update undicior pin the version inpackage.json. Treat as backlog hygiene per noisgate LOW SLA. - Restrict dump interceptor usage to trusted upstreams only — If you use
interceptors.dump(), ensure it is only composed on dispatchers that communicate with internal, trusted services — not arbitrary external endpoints. Review your dispatcher composition to confirm.
- WAF or network-level controls — this is a client-side library behavior, not a server-side vulnerability. No network appliance can prevent the application from mishandling a legitimately delivered chunked response.
- Rate limiting on the upstream — the attack only requires a single oversized response, not high request volume. Rate limiting does not help.
Crowdsourced verification payload.
Run this on any host where Node.js applications are deployed. It checks the installed undici version via npm. Requires read access to the project's node_modules. Example: bash check_cve_2026_84947.sh /path/to/your/node/app
#!/usr/bin/env bash
# CVE-2026-84947 — undici dump interceptor response truncation
# Usage: bash check_cve_2026_84947.sh /path/to/node/project
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
PROJECT_DIR="${1:-.}"
PKG_JSON="$PROJECT_DIR/node_modules/undici/package.json"
if [ ! -f "$PKG_JSON" ]; then
echo "UNKNOWN — undici not found in $PROJECT_DIR/node_modules"
exit 2
fi
VERSION=$(grep '"version"' "$PKG_JSON" | head -1 | sed 's/.*"version": *"\([^"]*\)".*/\1/')
if [ -z "$VERSION" ]; then
echo "UNKNOWN — could not parse undici version from $PKG_JSON"
exit 2
fi
echo "Found undici version: $VERSION"
# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
# Affected: v7.1.0–v7.29.0, v8.0.0–v8.10.1
# Fixed: v7.29.1+, v8.10.2+
# Not affected: v6.x and below, v9.x and above (if exists)
if [ "$MAJOR" -lt 7 ]; then
echo "PATCHED — undici $VERSION is not in the affected range (pre-v7)"
exit 0
elif [ "$MAJOR" -eq 7 ]; then
if [ "$MINOR" -lt 1 ]; then
echo "PATCHED — undici $VERSION is before the affected range (v7.0.x)"
exit 0
elif [ "$MINOR" -lt 29 ]; then
echo "VULNERABLE — undici $VERSION is in the affected range (v7.1.0–v7.28.x)"
exit 1
elif [ "$MINOR" -eq 29 ]; then
if [ "$PATCH" -lt 1 ]; then
echo "VULNERABLE — undici $VERSION is affected (v7.29.0)"
exit 1
else
echo "PATCHED — undici $VERSION contains the fix (v7.29.1+)"
exit 0
fi
else
echo "PATCHED — undici $VERSION is above the affected range"
exit 0
fi
elif [ "$MAJOR" -eq 8 ]; then
if [ "$MINOR" -lt 10 ]; then
echo "VULNERABLE — undici $VERSION is in the affected range (v8.0.0–v8.9.x)"
exit 1
elif [ "$MINOR" -eq 10 ]; then
if [ "$PATCH" -lt 2 ]; then
echo "VULNERABLE — undici $VERSION is affected (v8.10.0–v8.10.1)"
exit 1
else
echo "PATCHED — undici $VERSION contains the fix (v8.10.2+)"
exit 0
fi
else
echo "PATCHED — undici $VERSION is above the affected range"
exit 0
fi
else
echo "PATCHED — undici $VERSION is above the affected major version range"
exit 0
fiIf you remember one thing.
interceptors.dump() against untrusted upstreams). Per the noisgate LOW SLA, there is no mitigation deadline — treat this as backlog hygiene. Update undici to v7.29.1 or v8.10.2 in your next regular dependency refresh cycle. If you maintain Node.js proxy or gateway services that use the dump interceptor, confirm they are not processing responses from untrusted external origins. No emergency action is required Monday morning — add the version bump to your next sprint's dependency update ticket and move on.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.