Skip to main content

fast-jwt CVE-2026-107719

| EUVDEUVD-2026-95343 MEDIUM
Insufficient Session Expiration (CWE-613)
2026-10-08 GitHub_M GHSA-x937-hj6v-793p
4.2
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Obtain legitimately issued JWT (exp, no iat)
  2. Delivery
    Server caches verified claims
  3. Exploit
    Wait for token exp to pass
  4. Execution
    Replay identical bearer token
  5. Persist
    Cache hit returns claims, exp bypassed
  6. Impact
    Access extended until cacheTTL ends

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 ALL of: (1) the verifier created via createVerifier with caching enabled (cache: true); (2) tokens that contain an exp claim but NO iat claim (e.g., signed with noTimestamp), since cacheSet only derives the exp-based cache deadline when iat is present; and (3) an attacker able to replay the same previously-valid bearer token they already hold. Limiting factors that reduce real-world risk: caching is an opt-in configuration (not default); the attacker cannot forge or alter a token, only replay their own; and acceptance is capped at the cache entry's TTL (cacheTTL default 600000 ms / 10 minutes), after which normal expiration rejection resumes. Applications whose tokens include iat, or that run without the cache, are not affected.

Impact

This is a genuine but low-to-moderate priority issue, well-aligned across the available signals. The vendor-confirmed CVSS 3.1 vector (AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N, base 4.2 Medium) is internally consistent with the GHSA advisory: AC:H reflects the narrow preconditions (caching must be enabled AND the token must carry exp without iat), PR:L reflects that the attacker must already possess a legitimately-issued, previously-valid signed token, and the Low confidentiality/integrity impacts match a session-expiration bypass (CWE-613) that extends - but does not forge - access. No EPSS score, no CISA KEV listing, and no standalone public exploit were provided, so exploitation status is 'no public exploit identified at time of analysis'; however, the advisory contains a detailed step-by-step reproduction timeline and the fix commit ships working regression tests, which lowers the barrier to building a PoC even though none is published. There is no SSVC decision data in the input. The impact is self-limited: the attacker can only replay their OWN already-valid token, and acceptance ends when the cache entry expires (cacheTTL default 10 minutes), so the practical gain is a bounded extension of access, not privilege escalation or forgery. No signals conflict; the main caveat is that the vulnerable state requires a specific non-default verifier configuration, so blanket 'high risk' framing would overstate it.

Exploit ScenarioDerived

An application uses fast-jwt's createVerifier with cache enabled to validate bearer tokens, and its tokens are issued with an exp claim but no iat (e.g., signed with noTimestamp). An attacker who holds a currently-valid token lets it reach its expiry, then replays the identical token; because the first successful verification cached the result with an incorrect deadline falling back to cacheTTL, the cache returns the stored claims before expiration is rechecked. No public exploit is published, but the advisory provides a precise reproduction timeline making exploitation straightforward.

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 08, 2026

Expired JSON Web Tokens can keep being accepted by fast-jwt through version 6.3.3 when the verifier is created with caching enabled (cache: true) and a token carries an exp claim but no iat claim. In src/verifier.js, cacheSet only derives an exp-based cache deadline when iat is present, so the entry falls back to the generic cacheTTL (600000 ms / 10 minutes by default), and a later cache hit returns the stored payload before expiration is revalidated - allowing an attacker who already holds such a token to replay it past its expiry for up to the cache TTL. The attacker cannot forge or alter a token, and the CVSS vector indicates a low-privilege authenticated context (PR:L); no public exploit code and no confirmed active exploitation were identified at time of analysis. The issue is fixed in 6.3.4.

RemediationAI

Upgrade to fast-jwt 6.3.4 or later, the vendor-released patch that rewrites cacheSet to derive cache bounds from exp and maxAge exactly as the validators do; the fix is available as release tag v6.3.4 (https://github.com/nearform/fast-jwt/releases/tag/v6.3.4) and as commit fc1ddbbe5ce38066ba2cea0b0ce0233932757167, with the full advisory at https://github.com/nearform/fast-jwt/security/advisories/GHSA-x937-hj6v-793p. If an immediate upgrade is not possible, disabling the verifier cache by creating the verifier without cache: true (cache: false) restores correct expiration enforcement immediately, at the cost of repeating signature verification on every request and the associated CPU overhead; alternatively, ensure every token issued by dependent services carries an iat claim (for instance by removing noTimestamp: true from the signer), since the flaw only manifests for tokens that have exp but no iat - tokens with iat follow the correct cache deadline path. Reducing cacheTTL below the default 600000 ms shrinks the maximum window during which an expired token can still be replayed but does not eliminate the defect, and is only a stopgap. Note that the exposure is bounded by design: an attacker can only replay a token they already hold, cannot forge or modify one, and acceptance ends when the cache entry expires. Rotating any bearer tokens that were issued without iat and may have been replayed, and shortening token lifetimes, are sensible compensating actions while patching.

Affected VersionsENISA

fast-jwt < 6.3.4

Affected Packages

npm fast-jwt fix: 6.3.4

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

fast-jwt is Nearform's high-performance JavaScript JWT implementation for Node.js (CPE cpe:2.3:a:nearform:fast-jwt, npm package fast-jwt). The defect is an insufficient session expiration weakness, CWE-613, manifesting as a time-of-check/time-of-use gap introduced by the optional verification cache (built on mnemonist). JWTs may legitimately omit iat (the library's signer produces such tokens when configured with noTimestamp: true), while exp is the claim that governs token lifetime. In the vulnerable code path (src/verifier.js around lines 127-146) the cache deadline cacheValue[2] is only computed from exp inside the hasIat branch; absent iat, the entry falls back to clockTimestamp + clockTolerance + cacheTTL. The cache lookup (around lines 372-388) executes before the token is decoded and before verifyToken performs its expiration check, so cached claims are returned to the caller without re-evaluating exp. The net effect is that a token whose exp has already passed can continue to be treated as valid until the cache entry's TTL elapses, at which point the normal FAST_JWT_EXPIRED rejection resumes. The 6.3.4 fix rewrites cacheSet so each cache bound mirrors its corresponding validator, always computing an upper bound from exp (min of exp + clockTolerance and clockTimestamp + clockTolerance + cacheTTL) and from maxAge when iat is present, and changes the lookup condition so 0 is treated as a real timestamp rather than 'no expiry'. The repository tags relevant to this issue are 'Information Disclosure' and 'Fast Jwt'; the referenced commit is fc1ddbbe5ce38066ba2cea0b0ce0233932757167.

Know when Fast 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 (GitHub_M) PRIMARY 4.2 MEDIUM
AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N
vuln.today AI 4.2 MEDIUM

Caching must be enabled and tokens must lack iat with a narrow replay window (AC:H); attacker must already hold a valid token (PR:L); impact is bounded extension of that user's access (C:L/I:L/A:N).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

1
Patch available
Oct 08, 2026 - 23:02 EUVD

DescriptionCVE.org

fast-jwt provides fast JSON Web Token (JWT) implementation. Prior to 6.3.4, the fast-jwt createVerifier cache can continue accepting a previously valid, signed JWT after its exp time when caching is enabled and the token has exp but no iat. In src/verifier.js, cacheSet derives the exp cache deadline only when iat is present, so the cache falls back to cacheTTL, and a later cache hit returns the saved payload before verifyToken rechecks expiration. An attacker who can replay the same cached bearer token can extend access until the cache entry expires, but cannot forge a token through this issue. This issue is fixed in version 6.3.4.

Threat Intelligence Overview

EPSS Score
0.2%
Top 88% exploitable
Prevalence
Medium
popular Node.js JWT library (underpins @fastify/jwt), but library not ubiquitous platform
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

21
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +21
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