
Библиотечный proof-of-concept-лабораторный стенд, демонстрирующий CVE-2026-29000 в pac4j-jwt, со сравнением уязвимой и исправленной версий с помощью Docker для показа принятия и отклонения поддельных JWT.
Этот репозиторий содержит PoC на уровне библиотеки для CVE-2026-29000 в pac4j-jwt.
Он сравнивает уязвимое и исправленное поведение на двух сценариях:
| Версия | Базовый сценарий | Атака | Результат |
|---|
6.0.3 | ✅ | ✅ | Уязвимая |
6.0.4.1 | ✅ | ✅ | Уязвимая |
6.3.3 | ✅ | ❌ | Исправленная |
Этот PoC демонстрирует создание аутентифицированного профиля с управляемыми атакующим subject и ролями на уязвимых версиях, тогда как исправленная версия отклоняет подделанный токен.
Это не демонстрация веб-приложения.
Это небольшая Java-программа, которая напрямую вызывает JwtAuthenticator и сравнивает несколько версий pac4j-jwt внутри Docker.
Цель — доказать три вещи:
Тестируемые версии были выбраны намеренно:
Это даёт лаборатории три полезные контрольные точки:
.
├── docker-compose.yml
├── Dockerfile
├── pom.xml
└── src/main/java/lab/Repro.java
docker-compose.yml
Определяет тестовую матрицу для каждой версии.
Dockerfile
Собирает и запускает PoC внутри контейнера.
pom.xml
Определяет зависимости и собирает исполняемый fat JAR.
src/main/java/lab/Repro.java
Собственно PoC-харнесс.
Файл docker-compose.yml определяет три сервиса:
v603 = тест pac4j-jwt 6.0.3v6041 = тест pac4j-jwt 6.0.4.1patched = тест pac4j-jwt 6.3.3Таким образом, эти команды означают «запустить PoC один раз против конкретной версии»:
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
--rm означает, что временный контейнер удаляется после завершения запуска.
docker compose build --no-cache
docker compose run --rm v603
docker compose run --rm v6041
docker compose run --rm patched
Для каждой версии программа выполняет два сценария.
Он генерирует легитимный токен и проверяет его через JwtAuthenticator.
Ожидаемый результат:
Он генерирует подделанный токен с управляемыми атакующим claims и проверяет его через JwtAuthenticator.
Ожидаемый результат:
Вы должны увидеть что-то вроде этого:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: ACCEPTED
observed_subject: admin#override
observed_roles: [ROLE_SUPERUSER, ROLE_ADMIN]
[summary]
conclusion: VULNERABLE: forged token accepted
Значение:
Вы должны увидеть что-то вроде этого:
[case] baseline
result: ACCEPTED
observed_subject: alice
observed_roles: [ROLE_USER]
[case] attack
result: REJECTED
reason: CredentialsException: A non-signed JWT cannot be accepted as signature configurations have been defined
[summary]
conclusion: PATCHED: forged token rejected
Значение:
Эта CVE затрагивает путь аутентификации на уровне библиотеки, а не отдельное приложение с одной универсальной моделью ролей.
Переиспользуемая часть — это форма атаки:
JwtAuthenticatorЧто не универсально для реальных приложений:
Поэтому этот репозиторий фокусируется на доказательстве того, что библиотека принимает подделанные управляемые атакующим claims на уязвимых версиях, а не на утверждении, что существует один универсальный токен, который автоматически сработает против произвольных приложений.
docker compose run --rm v603docker compose run --rm v6041docker compose run --rm patched


Этот проект демонстрирует три ключевых факта:
6.0.3 и 6.0.4.16.3.3Это ключевое доказательство «уязвимая версия против исправленной» для этой CVE в данном репозитории.
На уязвимых версиях подделанный токен не просто парсится — он создаёт аутентифицированный профиль с управляемыми атакующим subject и ролями.