Skip to main content

@fastify/jwt CVE-2026-110024

| EUVDEUVD-2026-103670 MEDIUM
Insufficient Session Expiration (CWE-613)
2026-10-18 openjs
6.8
CVSS 3.1 · Vendor: openjs
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain valid long-lived token
  2. Exploit
    Identify non-expiring JWT lacking exp claim
  3. Execution
    Replay token to protected endpoints
  4. Impact
    Maintain 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

@fastify/jwt 0 <10.2.5

Affected Packages

euvd fastify_jwt fix: 10.2.5

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

Vendor (openjs) PRIMARY 6.8 MEDIUM
AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
vuln.today AI 6.8 MEDIUM

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N
4.0 AV:N/AC:H/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (openjs).

CVSS VectorVendor: openjs

Attack Vector
Network
Attack Complexity
High
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
None

Lifecycle Timeline

1
Patch available
Oct 18, 2026 - 16:32 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 92% exploitable
Prevalence
Medium
popular JWT plugin within the widely-used Fastify Node.js ecosystem
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy