
Prova de conceito de exploit para CVE-2026-18963, demonstrando tomada de conta não autenticada ao contornar o fluxo de redefinição de credenciais em aplicações web.
★ PoC de Bypass do Fluxo de Redefinição de Credenciais do Keycloak CVE-2026-18963 ★
https://github.com/user-attachments/assets/ebed1e64-a40c-4333-be18-9acbadd655b0
CVE-2026-18963 é uma vulnerabilidade crítica de tomada de conta não autenticada no componente
keycloak-servicesdo Keycloak (CVSS 9.1). Uma falha na máquina de estados de autenticação do fluxo de redefinição de credenciais permite que um atacante remoto contorne a etapa de verificação de e-mail e alcance o formulário de atualização de senha sem possuir o link de redefinição. Ao direcionar um nome de usuário conhecido, um atacante pode definir uma nova senha e assumir o controle da conta da vítima sem autenticação ou interação do usuário.
O fluxo vulnerável armazena o estado do seletor de credenciais como uma nota de autenticação de escopo de sessão, em vez de vinculá-lo à execução que exibiu o seletor. Portanto, reentrar no fluxo de redefinição pode reutilizar um estado de seletor obsoleto para outra execução. Nas versões afetadas, o autenticador de e-mail de redefinição também aceita uma ação sem confirmar que ela foi alcançada por meio de um token de ação de e-mail válido. Encadear esses comportamentos leva o atacante diretamente a UPDATE_PASSWORD.
| Categoria | Versão |
|---|---|
| Vulnerável | Keycloak 26.0.0 ≤ versão < 26.4.15 |
| Vulnerável | Keycloak 26.5.0 ≤ versão < 26.6.6 |
| Vulnerável | Keycloak 26.7.0 ≤ versão < 26.7.2 |
| Corrigida | 26.4.15, 26.6.6, 26.7.2 (respectivos ramos de lançamento) |
Este laboratório usa o Keycloak 26.7.1.
Compile e execute o ambiente vulnerável do Keycloak 26.7.1. A imagem importa um realm de teste com o fluxo vulnerável de redefinição de credenciais habilitado, uma conta victim pré-configurada e um portal EQST com uma página de flag protegida.
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
Aguarde o Keycloak iniciar e abra o portal:
http://127.0.0.1:9105
| Pré-condição | Estado neste laboratório |
|---|---|
| Keycloak | 26.7.1 (vulnerável) |
| Realm | cve-lab |
| Esqueci minha senha | habilitado |
| Conta alvo | victim |
| URL base do Keycloak | http://127.0.0.1:9105/keycloak |
O exploit.py incluído automatiza a manipulação de estado do fluxo de redefinição, solicita o formulário de atualização de senha sem consumir um token de ação de e-mail, altera a senha da vítima e verifica a tomada de conta solicitando um token de acesso com as novas credenciais.
Instale a dependência Python:
python3 -m pip install requests
Execute o exploit com a URL do Keycloak, o nome de usuário da vítima e uma nova senha:
# python3 exploit.py <keycloak-url> <victim> <new-password>
python3 exploit.py \
http://127.0.0.1:9105/keycloak \
victim \
'NewPassword1!'
Uma execução bem-sucedida imprime:
[*] selector note set via tryAnotherWay
[*] victim submitted: victim
[*] update-password form served without an action token
[+] VULNERABLE - victim password is now 'NewPassword1!'
Abra http://127.0.0.1:9105, clique em LOGIN e autentique-se como victim com a nova senha para confirmar a tomada de conta.