Skip to content

[GHSA-mrhx-c7xc-m3w5] Withdraw: source CVE-2023-54404 disputed by its CNA - #10750

Open
colinhacks wants to merge 1 commit into
github:colinhacks/advisory-improvement-10750from
colinhacks:colinhacks/advisory-improvement-GHSA-mrhx-c7xc-m3w5
Open

colinhacks wants to merge 1 commit into
github:colinhacks/advisory-improvement-10750from
colinhacks:colinhacks/advisory-improvement-GHSA-mrhx-c7xc-m3w5

Conversation

@colinhacks

@colinhacks colinhacks commented Oct 28, 2026 •

Copy link
Copy Markdown

I maintain Zod. CVE-2023-54404 describes intended behavior, and its CNA, VulnCheck, tagged it disputed on 2026-10-28 while it reviews my rejection request:

Nobody contacted me before the CVE was published on 2026-10-01, or before VulnCheck widened it on 2026-10-22. Both times I found out from users whose CI had started failing.

Reporting every issue is a design decision. safeParse() and parse() promise the caller the complete list of issues in the input, so a form or an API can show every problem at once instead of one per round trip. That means the work on a failing parse grows with the input. A schema with no size bound accepts input of any size by declaration, the same way JSON.parse does. An application that parses untrusted input caps it with a request body limit, or with a schema bound like .max(), which since 4.6.6 rejects an oversized collection before any element is parsed (colinhacks/zod#6652).

Zod also offers a validator that stops at the first failure. schema.validate(data), or z.validate(schema, data), returns a boolean and settles on the first failing element, so it never collects issues. On a compiled schema (z.compile()) it answers from the compiled fast path. Against 10 million invalid elements with a 2 GB heap, safeParse() runs out of memory, while .validate() returns false with under 100 MB of heap growth.

Other validators behave the same way, and none of them has an advisory for it. Each library below got the same unbounded array-of-strings schema and Array(n).fill(0), run under Node 26 with a 2 GB heap:

Library Default Result
Zod 4.6.7 reports every issue 1M issues; out of memory at 10M
Valibot 1.5.0 reports every issue 1M issues; out of memory at 10M
ArkType 2.2.9 reports every issue 1M issues; out of memory at 10M
Superstruct 2.0.2 reports every failure 1M failures; out of memory at 10M
Yup 1.7.1 stops at first error with abortEarly: false: 1M errors and 3.4 GB of heap at 1M
Joi 18.3.1 stops at first error with abortEarly: false: stack overflow at 1M
Ajv 8.20.0 stops at first error with allErrors: true: 10M errors

If this is a vulnerability in Zod, it is one in every validator that reports all errors. The remedy is the same everywhere: bound the input, or ask for a boolean.

The cited "researcher disclosure", colinhacks/zod#1872, is a 2023 design discussion about early exit, not a vulnerability report.

Please withdraw this advisory.

Copilot AI max review requested due to automatic review settings October 28, 2026 17:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

@github-actions
github-actions Bot changed the base branch from main to colinhacks/advisory-improvement-10750 October 28, 2026 17:42
@colinhacks

Copy link
Copy Markdown
Author

Update: VulnCheck has rejected CVE-2023-54404, and NVD reflects it.

VulnCheck's rejection reason: "The described memory use only grows in proportion to input already allocated by JSON.parse before Zod runs, is reachable only without an application request-size limit, and reflects expected validator behavior rather than a defect in Zod."

This advisory's only source is now a rejected CVE, so please withdraw it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants