Like a bouncer who checks IDs but walks away when handed a card that literally says 'deny everyone'
CVE-2026-84469 (GHSA-hwr6-493r-vm6h) affects Fastify < 5.12.2 (and pre-6.0.0 on the v6 branch). Fastify's route-schema compilation path uses a JavaScript truthiness check to decide whether a schema needs compiling. JSON Schema Draft 7 says the boolean value false is a valid schema meaning *reject every instance* — but false is falsy in JS, so Fastify silently skips compilation. Any route that declares schema: { body: false } or schema: { querystring: false } intending to block all input instead allows any input through to the handler, completely unvalidated.
The vendor rates this HIGH / 7.5 with an unauthenticated-network vector, but that score assumes every Fastify deployment is affected. It isn't. The boolean false schema is an obscure JSON Schema Draft 7 idiom; the overwhelming majority of Fastify routes use object or array schemas ({ type: 'object', properties: {…} }) which are truthy and compile normally. You have to *actively choose* the rare false-as-schema pattern to be vulnerable. When that precondition is met the bypass is real and complete, but the population of affected apps is narrow enough that the vendor score overstates fleet-wide risk.
3 steps from start to impact.
Identify a route using boolean false schema
false as the value for schema.body, schema.querystring, schema.params, or schema.headers. This is an uncommon pattern; most Fastify codebases use object schemas. The attacker may discover it through API fuzzing: a route that should reject all bodies but accepts arbitrary JSON is a tell.- Target application uses Fastify < 5.12.2
- At least one route uses boolean
falseas a schema value
- Boolean
falseschemas are a niche JSON Schema Draft 7 pattern — most developers use object/array schemas - No public tooling enumerates this pattern from the outside; requires black-box fuzz testing or source access
semgrep with a custom rule matching schema: { body: false }) can flag affected routes in CI.Send arbitrary unvalidated input
request.body (or equivalent) with whatever the attacker sent. No schema validation fires — the handler processes raw, unvalidated data.- Network reachability to the Fastify endpoint
- If the handler itself performs manual validation or type-checks (defense-in-depth), the bypass is moot
- WAFs with payload-inspection rules may still block known-bad payloads (SQLi, XSS patterns)
Exploit handler logic with unexpected input
- Handler trusts schema-validated input without additional sanitization
- Handler performs a security-sensitive operation (DB query, file I/O, downstream API call)
- Defense-in-depth layers (parameterized queries, ORM escaping, output encoding) prevent chaining to injection
- Many handlers validate inputs independently of Fastify schemas
The supporting signals.
| In-the-wild exploitation | No known exploitation. Not listed on CISA KEV. No threat-intel reports reference this CVE as of 2026-09-04. |
|---|---|
| Proof-of-concept | The advisory itself describes the PoC pattern: define a route with schema: { body: false }, send any JSON body — it reaches the handler. Trivial to reproduce but requires the specific code pattern to exist. |
| EPSS score | Not yet scored (disclosed 2026-09-04). Expected to be low given the niche precondition. |
| KEV status | Not listed. No CISA deadline. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N — Network/no-auth/no-interaction. Integrity-only impact, no confidentiality or availability. The vector is technically accurate *for affected routes* but ignores the narrow precondition. |
| Affected versions | Fastify < 5.12.2 (v5 branch) and < 6.0.0 (v6 branch). All earlier v5.x and v4.x releases using AJV with JSON Schema Draft 7 boolean schemas are affected. |
| Fixed versions | Fastify 5.12.2 and Fastify 6.0.0. Fix changes schema-selection logic from truthiness check to explicit !== undefined presence detection. |
| Scanning / exposure | ~8-9 million weekly npm downloads. However, the subset of apps using boolean false schemas is estimated to be very small — this is an advanced JSON Schema pattern most teams never use. |
| Disclosure date | 2026-09-04 (coordinated disclosure via GitHub Security Advisory GHSA-hwr6-493r-vm6h). |
| Reporter | Not publicly attributed in the advisory at time of assessment. |
noisgate verdict.
The single most decisive factor for downgrading is the narrow precondition: the application must use the uncommon boolean false JSON Schema pattern, which the vast majority of Fastify deployments never employ — standard object/array schemas are unaffected. This limits the realistic blast radius to a small fraction of the installed base.
Why this verdict
- Narrow precondition drastically limits population. The vulnerability only fires when a developer uses
falseas a schema value — an obscure JSON Schema Draft 7 idiom. The typical Fastify route uses{ type: 'object', properties: {…} }, which is truthy and compiles correctly. This is not a universal bypass. - Impact is conditional, not guaranteed. Even when the bypass triggers, the handler must also lack defense-in-depth (parameterized queries, manual type checks, ORM escaping) for the attacker to chain into a meaningful exploit like injection.
- Role multiplier: Fastify is a general-purpose web framework, not a canonical high-value-role component. It is not a hypervisor, IdP, domain controller, PAM, or security agent. In its most sensitive deployment role — an API gateway — the boolean-false schema pattern is plausible but still uncommon. The blast radius of a successful exploit is limited to the specific route and its downstream operations (host or tenant scope at worst), not fleet-scale or domain-scale compromise.
- No exploitation in the wild, no KEV listing, no public weaponized tooling. The PoC is trivial but useless without a target app that uses the specific code pattern.
Why not higher?
To justify HIGH, we would need the affected pattern to be common across Fastify deployments or the impact to be guaranteed (e.g., direct RCE). Neither applies: boolean false schemas are rare, and the downstream impact is entirely dependent on handler logic. There is no evidence of in-the-wild exploitation, and Fastify is not a canonical high-value-role component where a validation bypass auto-escalates to fleet compromise.
Why not lower?
The vulnerability is real, trivially exploitable when the precondition is met, and reachable by an unauthenticated remote attacker over the network with no user interaction. A complete schema validation bypass on a production API route *can* lead to serious injection chains if the handler is not independently hardened. Dismissing it as LOW would understate the risk for the minority of apps that do use this pattern.
What to do — in priority order.
- Replace boolean
falseschemas with{ "not": {} }— This is the advisory's recommended workaround.{ "not": {} }is truthy in JavaScript so Fastify compiles it, and it is semantically equivalent tofalsein JSON Schema — it rejects all instances. Apply this find-and-replace across your codebase immediately. No mitigation SLA applies for MEDIUM — go straight to the 365-day remediation window. - Add a semgrep or ESLint rule to flag boolean schema values — Write a static analysis rule that detects
schema: { body: false }(and querystring, params, headers variants) in route definitions. Run it in CI to prevent regression. Example semgrep pattern:pattern: 'schema: { body: false }'. - Upgrade to Fastify 5.12.2 or 6.0.0 — The definitive fix. The patch changes schema selection from a truthiness check to explicit presence detection (
!== undefined). This is the remediation action within the 365-day noisgate remediation SLA. - Ensure handlers practice defense-in-depth — Even with schema validation, handlers should use parameterized queries, ORM escaping, and explicit type checks. This limits the blast radius of any validation bypass.
- WAF rules alone — a WAF can catch known-bad payload patterns (SQLi signatures, XSS patterns) but cannot enforce application-level JSON Schema semantics. If the attacker sends structurally valid but logically incorrect input (e.g., an
admin: truefield that should have been rejected), the WAF won't flag it. - Rate limiting — this is not a brute-force or DoS vector. Rate limiting does not address a logic-level validation bypass.
- Upgrading AJV independently — the bug is in Fastify's schema-selection logic, not in AJV's compilation. Upgrading AJV without upgrading Fastify does not fix the truthiness check.
Crowdsourced verification payload.
Run this on any host with node (v18+) and network access to your source repositories. It scans your Fastify project directories for boolean false schema usage AND checks the installed Fastify version. Invoke with: bash check_cve_2026_84469.sh /path/to/your/fastify/project. No special privileges required.
#!/usr/bin/env bash
# check_cve_2026_84469.sh — CVE-2026-84469 Boolean False Schema Bypass
# Usage: bash check_cve_2026_84469.sh /path/to/fastify/project
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
PROJECT_DIR="${1:-.}"
RESULT="UNKNOWN"
if [ ! -d "$PROJECT_DIR" ]; then
echo "ERROR: Directory $PROJECT_DIR does not exist."
exit 2
fi
# Check installed Fastify version
PKG_JSON="$PROJECT_DIR/node_modules/fastify/package.json"
if [ ! -f "$PKG_JSON" ]; then
echo "WARNING: fastify not found in node_modules. Checking package.json only."
if [ -f "$PROJECT_DIR/package.json" ]; then
DECLARED=$(grep -oP '"fastify"\s*:\s*"\K[^"]+' "$PROJECT_DIR/package.json" 2>/dev/null || echo "")
echo "Declared fastify version constraint: ${DECLARED:-not found}"
fi
echo "UNKNOWN — cannot determine installed version."
exit 2
fi
VERSION=$(node -e "console.log(require('$PKG_JSON').version)" 2>/dev/null || echo "")
if [ -z "$VERSION" ]; then
echo "UNKNOWN — could not parse fastify version."
exit 2
fi
echo "Installed Fastify version: $VERSION"
# Compare version — vulnerable if < 5.12.2 (on v5 branch) or < 6.0.0 (on v6 branch)
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)
VULN_VERSION=false
if [ "$MAJOR" -lt 5 ]; then
VULN_VERSION=true
elif [ "$MAJOR" -eq 5 ]; then
if [ "$MINOR" -lt 12 ]; then
VULN_VERSION=true
elif [ "$MINOR" -eq 12 ] && [ "$PATCH" -lt 2 ]; then
VULN_VERSION=true
fi
fi
# Check for boolean false schema usage in source files
echo ""
echo "Scanning for boolean false schema patterns..."
FALSE_HITS=$(grep -rn --include='*.js' --include='*.ts' --include='*.mjs' --include='*.cjs' \
-E '(body|querystring|query|params|headers)\s*:\s*false' "$PROJECT_DIR/src" "$PROJECT_DIR/lib" "$PROJECT_DIR/routes" "$PROJECT_DIR/app" 2>/dev/null || echo "")
if [ -n "$FALSE_HITS" ]; then
echo "WARNING: Found potential boolean false schema usage:"
echo "$FALSE_HITS"
USES_FALSE=true
else
echo "No boolean false schema patterns detected in common source directories."
USES_FALSE=false
fi
echo ""
if [ "$VULN_VERSION" = true ]; then
if [ "$USES_FALSE" = true ]; then
echo "VULNERABLE — Fastify $VERSION is affected AND boolean false schemas detected."
exit 1
else
echo "VULNERABLE — Fastify $VERSION is affected (but no boolean false schema usage detected — lower risk)."
exit 1
fi
else
echo "PATCHED — Fastify $VERSION is not affected by CVE-2026-84469."
exit 0
fiIf you remember one thing.
false schema values (grep -rn 'body: false\|querystring: false\|params: false\|headers: false' across your Fastify projects). If you find hits, apply the workaround immediately: replace false with { "not": {} }. If you find no hits, you are not practically affected — schedule the Fastify 5.12.2 upgrade into your regular dependency update cycle. Under the noisgate reassessed MEDIUM severity, there is no mitigation SLA — go straight to the 365-day noisgate remediation SLA for applying the actual patch. If your organization runs Fastify as an API gateway handling sensitive data and you confirmed boolean-false schema usage, treat this with greater urgency and patch within 30 days as a precaution.Sources
- GHSA-hwr6-493r-vm6h — Fastify Boolean False Schema Bypass Advisory
- Fastify Validation and Serialization Documentation
- CVE-2026-18504 — Related Fastify Schema Validation Bypass
- CVE-2026-33806 — Fastify Body Schema Validation Bypass via Content-Type
- Fastify CVE List — CVEDetails
- Fastify npm Package Health & Stats
- Fastify GitHub Security Overview
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.