Maravel, PHP-фреймворк, ориентированный на внедрение зависимостей, до версии 10.74.0 имеет серьезную уязвимость воспроизведения токенов, возникающую из-за структурного несоответствия жизненного цикла между механизмами проверки токенов без сохранения состояния и высокопроизводительными уровнями реляционного кэширования. Это может повлиять на любое приложение с низким объемом кэш-памяти, которое приводит к преждевременному вытеснению для освобождения памяти, а также приложения, работающие под управлением Macropay-solutions/maravel-framework, которые используют tymon/jwt-auth для аутентификации токенов API и управления черным списком, или любой другой пакет, который делает то же самое. Этот архитектурный риск может также повлиять на собственные приложения Laravel, использующие теги кэша в определенных нестабильных или ограниченных средах. tymon/jwt-auth автоматически проверяет наличие поддержки тегов кэша.
Если он найден, он принудительно помещает записи черного списка токенов на 14 дней (jti) в реляционный тег tymon.jwt. В средах, где активна модель атомарного ленивого выселения O(1) — либо изначально в Maravel-Framework v20.x, либо вручную перенесенная в v10.x с помощью явных синглтонов контейнера DI, представленных в PR № 104 (App\Cache\TaggedCache и App\Cache\TagSet), — строгий глобальный потолок отслеживания (Container::TAGGED_CACHE_TTL_CAP_SECONDS) 7200 секунд (2 часа) установлены для защиты системы от раздувания индекса памяти. Этот потолок принудительно сокращает 14-дневный срок действия черного списка максимум до 2 часов, после чего срок действия отдельных ключей отслеживания естественным образом истекает и они исчезают из активного окна кэша.
Более того, поскольку оптимизированный движок реализует матрицу версий поколений для достижения скорости очистки O(1), любой программный или ручной вызов очистки или сброса тега (например, Cache::tags([...])->flush()) мгновенно сдвигает внутренний атомарный указатель основной версии. Это смещает вычисленный криптографический составной хеш (sha1($this->tags->getNamespace())) для всех перекрывающихся компонентов, делая весь существующий индекс сразу недоступным. Следовательно, либо в результате естественного двухчасового истечения срока действия, либо в результате промежуточного выполнения очистки тега (например, при естественной очистке кэша старых значений для освобождения памяти) записи состояния недействительности полностью уничтожаются.
Поскольку физические криптографические подписи токенов остаются структурно действительными до 14 дней, украденные, взломанные или законно вышедшие из системы токены мгновенно и бесшумно восстанавливаются по всему шлюзу API, что делает приложение критически уязвимым для широко распространенных атак с повторным воспроизведением токенов. Поскольку эта проблема вызвана архитектурным предположением вышестоящего уровня в пакете tymon/jwt-auth, а не основным дефектом внутри платформы, не существует прямого обновления версии платформы, которое могло бы безопасно обойти эту коллизию жизненного цикла, не нарушая границ повторного использования бизнес-кэша. В версии 10.74.0 Maravel появился способ резервного копирования нового фиксированного кэша тегов из версии 20.x в версию 10.x путем разрешения TagSet и TaggedCache из DI, и именно так была обнаружена эта скрытая уязвимость жизненного цикла архитектуры.
Пользователи должны применить обходной путь несвязанной конфигурации, описанный ниже. В качестве обходного пути убедитесь, что размер кэш-памяти не приводит к преждевременному естественному вытеснению из кэша для освобождения места, удаляя идентификаторы jwt из черного списка до истечения их срока действия. Приложения должны отделять плоские векторы аутентификации от подсистемы реляционных тегов.
Это заставляет идентификаторы токенов записывать непосредственно в пространство ключей первичного кэша в виде плоских, немаркированных пар ключ-значение, где они надежно сохраняют свой необрезанный 14-дневный жизненный цикл.
Показать оригинальное описание (EN)
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.
Характеристики атаки
Последствия
Строка CVSS v4.0