← Back to Feed CACHED · 2026-09-04 17:45:41 · CACHE_KEY CVE-2026-84947
CVE-2026-84947 · CWE-20 · Disclosed 2026-09-04

undici's dump interceptor reads and discards a response body up to a configurable maximum size.

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

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.

"Opt-in dump interceptor silently truncates oversized chunked responses — low-impact integrity edge case."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Application uses opt-in dump interceptor

The target Node.js application must explicitly compose 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.
Conditions required:
  • Application imports and composes interceptors.dump() on its Agent, Client, or Pool
Where this breaks in practice:
  • 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
STEP 02

Attacker controls upstream HTTP server

The attacker must be the upstream server (or a man-in-the-middle) that the vulnerable application makes requests to. The malicious server sends a chunked transfer-encoded response without a Content-Length header, with a body exceeding the configured maxSize.
Conditions required:
  • Attacker controls or compromises an upstream endpoint the application fetches from
  • Response uses chunked transfer encoding without Content-Length
Where this breaks in practice:
  • 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
Detection/coverage: Network monitoring can detect abnormally large chunked responses from upstream servers
STEP 03

Response exceeds maxSize and triggers silent truncation

When the chunked response body exceeds 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.
Conditions required:
  • Response body exceeds the configured maxSize limit
  • Response lacks Content-Length header
Where this breaks in practice:
  • Default maxSize is 1 MiB — response must exceed this threshold
  • Applications that validate response integrity (checksums, JSON schema validation) will catch the truncation
Detection/coverage: Application-level logging of response body sizes versus expected sizes; JSON parse errors on truncated payloads
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. No known campaigns, no mentions in threat intel feeds as of 2026-09-05.
Proof-of-conceptNot publicly available. No PoC repos found. Exploitation is trivial to construct (any HTTP server sending large chunked responses) but impact is minimal.
EPSS scoreNot 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 statusNot listed. No CISA KEV entry.
CVSS vectorCVSS: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 versionsundici v7.1.0–v7.29.0 and v8.0.0–v8.10.1. Earlier v6.x line is not affected.
Fixed versionsv7.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 dataundici 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 date2026-09-04 via GitHub Security Advisory GHSA-2gqq-gqf2-x968.
ReporterNot publicly attributed in the advisory.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to LOW (3.7/10)

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.

HIGH Vulnerability mechanics and affected versions
HIGH Severity assessment
MEDIUM Prevalence of dump interceptor usage in production

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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 undici or pin the version in package.json. Treat as backlog hygiene per noisgate LOW SLA.
  3. 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.
What doesn't work
  • 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.
06 · Verification

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

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

If you remember one thing.

TL;DR
This is a LOW-severity issue with no active exploitation, no KEV listing, and a narrow affected population (only applications explicitly opting into 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

  1. GitHub Security Advisory GHSA-2gqq-gqf2-x968
  2. undici Interceptors Documentation
  3. undici npm Package
  4. undici GitHub Releases
  5. nodejs/undici Security Advisories Index
  6. undici on Socket.dev (Security Analysis)
  7. Node.js undici Tenable Plugin
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.