CVE-2026-84961
High · 7.4CVSS
7.4
EPSS
0.1%
Published
Sep 4, 2026
CISA due date
—
Cloudanix analysis
A Node.js HTTP client can quietly ignore extra certificate checks an application thought it applied, so a connection that should have been blocked may be allowed and sensitive traffic could be read or changed.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- High
- Impact
- Data Exposure
- Component
- Library
- Class
- Cryptographic Weakness
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
undici BalancedPool deep-clones its constructor options via JSON serialize/parse, which silently drops function-valued connect and tls settings such as checkServerIdentity and custom connectors. Those callbacks never reach the TLS stack, so a peer certificate that Node's default hostname and chain checks accept is trusted even when the application's custom verifier would have rejected it. Client, Pool, and Agent dispatchers are unaffected because they extract connect/tls options before cloning. Impact is limited to apps that pass function-valued TLS options into BalancedPool on undici 7.24.1–7.29.1 and 8.0.0–8.10.2.
Why it matters to the business
Services that intended extra certificate pinning, private-CA policy, or custom identity checks on pooled HTTPS clients may accept a TLS peer they meant to refuse, exposing confidentiality and integrity of outbound API, telemetry, or control-plane traffic (CVSS 7.4, high confidentiality and integrity, no availability impact). Exploitation requires a high-complexity network position and a certificate that still passes Node defaults, and there is no KEV listing, ransomware use, or public exploit maturity 30 days after publication—so urgency is patch-driven rather than active-campaign-driven. Downstream Red Hat Node.js, Grafana, observability-console, and RHDH images inherit the library, so any product that built BalancedPool with custom TLS functions should treat this as a trust-boundary failure until upgraded.
How an attack unfolds
An attacker who can present a TLS certificate that satisfies Node's built-in hostname and chain validation—but that the victim's custom checkServerIdentity or connector would have rejected—targets an application whose outbound HTTPS goes through undici BalancedPool with those function-valued options. Because BalancedPool clones options as JSON, the custom functions are discarded and the handshake completes under default TLS policy. The attacker can then sit on the accepted connection and read or alter application data. Named threat actors and in-the-wild campaigns are not associated with this issue; success depends on the app actually supplying function-valued tls/connect options and on the attacker obtaining a default-valid cert for the intended name (compromised/misissued public CA, rogue internal CA, or similar). Client/Pool/Agent code paths do not exhibit the drop.
How to fix it
Upgrade undici to 7.29.1 (7.x line) or 8.10.2 (8.x line), which are the vendor-stated fixed releases; do not leave BalancedPool on 7.24.1 through the unfixed 7.x/8.x ranges. On Red Hat content, apply RHSA-2026:74609 so that cluster-observability-operator logging-console-plugin reaches pf4-rhel9:1790854525, monitoring-console reaches plugin-rhel9:1790854525, monitoring-console-plugin reaches pf5-rhel9:1790854526, grafana12-4-main reaches 12.4.10-0.2.hum1, nodejs24 (el10) reaches 24.21.0-1.el10_2, nodejs24-main reaches 11.16.0-1.24.18.1.0.2.2.hum1, nodejs26-main reaches 26.8.2-0.1.hum1, and rhdh/rhdh reaches hub-rhel9:1789554285. Until patched, avoid passing function-valued connect or tls options into BalancedPool (use Client, Pool, or Agent if custom TLS callbacks are required), and keep custom identity checks on dispatchers that extract options before cloning. Rebuild and redeploy any container or Node application that vendors undici transitively.
How to confirm the fix worked
Confirm the running undici version is 7.29.1, 8.10.2, or later in each line, and that Red Hat images match the RHSA-2026:74609 NVR/tags above. Inventory constructors: only BalancedPool instances that previously received function-valued connect or tls options were in scope. After upgrade, construct BalancedPool with a checkServerIdentity (or custom connector) that rejects a known default-valid test peer and verify the rejection still occurs—pre-fix behavior would accept that peer. Dependency and SBOM scans for undici 7.24.1–<fixed and 8.0.0–<fixed, plus image CVE scanners for the listed Red Hat packages, are the exposure checks.
Typical attack path
- Discover a service that creates undici BalancedPool with a function-valued tls or connect option (custom checkServerIdentity, connector, or equivalent).
- Obtain a network position on the path to a pooled upstream (adjacent network, compromised proxy, DNS/routing influence, or similar).
- Present a certificate that passes Node.js default hostname and chain checks but would fail the application's discarded custom verifier.
- Complete the TLS handshake against BalancedPool under default policy.
- Read or modify application traffic on the accepted connection.
How to detect it
Retrospective exploitation is a successful TLS handshake that default Node policy accepted but a discarded custom verifier would have refused; there is no malware drop, distinct CVE string in logs, or public exploit tooling. Hunt outbound HTTPS from processes using undici BalancedPool for peers whose certificates would fail the application's intended checkServerIdentity (wrong SAN relative to app policy, unexpected issuer, or pins that should have fired). Review Node/undici access and TLS debug logs around BalancedPool construction and connect, application-layer anomalies after those connections (unexpected API payloads, auth to wrong backends), and certificate inventory for the upstream names those pools target. No named APT campaigns are tied to this CVE, so do not expect actor-specific C2; correlate with MITM-capable network events (new intercepting proxies, unusual TLS middleboxes, rogue internal CAs) in the 30 days since publication. Absence of custom tls/connect functions on BalancedPool means the host was not vulnerable regardless of version.
What your security team should do
- Patch undici to 7.29.1 or 8.10.2 and apply RHSA-2026:74609 on all listed Red Hat Node.js, Grafana, observability, and RHDH images as the primary control.
- Inventory Node services for BalancedPool usage with function-valued tls/connect options; treat those as the only in-scope exposure.
- Until patched, route custom TLS verification through Client, Pool, or Agent instead of BalancedPool.
- Prioritize internet-facing or multi-tenant outbound HTTPS clients that pin CAs or implement custom identity policy.
- Track this as a cryptographic-policy failure, not an RCE; there is no KEV, ransomware, or public exploit signal, so schedule within normal high-severity TLS-trust SLAs rather than emergency KEV timelines.
- Add SBOM/dependency gates that fail builds still pulling unfixed undici 7.x/8.x BalancedPool consumers.
The record
undici's BalancedPool constructor passes its entire options object through an internal deep-clone that serializes and reparses the value as JSON. Because JSON cannot represent functions, any function-valued TLS option, such as a caller-supplied checkServerIdentity callback or a custom connector inside the connect option, is silently discarded before it reaches the TLS layer. As a result a peer whose certificate the application's custom checkServerIdentity was written to reject, but which still passes Node's default hostname and chain checks, is accepted when reached through BalancedPool. The Client, Pool, and Agent dispatchers are not affected because they extract the connect and tls options before cloning. This affects undici versions from 7.24.1 up to 7.29.1 and from 8.0.0 up to 8.10.2, and only when the application supplies a function-valued connect or tls option to BalancedPool. Users should upgrade to undici 7.29.1 or 8.10.2.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-96375 Improper Certificate Validation vulnerability in Drupal Cloud allows Adversary in the… CWE-295
- CVE-2026-87944 Improper Certificate Validation vulnerability in Drupal SAML SSO - Service Provider… CWE-295
- CVE-2026-114642 Traefik 2.11.0 before 2.11.58 and 3.0.0 before 3.7.14 stores its NTLM/Kerberos backend… CWE-295
- CVE-2026-114406 The system certificate authority (CA) store in Red Hat products, distributed via… CWE-295
- CVE-2026-95210 Improper certificate validation in gnutls v3.8.13 causes the application to accept… CWE-295
- CVE-2026-97687 urllib3 is an HTTP client library for Python. CWE-295
- CVE-2026-101916 @grpc/grpc-js implements the core functionality of gRPC purely in JavaScript, without a… CWE-295
- CVE-2026-63374 AnyIO is a high level asynchronous concurrency and networking framework that works on top… CWE-295