Skip to main content

stream-json CVE-2026-71429

| EUVDEUVD-2026-70733 MEDIUM
Inefficient Algorithmic Complexity (CWE-407)
2026-09-03 GitHub_M GHSA-528h-pc64-c93x
6.2
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Send crafted deeply-nested JSON over HTTP
  2. Delivery
    Application passes body to pick/filter stream
  3. Exploit
    filter-base.js recomputes path on each nesting level
  4. Execution
    O(D²) stack.join() calls saturate Node.js thread
  5. Persist
    Event loop blocked
  6. Impact
    Service unavailable to all concurrent users

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V2 - Validation and Business Logic Algorithmic complexity limits
Exploitation Conditions

Exploitation requires that the target application uses stream-json's pick, ignore, filter, or replace path filters (from filter-base.js) - specifically not the streamArray, streamObject, or streamValues APIs - and that the application passes attacker-controlled JSON input to those filters without a prior depth check. This covers the library's primary documented use case, including the flagship README example pick({filter: 'data'}). The attack is depth-triggered, not byte-volume-triggered, so a very small document (kilobytes) can cause disproportionate CPU consumption. No authentication or special configuration is required beyond the ability to send JSON to an endpoint backed by these filters. Applications that only use streamArray/streamObject/streamValues, or that pre-validate JSON depth before processing, are not exploitable. Applications operating exclusively on trusted, internally-generated JSON also face no realistic risk.

Impact

The NVD-provided CVSS vector CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H scores 6.2 (Medium), but the AV:L attribution is inconsistent with the primary documented threat model: an application receiving untrusted JSON over a network and passing it to a stream-json filter. For such deployments the realistic attack vector is AV:N, yielding a High score. The AC:L and PR:N metrics are accurate - no special complexity and no authentication are required to submit a crafted deeply-nested JSON body. EPSS data is not available in the input; given the absence of a KEV listing and the narrow deployment surface (Node.js streaming-JSON consumers), widespread automated exploitation is unlikely in the near term. However, the availability of a working PoC in the public GHSA advisory lowers the bar for reproduction. Real-world priority depends heavily on deployment context: a public API endpoint that pipes raw request bodies through a pick or filter stream is concretely exploitable; batch pipelines consuming trusted internal JSON face negligible risk. The quadratic nature of the DoS means even moderately deep documents (depth ~2000 in the PoC) produce seconds-long event-loop stalls in Node.js, which is a single-threaded runtime - making this an effective amplification primitive against network-facing services.

Exploit ScenarioDerived

An attacker submits a crafted HTTP request body containing a small but deeply nested JSON document (e.g., {'meta':{'meta':{...}}} to depth 2000, roughly 24 KB) to a Node.js web service that pipes the request body through stream-json's pick({filter: 'data'}) filter. The filter recomputes the full path string at each of the ~2000 nesting levels, accumulating O(D²) ≈ 4,000,000 string join operations, blocking the Node.js event loop for several seconds. Repeating this at modest request rates starves all concurrent connections, producing effective denial of service. A proof-of-concept script demonstrating this behavior is published in GHSA-528h-pc64-c93x.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 03, 2026

Quadratic algorithmic complexity (O(D²)) in stream-json's pick, ignore, filter, and replace path filters allows an attacker supplying a small, deeply-nested JSON document to block the Node.js event loop for seconds to minutes, effectively causing denial of service. The root cause is that filter-base.js recomputes the full dot-separated path string by rejoining the entire nesting stack on every checkable token - so a document of depth D incurs O(D²) CPU work regardless of byte size. All applications passing untrusted or large JSON through a string or RegExp filter (including the library's flagship README example pick({filter: 'data'})) are affected in versions up to and including 3.4.0. A proof-of-concept is included in the published GHSA advisory; no public exploit or CISA KEV listing has been identified at time of analysis.

RemediationAI

Upgrade stream-json to version 3.5.0 or later, which introduces a maxDepth option (default: 1024) that throws a RangeError when input nesting exceeds the limit, bounding worst-case complexity. The patch commit is available at https://github.com/uhop/stream-json/commit/a869fb98aaef9225556f49901a8f55954ff856e6 and the GHSA advisory at https://github.com/uhop/stream-json/security/advisories/GHSA-528h-pc64-c93x. If an immediate upgrade is not possible, the most effective compensating control is to validate and reject JSON input whose nesting depth exceeds a safe threshold before it enters the stream-json pipeline - this can be done with a lightweight pre-scan or by enforcing an application-level depth limit using a JSON schema validator. Alternatively, if the workload does not require path-filter features, replacing pick/filter/ignore/replace with streamArray, streamObject, or streamValues (which use the constant-time asm.depth getter) eliminates the vulnerability entirely without requiring an upgrade. Rate-limiting and body-size limits on accepting HTTP JSON payloads provide partial protection but do not eliminate the risk, since the vulnerability is depth-triggered rather than byte-volume-triggered - a compact deeply-nested document can be very small.

Affected VersionsENISA

stream-json < 3.5.0

Affected Packages

npm stream-json fix: 3.5.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

stream-json (npm package cpe:2.3:a:uhop:stream-json:*:*:*:*:*:*:*:*) is a Node.js streaming JSON parser designed for large-document processing with minimal memory. Its path filters - pick, ignore, filter, replace - are implemented in src/core/filters/filter-base.js and operate by maintaining a nesting stack that mirrors the JSON object/array depth. The flaw, classified as CWE-407 (Inefficient Algorithmic Complexity), is that on every 'checkable token' emitted while the parser is in the 'check' state, the filter function calls stack.join(separator) to reconstruct the full path string before comparing it against the caller's string or RegExp. Because the stack depth equals the JSON nesting depth D, each join is O(D), and since the join is called once per nesting level in the worst case, total cost is O(D²). The streamArray, streamObject, and streamValues streamers are not affected because they use the O(1) asm.depth getter rather than path-string recomputation. The fix in 3.5.0 adds a maxDepth guard (default 1024) that throws a RangeError when a token is nested beyond the limit, capping worst-case cost to O(maxDepth²) and providing an opt-in escape hatch via maxDepth: Infinity.

Know when Node.js gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 6.2 MEDIUM
AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 7.5 HIGH

AV:N reflects primary use in network-facing Node.js services receiving untrusted JSON; PR:N because no authentication is required to submit a crafted payload; A:H because the event-loop block affects all concurrent requests.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Red Hat 6.2 MEDIUM

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Local
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

1
Patch available
Sep 03, 2026 - 22:02 EUVD

DescriptionCVE.org

stream-json is a micro-library of stream components for processing JSON and JSONC with a minimal memory footprint. Prior to 3.5.0, the path filters pick, ignore, filter, and replace in src/core/filters/filter-base.js recompute the full path string from the nesting stack for every checkable token. Because the stack length equals the current nesting depth and a checkable token is emitted at every level, a depth D document costs O(D²) rather than O(D) to process. The issue is triggered by nesting depth rather than byte volume, including the documented pick({filter: 'data'}) traversal-until-match path, so an application that sends untrusted JSON through a string or RegExp filter can block the Node.js event loop and cause denial of service with a small deeply nested document. The streamArray, streamObject, and streamValues streamers are not affected because they use the constant-time asm.depth getter. This issue is fixed in version 3.5.0.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 3 npm packages depend on stream-json (3 direct, 0 indirect)

Ecosystem-wide dependent count for version 3.5.0.

Threat Intelligence Overview

EPSS Score
0.1%
Top 98% exploitable
Prevalence
Low
specialized Node.js streaming JSON micro-library, niche use case
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Small
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

51
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +31
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

CVE-2025-68613 HIGH POC
8.8 Dec 19

Remote code execution in n8n's workflow expression evaluation system allows an authenticated user with workflow creation

CVE-2024-41713 CRITICAL POC
9.1 Oct 21

A vulnerability in the NuPoint Unified Messaging (NPM) component of Mitel MiCollab through 9.8 SP1 FP2 (9.8.1.201) could

CVE-2024-55591 CRITICAL POC
9.8 Jan 14

FortiOS and FortiProxy contain an authentication bypass via the Node.js websocket module allowing unauthenticated remote

CVE-2023-44487 HIGH POC
7.5 Oct 10

Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour

CVE-2014-7205 CRITICAL POC
10.0 Oct 08

Eval injection vulnerability in the internals.batch function in lib/batch.js in the bassmaster plugin before 1.5.2 for t

CVE-2025-59528 CRITICAL POC
10.0 Sep 22

Flowise version 3.0.5 contains a remote code execution vulnerability in the CustomMCP node. The mcpServerConfig paramete

CVE-2017-14849 HIGH POC
7.5 Sep 28

Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was inc

CVE-2017-5941 CRITICAL POC
9.8 Feb 09

An issue was discovered in the node-serialize package 0.0.4 for Node.js. Rated critical severity (CVSS 9.8), this vulner

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2014-3744 HIGH POC
7.5 Oct 23

Directory traversal vulnerability in the st module before 0.2.5 for Node.js allows remote attackers to read arbitrary fi

CVE-2014-9566 HIGH POC
7.5 Mar 10

Multiple SQL injection vulnerabilities in the Manage Accounts page in the AccountManagement.asmx service in the Solarwin

CVE-2013-4660 MEDIUM POC
6.8 Jun 28

The JS-YAML module before 2.0.5 for Node.js parses input without properly considering the unsafe !!js/function tag, whic

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy