fast-jwt accepts unknown `crit` header extensions (RFC 7515 violation)
Summary
fast-jwt does not validate the crit (Critical) Header Parameter defined in RFC 7515 §4.1.11. When a JWS token contains a crit array listing extensions that fast-jwt does not understand, the library accepts the token instead of rejecting it. This violates the MUST requirement in the RFC.
RFC Requirement
RFC 7515 §4.1.11:
If any of the listed extension Header Parameters are not understood and supported by the recipient, then the JWS is invalid.
Proof of Concept
const { createSigner, createVerifier } = require("fast-jwt"); // v3.3.3
const signer = createSigner({ key: "secret", algorithm: "HS256" });
const token = signer({
sub: "attacker",
role: "admin",
header: { crit: ["x-custom-policy"], "x-custom-policy": "require-mfa" },
});
// Should REJECT — x-custom-policy is not understood
const verifier = createVerifier({ key: "secret", algorithms: ["HS256"] });
try {
const result = verifier(token);
console.log("ACCEPTED:", result);
// Output: ACCEPTED: { sub: 'attacker', role: 'admin' }
} catch (e) {
console.log("REJECTED:", e.message);
}
Expected: Error — unsupported critical extension Actual: Token accepted.
Comparison
// jose (panva) v4+ — correctly rejects
const jose = require("jose");
await jose.jwtVerify(token, new TextEncoder().encode("secret"));
// throws: Extension Header Parameter "x-custom-policy" is not recognized
Impact
- Split-brain verification in mixed-library environments
- Security policy bypass when
critcarries enforcement semantics - Token binding bypass (RFC 7800
cnfconfirmation) - See CVE-2025-59420 for full impact analysis
Suggested Fix
In src/verifier.js, add crit validation after header decoding:
const SUPPORTED_CRIT = new Set(["b64"]);
function validateCrit(header) {
if (!header.crit) return;
if (!Array.isArray(header.crit) || header.crit.length === 0)
throw new Error("crit must be a non-empty array");
for (const ext of header.crit) {
if (!SUPPORTED_CRIT.has(ext))
throw new Error(`Unsupported critical extension: ${ext}`);
if (!(ext in header))
throw new Error(`Critical extension ${ext} not present in header`);
}
}
Affected software
Click a technology to see all vulnerabilities affecting it.
| Platform | Package | Vulnerable versions | Fixed in |
|---|---|---|---|
| npm package | fast-jwt | <= 6.1.0 | no fix |
References
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N- Weakness (CWE)
CWE-345, CWE-636- Platform
- npm
- Package
fast-jwt- Disclosed
- 03.04.2026
- Updated
- 11.10.2026 10:22
Sources and licenses
OSV / GitHub Advisory Database - GHSA-hm7r-c7qw-ghp6 - CC BY 4.0
Vulnerability history: fast-jwt
All published vulnerabilities of this package (npm package), newest first. Shows whether this is a one-off slip or a package that needs watching.
- Total entries
- 14
- First → latest
- 11.2023 10.2026
- Without a fix
- 1
- Exploited in attacks
- 0
Severity breakdown
- Critical 4
- High 4
- Medium 6
Disclosures per year
- 2023: 1
- 2024: 0
- 2025: 1
- 2026: 12
-
fast-jwt accepts unknown `crit` header extensions (RFC 7515 violation) this entry
Know which vulnerabilities affect your application
With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.