← All CVEs NewScan detects
high

CVE-2026-18500

@fastify/jwt before 10.2.2: a per-request verification key is silently overridden by the global secret, so a token signed with the global secret passes a check that demanded a different one

Severity
high
Affected product
@fastify/jwt
Affected versions
@fastify/jwt < 10.2.2
Fixed in
@fastify/jwt 10.2.2
Added to NewScan
2026-08-16
Detected by
NewScan — free, self-hosted

How NewScan reports it

COMPONENT VERSION RANGE

NewScan fingerprints @fastify/jwt from its response and reports this CVE when the detected version falls inside the affected range below.

Added 2026-08-16. The bug is an authorization bypass, not a crypto break: an app that hands request.jwtVerify({key}) a narrower per-request key - a tenant key, a service key, a rotated key - had that key replaced by the plugin's global secret before verification, so any token the app itself could mint satisfied a check whose entire purpose was to demand a different signer. Same override on reply.jwtSign(payload, {key}). Fixed in 10.2.2. THIS IS THE FIRST SCOPED-NPM ADVISORY IN THIS PACK and it needed an engine change to be reachable at all: version_tools._techdb_names looked the dependency up by its last path segment, so `@fastify/jwt` was queried as `jwt` and could never match. Keying the row as bare `jwt` instead would have been the false-positive version of the same bug - @nestjs/jwt and @auth/jwt are unrelated packages on unrelated version series - so the fix was to try the FULL name first and keep the base as the fallback the Angular/Laravel/Maven aliases need. Version source: /package.json, /package-lock.json or /yarn.lock served from the web root (version_tools._MANIFESTS); all three npm parsers already emit the scoped name unchanged. INERT ON EXISTING INSTALLS until the next release carries that lookup change - the row alone does nothing.

References

Scan for this yourself — local, in-band scanning is free.

Get NewScan (FREE) →