Description
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.
Published: 2026-09-03
Score: 6.2 Medium
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The path filters pick, ignore, filter, and replace in stream-json recompute a full path string from the nesting stack for every token, causing the processing cost to grow with the square of the JSON depth. A sharply nested JSON document, even with a modest number of bytes, can therefore stall the Node.js event loop for seconds or even minutes, effectively denying service to the application that uses the library.

Affected Systems

Applications that include the uhop:stream-json library older than version 3.5.0 and that use any of the vulnerable filters are affected. The streamArray, streamObject, and streamValues streamers are not impacted because they use a constant‑time depth getter. Any component that forwards untrusted JSON through these filters can trigger the issue.

Risk and Exploitability

The CVSS score of 6.2 indicates moderate severity. The EPSS score is not available and the vulnerability is not listed in CISA's KEV catalog. An attacker only needs the ability to supply arbitrary JSON to a vulnerable stream; no special authentication or privileges are required. By crafting a deeply nested JSON payload the attacker can block the event loop and cause a denial of service affecting all users of the exposed service while the loop remains unresponsive.

Generated by OpenCVE AI on September 4, 2026 at 01:52 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade the stream-json library to version 3.5.0 or newer, which removes the O(depth²) behavior in the path filters.
  • Avoid using the pick, ignore, filter, and replace filters on untrusted JSON; use only the unaffected streamArray, streamObject, or streamValues streamers or implement a safe alternative.
  • Implement input validation that limits maximum JSON nesting depth or rejects overly deep structures before they reach the stream-json filters.

Generated by OpenCVE AI on September 4, 2026 at 01:52 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-528h-pc64-c93x stream-json: pick/ignore/filter/replace filters are O(depth²) on nested input — small crafted JSON blocks the event loop for seconds→minutes (DoS)
History

Fri, 04 Sep 2026 00:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-1046
References
Metrics threat_severity

None

threat_severity

Moderate


Thu, 03 Sep 2026 20:30:00 +0000

Type Values Removed Values Added
Description 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.
Title stream-json: pick/ignore/filter/replace filters are O(depth²) on nested input — small crafted JSON blocks the event loop for seconds→minutes (DoS)
Weaknesses CWE-407
References
Metrics cvssV3_1

{'score': 6.2, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H'}


Subscriptions

No data.

cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-09-03T20:15:19.721Z

Reserved: 2026-08-06T16:28:51.182Z

Link: CVE-2026-71429

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-09-03T21:17:21.660

Modified: 2026-09-03T21:17:21.660

Link: CVE-2026-71429

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-09-03T20:15:19Z

Links: CVE-2026-71429 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-09-04T02:00:05Z

Weaknesses
  • CWE-1046

    Creation of Immutable Text Using String Concatenation

  • CWE-407

    Inefficient Algorithmic Complexity