
Эксплойт proof-of-concept для CVE-2026-18963, демонстрирующий неаутентифицированный захват учётной записи путём обхода процедуры сброса учётных данных в веб-приложениях.
★ CVE-2026-18963 PoC обхода потока сброса учётных данных в Keycloak ★
https://github.com/user-attachments/assets/ebed1e64-a40c-4333-be18-9acbadd655b0
CVE-2026-18963 — это критическая уязвимость захвата учётной записи без аутентификации в компоненте Keycloak
keycloak-services(CVSS 9.1). Ошибка в конечном автомате аутентификации при сбросе учётных данных позволяет удалённому злоумышленнику обойти этап проверки электронной почты и добраться до формы обновления пароля, не имея ссылки для сброса. Атакуя известное имя пользователя, злоумышленник может установить новый пароль и получить контроль над учётной записью жертвы без аутентификации и без взаимодействия с пользователем.
Уязвимый поток сохраняет состояние селектора учётных данных как примечание аутентификации уровня сессии, вместо того чтобы привязывать его к выполнению, которое отобразило селектор. Поэтому повторный вход в поток сброса может повторно использовать устаревшее состояние селектора для другого выполнения. В затронутых версиях аутентификатор сброса по электронной почте также принимает действие, не подтверждая, что оно было достигнуто через действительный токен действия электронной почты. Объединение этих поведений продвигает злоумышленника напрямую к UPDATE_PASSWORD.
| Категория | Версия |
|---|---|
| Уязвимые | Keycloak 26.0.0 ≤ version < 26.4.15 |
| Уязвимые | Keycloak 26.5.0 ≤ version < 26.6.6 |
| Уязвимые | Keycloak 26.7.0 ≤ version < 26.7.2 |
| Исправленные | 26.4.15, 26.6.6, 26.7.2 (соответствующие ветки релизов) |
В этой лабораторной работе используется Keycloak 26.7.1.
Соберите и запустите уязвимое окружение Keycloak 26.7.1. Образ импортирует тестовый realm с включённым уязвимым потоком сброса учётных данных, предварительно созданной учётной записью victim и порталом EQST со страницей защищённого флага.
docker build -t cve-2026-18963 .
docker run --rm -d \
--name cve-2026-18963 \
-p 9105:9105 \
-e PORTAL_PUBLIC_URL=http://127.0.0.1:9105 \
cve-2026-18963
Дождитесь запуска Keycloak, затем откройте портал:
http://127.0.0.1:9105
| Предусловие | Состояние в этой лабораторной работе |
|---|---|
| Keycloak | 26.7.1 (уязвимая) |
| Realm | cve-lab |
| Забыли пароль | включено |
| Целевая учётная запись | victim |
| Базовый URL Keycloak | http://127.0.0.1:9105/keycloak |
Входящий в комплект exploit.py автоматизирует манипуляцию состоянием потока сброса, запрашивает форму обновления пароля без использования токена действия электронной почты, меняет пароль жертвы и подтверждает захват, запрашивая токен доступа с новыми учётными данными.
Установите зависимость Python:
python3 -m pip install requests
Запустите эксплойт с URL Keycloak, именем пользователя жертвы и новым паролем:
# python3 exploit.py <keycloak-url> <victim> <new-password>
python3 exploit.py \
http://127.0.0.1:9105/keycloak \
victim \
'NewPassword1!'
Успешный запуск выводит:
[*] selector note set via tryAnotherWay
[*] victim submitted: victim
[*] update-password form served without an action token
[+] VULNERABLE - victim password is now 'NewPassword1!'
Откройте http://127.0.0.1:9105, нажмите LOGIN и аутентифицируйтесь как victim с новым паролем, чтобы подтвердить захват учётной записи.