
Поиск следов эксплуатации CVE-2026-18963 (неаутентифицированный захват учётной записи Keycloak) в базе данных Keycloak
Скрипт psql, который ищет в базе данных PostgreSQL Keycloak следы эксплуатации CVE-2026-18963 (неаутентифицированный перехват учетной записи через поток reset-credentials).
Опубликовано KYOS. Мы написали его, когда устраняли уязвимость в развертываниях Keycloak, которые мы обслуживаем, чтобы убедиться, что никто не был перехвачен в окне уязвимости.
CVE-2026-18963 — это недостаток в потоке reset-credentials модуля keycloak-services (keycloak#51833). Неаутентифицированный злоумышленник может завершить процесс сброса пароля для любого пользователя, не переходя по ссылке проверки по электронной почте, а затем установить для учетной записи новый пароль. Взаимодействие с пользователем не требуется.
Серьезность: критическая, CVSS v3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N), по данным Red Hat и NVD. Корневая причина — некорректная проверка состояния в потоке аутентификации, исправлено в keycloak#51844.
| Ветка | Исправлено в |
|---|---|
| 26.7.x | 26.7.2 (примечания к выпуску) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
Все версии ниже указанных в поддерживаемых ветках уязвимы. Выпуски, вышедшие из поддержки (26.5.x, 26.3 и старше), не получат исправление: предполагайте наличие уязвимости и обновляйтесь до исправленной ветки. Red Hat указывает устаревший RH-SSO 7 как не затронутый; Red Hat Build of Keycloak 26.4/26.6 исправлен в 26.4.15-1 / 26.6.6-1.
Отключение самостоятельного сброса пароля убирает уязвимую точку входа: Консоль администратора > Настройки realm > Вход, выключите «Forgot password» для каждого realm. Через admin API: PUT /admin/realms/{realm} с {"resetPasswordAllowed": false}.
Это блокирует конечную точку login-actions/reset-credentials, но также мешает легитимным пользователям сбрасывать собственные пароли, поэтому рассматривайте это как временную меру до обновления. Обратите внимание, что Red Hat не приводит одобренного смягчающего решения для этой CVE; установка обновления — единственное настоящее исправление.
cve-2026-18963-keycloak-hunt.sql выполняет четыре запроса только на чтение:
| Запрос | Что обнаруживает |
|---|---|
| Q0 | Хранит ли realm события входа и административные события вообще, и их TTL. Если события отключены или истекли, пустые результаты в Q2/Q3 ничего не доказывают. |
| Q1 | Каждый credential с паролем, установленный в окне уязвимости (credential.created_date). Это и есть сам перехват, и он работает, даже если журналирование событий было отключено. |
| Q2 | События входа reset/credential, помечающие любой завершенный сброс без SEND_RESET_PASSWORD за предыдущие 24 часа (no_email_before = t). Этот флаг — сигнатура CVE: злоумышленник никогда не запускал отправку письма. |
| Q3 | Операции сброса учетных данных и execute-actions через admin API, чтобы исключить маршрут, выполненный администратором. |
# defaults: realm 'master', window since 2026-06-01
psql -U keycloak -d keycloak -f cve-2026-18963-keycloak-hunt.sql
# explicit realm and window (run once per realm, quote values exactly like this)
psql -U keycloak -d keycloak \
-v realm="'myrealm'" -v since="'2026-05-01'" \
-f cve-2026-18963-keycloak-hunt.sql
Установите since на время непосредственно перед запуском вашей уязвимой версии. В Kubernetes:
kubectl exec -it my-postgres-pod -- \
psql -U keycloak -d keycloak -v realm="'myrealm'" -v since="'2026-05-01'" \
-f - < cve-2026-18963-keycloak-hunt.sql
Строки в Q1 не являются автоматически признаком компрометации. Сопоставьте каждую с известной легитимной причиной (самостоятельный сброс, действие службы поддержки, новая регистрация) и рассматривайте все необъяснимое как кандидата на перехват.
Строки Q2 с no_email_before = t для RESET_PASSWORD, UPDATE_CREDENTIAL или UPDATE_PASSWORD являются наиболее сильным индикатором эксплуатации этой CVE. Сопоставьте столбец ip_address с вашими журналами доступа.
Сначала проверьте Q0: события входа имеют срок действия (events_expiration) и могут быть полностью отключены. Q1 не истекает, поэтому это самая надежная проверка.
MIT, см. LICENSE. Предоставляется как есть, без гарантий.