ZeroHour

CVE-2026-55250

niche

Token Replay in Maravel Framework via Truncated JWT Blacklist (tymon/jwt-auth)

CVSS 4.0
8.7 high
EPSS
<1%p44
Published
()
Modified
AI analysis

Maravel (macropay-solutions/maravel-framework) prior to version 10.74.0 is vulnerable to a high-severity token replay flaw caused by a lifecycle mismatch between stateless JWT validation and the O(1) Atomic Lazy Eviction tagged cache, which enforces a strict global TTL cap of 7,200 seconds (2 hours, Container::TAGGED_CACHE_TTL_CAP_SECONDS) on tagged entries and instantly invalidates tagged indexes whenever a tag flush bumps the atomic master version pointer. tymon/jwt-auth automatically detects cache-tag support and stores 14-day token blacklist (jti) entries under a 'tymon.jwt' tag, so when cache memory pressure causes premature eviction, the 2-hour cap expires the entries, or a Cache::tags(...)->flush() (including cache self-cleaning) renders the existing index unreachable, the blacklist records are wiped while the tokens' cryptographic signatures remain valid for up to 14 days. An attacker who has stolen or captured a token, or a user who has legitimately logged out, can therefore silently replay that token across the entire API gateway long after it should have been rejected (CVSS 4.0: 8.7 High, network-exploitable without privileges or user interaction). Applications running Maravel-Framework v20.x natively, or v10.x with the PR #104 TaggedCache/TagSet DI-container backport, that use tymon/jwt-auth or any equivalent tagged-cache blacklist package are affected, and native Laravel applications using cache tags under volatile or eviction-capped cache environments may also be exposed. No public proof-of-concept is known, the issue is not in CISA KEV, and EPSS estimates a 0.6% probability of exploitation within 30 days.

What to do: Upgrade Maravel to 10.74.0, which enables the fixed tagged cache from 20.x to be backported into 10.x by resolving TagSet and TaggedCache from the DI container, and apply the vendor's decoupling fix as the advisory instructs, since no framework version upgrade alone safely bypasses this lifecycle collision. In the meantime, verify that your cache backend cannot truncate or evict 'tymon.jwt' blacklist entries before token expiry (check the 2-hour TAGGED_CACHE_TTL_CAP_SECONDS cap, low-memory eviction behavior, and any Cache::tags()->flush() invocations), and treat recently logged-out or previously captured tokens as potentially replayable, rotating credentials or shortening token lifetimes where feasible.

Affected
macropay-solutions Maravel (maravel-framework)prior to 10.74.0 (< 10.74.0)
macropay-solutions Maravel-Framework v20.x with native O(1) Atomic Lazy Eviction, and v10.x environments with the PR #104 TaggedCache/TagSev20.x natively; v10.x with PR #104 App-Cache TaggedCache/TagSet singletons installed
tymon jwt-auth (API token authentication with tagged-cache blacklist management)
other packages performing token blacklist management via relational/tagged cache (equivalent behavior)
Laravel native Laravel applications using cache tags
Estimated exposure
nicheunknown; plausibly only low thousands of deployments at most (no install counts published) — No active-install, scan, or user counts are provided in the data; Maravel is a niche dependency-injection-oriented PHP framework and the flaw requires the specific combination of tagged-cache-backed JWT blacklisting plus memory-pressure…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

Maravel, a PHP framework oriented towards dependency injection, prior to version 10.74.0 has a high-severity Token Replay Vulnerability arising from a structural lifecycle mismatch between stateless token validation engines and high-performance relational caching layers. Any application with low cache memory that causes premature eviction to free up memory and applications running macropay-solutions/maravel-framework that utilize tymon/jwt-auth for API token authentication and blacklist management or any other package that does the same may be affected. This architectural risk might also impact native Laravel applications utilizing cache tags under specific volatile or eviction-capped environments. tymon/jwt-auth automatically probes for cache tag support. If found, it forcefully wraps 14-day token blacklist entries (jti) inside a relational tymon.jwt tag. In environments where the O(1) Atomic Lazy Eviction model is active — either natively inside Maravel-Framework v20.x or manually backported into v10.x via the explicit DI container singletons provided in PR #104 (App\Cache\TaggedCache and App\Cache\TagSet) — a strict global tracking ceiling (Container::TAGGED_CACHE_TTL_CAP_SECONDS) of 7,200 seconds (2 hours) is enforced to secure the system against memory index bloat. This ceiling forcefully truncates the 14-day blacklist lifespan down to a maximum of 2 hours, after which individual tracking keys naturally expire and disappear from the active cache window. Furthermore, because the optimized engine implements a generational version matrix to achieve O(1) flush speeds, any programmatic or manual invocation of a tag flush or reset (e.g., Cache::tags([...])->flush()) instantly bumps the internal atomic master version pointer. This shifts the computed cryptographic composite hash (sha1($this->tags->getNamespace())) for all overlapping components, rendering the entire existing index immediately unreachable. Consequently, through either natural 2-hour expiration or an intervening tag flush execution (like the cache naturally cleaning old values to free up memory), the invalidation state records are entirely wiped out. Because the tokens' physical cryptographic signatures remain structurally valid for up to 14 days, stolen, hijacked, or legitimately logged-out tokens are instantly and silently resurrected across the entire API gateway, leaving the application critically vulnerable to widespread Token Replay Attacks. Because this issue is caused by an upstream architectural assumption within the tymon/jwt-auth package rather than a core defect inside the framework, there is no direct framework version upgrade that can safely bypass this lifecycle collision without breaking business cache recycling bounds. Maravel version 10.74.0 introduced a way to backport the new fixed tagged cache from 20.x into 10.x by resolving TagSet and TaggedCache from DI, which is how this latent architectural lifecycle vulnerability was discovered. Users must apply the decoupled configuration workaround outlined below. As a workaround, make sure that cache memory size does not generate early natural evictions from cache to free up space, deleting blacklisted jwt ids before they expire. Applications must decouple flat authentication vectors from the relational tagging subsystem. This forces token identifiers to write directly to the primary cache keyspace as flat, un-tagged key-value pairs where they securely retain their unclipped 14-day lifecycle.

Weakness
CWE-294, CWE-613, CWE-672
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.