Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid long-lived token
-
ExploitIdentify non-expiring JWT lacking exp claim
-
ExecutionReplay token to protected endpoints
-
ImpactMaintain unauthorized persistent access
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V7 - Session Management Session expiration enforcement
|
| Exploitation Conditions | Exploitation requires the application to call the top-level @fastify/jwt sign and/or verify methods while passing per-call options AND relying on globally configured temporal defaults (expiresIn for signing, maxAge for verifying); those global defaults are then silently dropped, producing tokens with no exp claim and verification that no longer enforces maximum token age. Applications that use the route-level sign/verify decorators, or that restate expiration/maxAge in every per-call option object, are NOT affected. Limiting factors: the vulnerable coding pattern must be present (non-universal), the attacker must already possess or capture a valid token to benefit from its non-expiry, and version must be prior to 10.2.5. |
| Impact | This is a moderate, conditional risk rather than an urgent priority. The CVSS 3.1 base score of 6.8 (AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N) reflects network reachability but high attack complexity and a requirement for some privilege (a valid token). No EPSS score, CISA KEV listing, or public POC was provided in the input, so there is no public exploit identified at time of analysis and no evidence of active exploitation. The core weakness (CWE-613, insufficient session expiration) is a logic/API-usage flaw: it only bites applications that call the top-level sign/verify methods with per-call options while depending on global defaults for temporal protections - the route-level decorators correctly merge and are unaffected. The high confidentiality/integrity impact is realistic only once this coding pattern is present, which is why AC:H is justified. Net: a genuine but defense-in-depth-dependent issue whose real-world severity hinges on whether a given deployment actually uses the vulnerable API pattern; absent exploitation telemetry, treat it as a patch-on-normal-cycle item unless the affected API usage is confirmed in your code. |
| Exploit ScenarioDerived | A Fastify application uses the top-level jwt.sign with per-call options (e.g., a custom audience) while relying on a global expiresIn/maxAge default; the resulting tokens silently carry no expiration and never expire. An attacker who obtains such a token - via theft, logging, phishing, or a leaked session - can reuse it indefinitely because verification no longer enforces the configured maximum age. No public exploit code was identified; exploitation requires first obtaining a valid (now non-expiring) token. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 18, 2026
JWT expiration enforcement in @fastify/jwt versions prior to 10.2.5 can be silently disabled because top-level sign() and verify() replace, rather than merge, globally configured JWT options with any per-call options object. Applications that use those top-level APIs while relying on global expiresIn or maxAge settings may issue tokens with no exp claim and accept stale tokens beyond the intended maximum age; route-level sign/verify decorators are unaffected. The vendor-released patch is 10.2.5, and no public exploit is identified at time of analysis, with no CISA KEV confirmation of active exploitation.
RemediationAI
Upgrade to @fastify/jwt 10.2.5 or later (vendor-released patch: 10.2.5). If immediate upgrade is not possible, change every top-level sign() call to explicitly pass the intended expiresIn and every top-level verify() call to explicitly pass maxAge, or migrate those calls to the route-level decorators, which merge options; this workaround is error-prone because any omitted option again drops the default, and it must be audited across all call sites. Review tokens issued during exposure for missing exp claims and revoke or rotate them as appropriate. Consult GHSA-f5gh-84pj-v2pg at https://github.com/fastify/fastify-jwt/security/advisories/GHSA-f5gh-84pj-v2pg and the OpenJS CNA advisory page https://cna.openjsf.org/security-advisories.html.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
JWT-based authentication relies on claims such as exp and verification options such as maxAge to bound token lifetime. @fastify/jwt exposes top-level sign/verify helpers and route-level decorators; the bug is in option precedence for the top-level helpers, where a supplied per-call options object overwrites the plugin's globally configured defaults instead of being merged. This maps to CWE-613 (Insufficient Session Expiration), and the CVSS vector CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N reflects network reachability with high attack complexity and low privileges, plus high confidentiality/integrity impact if stale tokens are accepted. The supplied CPE cpe:2.3:a:@fastify/jwt:@fastify/jwt:*:*:*:*:*:*:*:* identifies the plugin generally; the advisory narrows affected versions to prior to 10.2.5. Exploitation is conditional: the application must call top-level sign or verify with per-call options and depend on global temporal defaults; applications using route-level decorators or restating expiration in each call are not affected.
Know when Fastify Jwt gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
AC:H because it depends on a specific non-default API-usage pattern; PR:L since the attacker needs a valid token to exploit non-expiry; A:N as availability is unaffected.
Primary rating from Vendor (openjs).
CVSS VectorVendor: openjs
Lifecycle Timeline
1DescriptionCVE.org
@fastify/jwt is a JWT utility plugin for Fastify. In versions prior to 10.2.5, the top-level sign and verify methods replace the globally configured defaults with the per-call options instead of merging them, so passing any per-call option silently drops every global default that the call does not restate, including temporal protections such as token expiration and maximum accepted token age. A token signed this way carries no expiration claim and never expires, and verification stops enforcing a configured maximum age, so stale or never-expiring tokens are accepted. The route-level decorators for signing and verifying already merge options and are not affected. The issue is fixed in @fastify/jwt 10.2.5, and users should upgrade to 10.2.5 or later.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in Fastify Jwt
View allKey-based authorization bypass in @fastify/jwt before 10.2.2 permits any low-privileged authenticated user holding a tok
Tokens issued through @fastify/jwt before 10.2.3 can be created without an exp claim - and therefore never expire - when
EUVD-2026-103670
NVD
CVE.org
EPSS
GitHub
Exploit-DB