Описание
Fastify has a Body Schema Validation Bypass via Leading Space in Content-Type Header
Summary
A validation bypass vulnerability exists in Fastify v5.x where request body validation schemas specified via schema.body.content can be completely circumvented by prepending a single space character (\x20) to the Content-Type header. The body is still parsed correctly as JSON (or any other content type), but schema validation is entirely skipped.
This is a regression introduced by commit f3d2bcb (fix for CVE-2025-32442).
Details
The vulnerability is a parser-validator differential between two independent code paths that process the raw Content-Type header differently.
Parser path (lib/content-type.js, line ~67) applies trimStart() before processing:
Validator path (lib/validation.js, line 272) splits on /[ ;]/ before trimming:
The ContentType class applies trimStart() before processing, so the parser correctly identifies application/json and parses the body. However, getEssenceMediaType splits on /[ ;]/ before trimming, so the leading space becomes a split point, producing an empty string. The validator looks up a schema for content-type "", finds nothing, and skips validation entirely.
Regression source: Commit f3d2bcb (April 18, 2025) changed the split delimiter from ';' to /[ ;]/ to fix CVE-2025-32442. The old code (header.split(';', 1)[0].trim()) was not vulnerable to this vector because .trim() would correctly handle the leading space. The new regex-based split introduced the regression.
PoC
Output:
Impact
Any Fastify application that relies on schema.body.content (per-content-type body validation) to enforce data integrity or security constraints is affected. An attacker can bypass all body validation by adding a single space before the Content-Type value. The attack requires no authentication and has zero complexity — it is a single-character modification to an HTTP header.
This vulnerability is distinct from all previously patched content-type bypasses:
| CVE | Vector | Patched in 5.8.4? |
|---|---|---|
| CVE-2025-32442 | Casing / semicolon whitespace | ✅ Yes |
| CVE-2026-25223 | Tab character (\t) | ✅ Yes |
| CVE-2026-3419 | Trailing garbage after subtype | ✅ Yes |
| This finding | Leading space (\x20) | ❌ No |
Recommended fix — add trimStart() before the split in getEssenceMediaType:
Ссылки
- https://github.com/fastify/fastify/security/advisories/GHSA-247c-9743-5963
- https://github.com/fastify/fastify/security/advisories/GHSA-mg2h-6x62-wpwc
- https://nvd.nist.gov/vuln/detail/CVE-2025-32442
- https://nvd.nist.gov/vuln/detail/CVE-2026-33806
- https://github.com/fastify/fastify/commit/f3d2bcb3963cd570a582e5d39aab01a9ae692fe4
- https://cna.openjsf.org/security-advisories.html
- https://github.com/fastify/fastify/releases/tag/v5.8.5
Пакеты
fastify
>= 5.3.2, <= 5.8.4
5.8.5
Связанные уязвимости
Impact: Fastify applications using schema.body.content for per-content-type body validation can have validation bypassed entirely by prepending a space to the Content-Type header. The body is still parsed correctly but schema validation is skipped. This is a regression introduced in fastify >= 5.3.2 by the fix for CVE-2025-32442 Patches: Upgrade to fastify v5.8.5 or later. Workarounds: None. Upgrade to the patched version.
Impact: Fastify applications using schema.body.content for per-content-type body validation can have validation bypassed entirely by prepending a space to the Content-Type header. The body is still parsed correctly but schema validation is skipped. This is a regression introduced in fastify >= 5.3.2 by the fix for CVE-2025-32442 Patches: Upgrade to fastify v5.8.5 or later. Workarounds: None. Upgrade to the patched version.
Уязвимость фреймворка Fastify программной платформы Node.js, связанная с неправильной проверкой указанного типа входных данных, позволяющая нарушителю обойти существующие механизмы защиты