
Procure por rastros de exploração do CVE-2026-18963 (tomada de conta não autenticada do Keycloak) no banco de dados do Keycloak.
Um script psql que procura num banco de dados PostgreSQL do Keycloak por vestígios de exploração do CVE-2026-18963 (account takeover não autenticado através do fluxo de reset de credenciais).
Publicado pela KYOS. Escrevemo-lo enquanto corrigíamos as implementações do Keycloak que operamos, para verificar se ninguém tinha sido alvo de takeover durante a janela de exposição.
O CVE-2026-18963 é uma falha no fluxo de reset de credenciais do keycloak-services (keycloak#51833). Um atacante não autenticado consegue concluir o processo de redefinição de palavra-passe de qualquer utilizador sem clicar no link de verificação por e-mail, e depois definir uma nova palavra-passe na conta. Não é necessária qualquer interação do utilizador.
Gravidade: Crítica, CVSS v3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N), de acordo com a Red Hat e o NVD. A causa raiz é uma validação de estado inadequada no fluxo de autenticação, corrigida no keycloak#51844.
| Stream | Corrigido em |
|---|---|
| 26.7.x | 26.7.2 (notas de lançamento) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
Tudo o que esteja abaixo dessas versões nos streams suportados é vulnerável. Lançamentos fora de suporte (26.5.x, 26.3 e anteriores) não recebem correção: assuma exposição e atualize para um stream corrigido. A Red Hat lista o RH-SSO 7 legado como não afetado; o Red Hat Build do Keycloak 26.4/26.6 está corrigido em 26.4.15-1 / 26.6.6-1.
Desativar o reset de palavra-passe self-service remove o ponto de entrada vulnerável: Admin console > Realm settings > Login > "Forgot password" desligado, em cada realm. Através da API de administração: PUT /admin/realms/{realm} com {"resetPasswordAllowed": false}.
Isto bloqueia o endpoint login-actions/reset-credentials, mas também impede que utilizadores legítimos reponham a sua própria palavra-passe, por isso trate-o como uma medida provisória até atualizar. Note que a Red Hat não lista uma mitigação aprovada para este CVE; aplicar o patch é a única correção real.
O cve-2026-18963-keycloak-hunt.sql executa quatro consultas só de leitura:
| Consulta | O que encontra |
|---|---|
| Q0 | Se o realm armazena eventos de login/admin de todo, e o seu TTL. Se os eventos estiverem desativados ou expirados, resultados vazios em Q2/Q3 não provam nada. |
| Q1 | Todas as credenciais de palavra-passe definidas dentro da janela de exposição (credential.created_date). Isto é o próprio takeover e funciona mesmo que o registo de eventos estivesse desativado. |
| Q2 | Eventos de login de reset/credenciais, sinalizando qualquer reset concluído sem SEND_RESET_PASSWORD nas 24h anteriores (no_email_before = t). Esse sinalizador é a assinatura do CVE: o atacante nunca acionou o e-mail. |
| Q3 | Resets de credenciais e operações de execute-actions via API de administração, para excluir a via administrativa. |
# predefinições: realm 'master', janela desde 2026-06-01
psql -U keycloak -d keycloak -f cve-2026-18963-keycloak-hunt.sql
# realm e janela explícitos (executar uma vez por realm, citar valores exatamente assim)
psql -U keycloak -d keycloak \
-v realm="'myrealm'" -v since="'2026-05-01'" \
-f cve-2026-18963-keycloak-hunt.sql
Defina since para um pouco antes de a sua versão vulnerável ter sido publicada. Em 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
As linhas em Q1 não são automaticamente comprometimentos. Compare cada uma com uma causa legítima conhecida (reset self-service, ação do helpdesk, novo registo) e trate qualquer coisa inexplicada como candidata a takeover.
As linhas de Q2 com no_email_before = t em RESET_PASSWORD, UPDATE_CREDENTIAL ou UPDATE_PASSWORD são o indicador mais forte de exploração deste CVE. Correlacione a coluna ip_address com os seus registos de acesso.
Verifique Q0 primeiro: os eventos de login expiram (events_expiration) e podem estar totalmente desativados. Q1 não expira, por isso é a verificação mais fiável.
MIT, consulte o LICENSE. Fornecido tal como está, sem garantia.