← Back to Feed CACHED · 2026-09-04 11:03:45 · CACHE_KEY CVE-2026-84469
CVE-2026-84469 · CWE-20 · Disclosed 2026-09-04

fastify versions before 5.12.2 decide whether to compile a request schema based on JavaScript truthiness

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Validation bypass only fires if you use the rare boolean-false schema pattern most apps never touch"
02 · The Attack Path

3 steps from start to impact.

STEP 01

Identify a route using boolean false schema

The attacker needs a Fastify route where the developer used 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.
Conditions required:
  • Target application uses Fastify < 5.12.2
  • At least one route uses boolean false as a schema value
Where this breaks in practice:
  • Boolean false schemas 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
Detection/coverage: Static analysis tools (e.g., semgrep with a custom rule matching schema: { body: false }) can flag affected routes in CI.
STEP 02

Send arbitrary unvalidated input

With the schema skipped, the attacker crafts a request with a body, query string, or headers that violate the developer's intent. The route handler receives request.body (or equivalent) with whatever the attacker sent. No schema validation fires — the handler processes raw, unvalidated data.
Conditions required:
  • Network reachability to the Fastify endpoint
Where this breaks in practice:
  • 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)
Detection/coverage: WAF/RASP sensors may catch obviously malicious payloads. Fastify request logs will show successful requests to routes that should be rejecting everything.
STEP 03

Exploit handler logic with unexpected input

The real impact depends entirely on what the handler does. If it trusts validated input and passes it to a database query, file path, or downstream service, the attacker may achieve injection (SQLi, NoSQLi, SSRF, path traversal). Without the validation bypass, these payloads would have been rejected at the schema layer. The severity is therefore *conditional* on the handler's own robustness.
Conditions required:
  • Handler trusts schema-validated input without additional sanitization
  • Handler performs a security-sensitive operation (DB query, file I/O, downstream API call)
Where this breaks in practice:
  • Defense-in-depth layers (parameterized queries, ORM escaping, output encoding) prevent chaining to injection
  • Many handlers validate inputs independently of Fastify schemas
Detection/coverage: Application-layer monitoring (APM), database audit logs, and SIEM correlation can detect anomalous query patterns or unexpected input shapes.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo known exploitation. Not listed on CISA KEV. No threat-intel reports reference this CVE as of 2026-09-04.
Proof-of-conceptThe 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 scoreNot yet scored (disclosed 2026-09-04). Expected to be low given the niche precondition.
KEV statusNot listed. No CISA deadline.
CVSS vectorCVSS: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 versionsFastify < 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 versionsFastify 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 date2026-09-04 (coordinated disclosure via GitHub Security Advisory GHSA-hwr6-493r-vm6h).
ReporterNot publicly attributed in the advisory at time of assessment.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.3/10)

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.

HIGH Vulnerability mechanism and fix confirmed via GHSA advisory
MEDIUM Fraction of real-world Fastify apps using boolean false schemas (estimated <5%)
LOW Downstream exploitability — entirely dependent on handler logic

Why this verdict

  • Narrow precondition drastically limits population. The vulnerability only fires when a developer uses false as 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.

05 · Compensating Control

What to do — in priority order.

  1. Replace boolean false schemas with { "not": {} } — This is the advisory's recommended workaround. { "not": {} } is truthy in JavaScript so Fastify compiles it, and it is semantically equivalent to false in 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.
  2. 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 }'.
  3. 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.
  4. 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.
What doesn't work
  • 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: true field 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a same-day disclosure (2026-09-04) with no in-the-wild exploitation and a very narrow precondition. Monday morning, run a codebase search for boolean 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

  1. GHSA-hwr6-493r-vm6h — Fastify Boolean False Schema Bypass Advisory
  2. Fastify Validation and Serialization Documentation
  3. CVE-2026-18504 — Related Fastify Schema Validation Bypass
  4. CVE-2026-33806 — Fastify Body Schema Validation Bypass via Content-Type
  5. Fastify CVE List — CVEDetails
  6. Fastify npm Package Health & Stats
  7. Fastify GitHub Security Overview
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.