
Эксплойт для проверки концепции CVE-2026-18963 — обход аутентификации в процедуре восстановления пароля Keycloak, позволяющий сбросить пароль без надлежащей проверки. Включает неразрушающий режим проверки.
Proof of Concept для CVE-2026-18963 — уязвимости в процессе «Забыли пароль» /
выбора учётных данных в Keycloak, которая позволяет атакующему достичь
шага UPDATE_PASSWORD и сбросить пароль целевой учётной записи без
надлежащего завершения требуемой проверки личности (например, без
действительного OTP/второго фактора).
Скрипт управляет процессом полностью через HTTP (браузер/Selenium не требуются):
tryAnotherWay.startSessionPolling(), используемый
интерфейсом Keycloak для поддержания активной сессии аутентификации.UPDATE_PASSWORD.Этот инструмент предоставляется только для авторизованного тестирования безопасности и исследований (пентестов, которые вы проводите по заданию, CTF, собственных лабораторных сред или скоординированного раскрытия уязвимостей). Использование его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, незаконно. Автор и участники не несут ответственности за неправомерное использование или ущерб, причинённый этим инструментом.
Используйте --stop-at-update-password, чтобы получить недеструктивное доказательство (достижение
UPDATE_PASSWORD без отправки нового пароля), если этого достаточно для
демонстрации проблемы.
requestsbeautifulsoup4git clone <this-repo-url>
cd POC
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
python poc_cve_2026_18963_terminal.py \
--base-url http://localhost:8080 \
--realm master \
--client-id account \
--username admin \
--new-password "NewPassword123!"
| Flag | Default | Description |
|---|---|---|
--base-url | http://localhost:8080 | Базовый URL целевого экземпляра Keycloak |
--realm | master | Целевой realm |
--client-id | account | OIDC client ID, используемый для запуска процесса входа |
--username | admin | Целевое имя пользователя |
--new-password | (required) | Пароль для установки для целевой учётной записи |
--stop-at-update-password | off | Остановиться при достижении UPDATE_PASSWORD, не отправляя новый пароль (доказательство без эксплуатации) |
--timeout | 10.0 | Тайм-аут HTTP-запроса в секундах |
--output-dir | debug_http | Каталог, в который сохраняется каждый промежуточный HTML-ответ для отладки |
--insecure | off | Отключить проверку TLS-сертификатов |
python poc_cve_2026_18963_terminal.py \
--base-url https://target.example.com \
--realm myrealm \
--username victim \
--new-password unused \
--stop-at-update-password
Каждый промежуточный HTTP-ответ сохраняется в каталог --output-dir (по
умолчанию debug_http) как 01_login.html, 02_reset.html, ... для
автономного просмотра. Скрипт завершается с кодом 0 при успехе и 1
при ошибке, выводя сообщения о ходе выполнения и диагностические
сообщения в stdout.
Aurélien LOIE