🚨 [致命级紧急漏洞] Keycloak / RHBK 曝密码重置绕过与任意账户接管高危漏洞 (CVE-2026-18963,CVSS 9.1):深度剖析与生产级止血实战


0. 序言:老巢被偷!CVSS 9.1 的“核弹级”认证穿透

如果你的企业基础设施或 SaaS 平台正在使用 KeycloakRed Hat build of Keycloak (RHBK) 作为统一身份认证中心(SSO / IAM),并且你在登录页开启了「忘记密码(Forgot Password)」自服务功能——

[!CAUTION]
请立刻放下手里的咖啡,先去检查你的生产集群版本!
Red Hat 官方与 Keycloak 社区最新披露了一个评分为 CVSS 9.1(Critical 致命级) 的超高危逻辑漏洞:CVE-2026-18963
攻击者在完全未登录(未经认证)的情况下,可以直接利用重置密码认证流的状态机逻辑缺陷,强行跳过邮箱验证码与魔法链接校验,直接重置包括全局超级管理员(admin)在内的任意账户密码,实现无脑夺舍与任意账户接管(Account Takeover, ATO)

在现代云原生架构里,SSO 是整个企业访问控制的“单一信任源(Single Source of Truth)”。一旦认证中心被正面打穿,意味着后面的 Kubernetes 集群、内部管理后台、数据库网关、云控制台都直接向黑客敞开了大门。

今天这篇文章,咱们不搞那些虚头巴脑的套话,直接用一线运维和安全架构师的视角,把这个漏洞的影响矩阵、底层逻辑缺陷、攻击利用链、分钟级应急止血方案与平滑热更指南彻底讲透。


1. 资产盘点:受影响版本与排查矩阵

首先对号入座,看看你的集群是不是正处于“裸奔”状态:

flowchart TD
    A["排查生产 Keycloak / RHBK 实例"] --> B{"是否开启了「Forgot Password」功能?"}
    B -- "未开启 / 已关闭" --> C["暂时安全(无暴露攻击面)<br/>建议排期常规安全补丁升级"]
    B -- "已开启(默认或业务需要)" --> D{"检查当前运行版本"}
    D -- "Upstream Keycloak < 26.7.2" --> E["🚨 处于高危易受攻击状态!<br/>立即执行应急止血与升级"]
    D -- "RHBK < 26.4.15 或 < 26.6.6" --> E
    D -- "Keycloak >= 26.7.2 或 RHBK >= 26.4.15 / 26.6.6" --> F["✅ 已包含官方安全修复<br/>安全受控"]

1.1 详细影响版本对照表

产品线 / 部署形态 受影响版本区间(Vulnerable) 官方安全修复版本(Fixed) 修复建议与处置优先级
Upstream Keycloak < 26.7.2(包含 26.7.1 及所有历史版本) 26.7.2 及以上 🔴 P0 紧急(立即升级 / 止血)
RHBK 26.4 发布流 < 26.4.15 26.4.15 🔴 P0 紧急(企业支持通道)
RHBK 26.6 发布流 < 26.6.5 及以前 26.6.6 🔴 P0 紧急(企业支持通道)
Red Hat SSO 7.x (Legacy) 已进入 EOL 维护阶段,需排查是否 Backport 建议加速迁移至 RHBK 26+ 🟡 P1 关注(全面排查配置)

[!WARNING]
漏洞触发先决条件
只要目标 Realm 的 Login 配置中开启了 Forgot password(对应配置项 resetPasswordAllowed=true),且攻击者能够访问 Keycloak 登录端点,漏洞即可被远程直接触发,无需任何前置账号权限


2. 根因拆解:认证流状态机为何被“偷家”?

Keycloak 的认证体系是以 Authentication Flow(认证流)Execution Step(执行步骤) 为核心构建的状态机引擎。默认情况下,重置密码流程(reset-credentials)的设计链路如下:

[输入用户名/邮箱] ➔ [系统发送重置邮件] ➔ [用户点击邮件链接/输入验证码] ➔ [重置新密码] ➔ [流程结束]

2.1 漏洞产生的核心机理:状态混淆与步骤越权(Step Bypass)

在 Keycloak 底层的 AuthenticationProcessorResetCredentialEmail 处理器交互过程中,存在严重的状态校验缺陷:

sequenceDiagram
    autonumber
    actor Attacker as 外部攻击者
    participant KC as Keycloak / RHBK 认证流
    participant Mail as 目标用户邮箱 (未授权)
    participant DB as Keycloak 数据库 / 凭据存储

    Note over Attacker,KC: 🚨 正常流程应该强制要求邮箱 Token
    Attacker->>KC: 1. 发起重置请求 /login-actions/reset-credentials?client_id=...
    KC-->>Attacker: 渲染输入用户名表单
    Attacker->>KC: 2. 提交目标超级管理员用户名 (如 admin)
    KC->>Mail: 3. (系统内部触发) 向 admin 邮箱发送重置邮件

    Note over Attacker,KC: 💥 漏洞触发点:攻击者直接篡改 Execution 状态参数
    Attacker->>KC: 4. 构造特制请求,跳过邮件验证环节,伪造 Reset Credentials 状态为 SUCCESS
    KC->>KC: 5. 状态机未严格校验前置邮件 Token 签发有效性,错误放行流转
    KC-->>Attacker: 6. 直接下发重置密码表单页面 (Reset Password Form)!
    Attacker->>KC: 7. 提交全新密码 (NewPassword@2026)
    KC->>DB: 8. 成功覆盖目标账户哈希凭据
    KC-->>Attacker: 9. 提示密码重置成功,攻击者完成管理员账户夺舍 (ATO)!

2.2 为什么传统防护机制会失效?

  1. 前后端状态脱节:前端提交步骤状态与服务端 Action Token 上下文存在断层。攻击者通过伪造流程控制参数,使服务端误认为“上一个 Required Action(邮件确认)已由用户完成”。
  2. 缺乏防篡改会话级绑定:在流转过程中,会话上下文未将“邮件下发凭证 ID”与“最终密码重置动作”进行强签名绑定,导致中间步骤被完全架空。

3. 生产级应急响应:三道防线极速止血

面对这种 CVSS 9.1 的高危 0day/Nday,安全响应的核心原则是:“先拔网线止血,再做平滑升级,最后审计回溯”

flowchart LR
    Step1["🛡️ 第一道防线<br/><b>分钟级紧急止血</b><br/>禁用重置密码入口 / WAF 拦截"] 
    --> Step2["🚀 第二道防线<br/><b>平滑升级与补丁热更</b><br/>升级至 Keycloak 26.7.2+"] 
    --> Step3["🔍 第三道防线<br/><b>取证审计与防御纵深</b><br/>日志排查 / 开启硬件 MFA"]

3.1 第一道防线:零停机、分钟级止血(临时缓解方案)

如果你的生产环境升级需要走漫长的发版流程、审批流或测试验证,请先执行以下两套止血方案之一,确保外网无法利用该漏洞。

方案 A:通过 UI 或 CLI 批量关闭「忘记密码」开关(推荐)

1. Web 后台可视化操作

登录 Keycloak 管理控制台:
- 进入对应的 Realm Settings ➔ 点击 Login 标签页;
- 找到 Forgot password 选项,将其切换为 OFF(关闭)
- 点击 Save 保存。
(注意:若有多个 Realm,需对每一个对外提供服务的 Realm 逐一关闭)

2. 运维老鸟专属:通过 kcadm.sh 命令行全自动批量关闭

如果你的集群里有几十甚至上百个 Realm,登录后台点到手抽筋不可取。使用官方 CLI 工具一键脚本化处置:

#!/usr/bin/env bash
# ==============================================================================
# Keycloak CVE-2026-18963 紧急止血脚本:一键关闭所有 Realm 忘记密码入口
# ==============================================================================
set -euo pipefail

KEYCLOAK_URL="http://127.0.0.1:8080"
ADMIN_USER="admin"
ADMIN_PASS="YourSuperSecureAdminPassword"
KCADM_BIN="/opt/keycloak/bin/kcadm.sh"

echo "[*] 正在登录 Keycloak Admin CLI..."
$KCADM_BIN config credentials \
  --server "${KEYCLOAK_URL}" \
  --realm master \
  --user "${ADMIN_USER}" \
  --password "${ADMIN_PASS}"

echo "[*] 获取所有 Realm 列表..."
REALMS=$($KCADM_BIN get realms --fields id -r master | grep -o '"id" : "[^"]*"' | awk -F'"' '{print $4}')

for r in $REALMS; do
    echo "[*] 正在处理 Realm: [${r}] -> 禁用 resetPasswordAllowed..."
    $KCADM_BIN update "realms/${r}" -s resetPasswordAllowed=false
done

echo "[SUCCESS] 所有 Realm 的「忘记密码」入口已全部关闭,漏洞攻击面已消除!"

方案 B:在边缘网关 / WAF / Nginx 层精准拦截

如果连 CLI 登录都受限,可以直接在反向代理层(Nginx / Envoy / Cloudflare WAF)对重置密码流路径进行拦截阻断:

# Nginx 紧急阻断 Keycloak 重置密码流量配置
location ~* /auth/realms/[^/]+/login-actions/reset-credentials {
    return 403 "Password reset is temporarily disabled due to emergency maintenance.";
}

# 针对 Keycloak 26+ Quarkus 默认路径
location ~* /realms/[^/]+/login-actions/reset-credentials {
    return 403 "Password reset is temporarily disabled due to emergency maintenance.";
}

3.2 第二道防线:生产级平滑补丁升级实战

临时关闭入口只能止血,彻底根治必须升级官方修复镜像。

1. Docker Compose 容器化平滑滚动升级

如果你使用 Docker Compose 部署:

services:
  keycloak:
    # 将镜像标签更新至修复版本 26.7.2+
    image: quay.io/keycloak/keycloak:26.7.2
    container_name: enterprise-keycloak
    command:
      - start
      - --optimized
      - --http-enabled=true
      - --hostname=sso.yourdomain.com
      - --proxy-headers=xforwarded
    environment:
      KC_DB: postgres
      KC_DB_URL_HOST: postgres-db
      KC_DB_URL_DATABASE: keycloak_db
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: ${DB_PASSWORD}
      # 性能调优:按需配置挥发性/持久化会话
      KC_CACHE_CONFIG_FILE: cache-ispn.xml
    restart: always

执行滚动更新:

# 1. 拉取最新安全加固镜像
docker compose pull keycloak

# 2. 备份数据库(升级前必做标准动作)
docker exec postgres-db pg_dump -U keycloak keycloak_db > /backup/keycloak_pre_cve_upgrade_$(date +%Y%m%d%H%M%S).sql

# 3. 平滑重启
docker compose up -d --no-deps keycloak

# 4. 观察 Quarkus 启动日志与 Schema 校验
docker compose logs -f keycloak

2. Kubernetes / Helm 升级注意事项

对于基于 Keycloak Operator 或 Helm 部署的 K8s 集群:
- 更新 values.yaml 中的 image.tag: "26.7.2"
- 建议配置 strategy.rollingUpdate.maxSurge: 1maxUnavailable: 0 保证会话不中断;
- 升级完毕后,即可放心地重新开启 resetPasswordAllowed=true


3.3 第三道防线:入侵取证与安全审计(排查是否被“偷家”)

升级完成后,必须进行事后复盘,确认在打补丁之前系统是否曾遭受在野利用。

1. 排查 Keycloak 审计事件日志(Event Logs)

在 Keycloak 控制台进入 Realm SettingsEventsAdmin Events / User Events,或直接查询数据库审计表:

-- 查询最近一段时间内发生的异常密码重置成功事件
SELECT 
    id, 
    event_time, 
    realm_id, 
    user_id, 
    ip_address, 
    details_json
FROM keycloak_event_entity
WHERE type = 'RESET_PASSWORD'
  AND event_time >= EXTRACT(EPOCH FROM (NOW() - INTERVAL '7 DAYS')) * 1000
ORDER BY event_time DESC;

[!TIP]
排查重点
1. 查看 user_id 是否对应高权限管理员账户;
2. 对比 ip_address 是否为未知的境外 IP、云厂商数据中心 IP 或 Tor/代理出口;
3. 检查是否有集中爆发的 RESET_PASSWORD 成功记录但对应的邮箱投递量明显异常。

2. 检查管理员账号最近凭据更新时间戳

-- 排查 master realm 下所有管理员密码最近修改时间
SELECT 
    u.id, 
    u.username, 
    u.email, 
    c.created_date, 
    to_timestamp(c.created_date / 1000) as password_last_updated
FROM user_entity u
JOIN credential c ON u.id = c.user_id
WHERE u.realm_id = 'master'
ORDER BY c.created_date DESC;

4. 架构反思与防御纵深(Defense in Depth)

这次 CVE-2026-18963 再次给所有做基础架构和安全运维的同学敲响了警钟:认证中心永远是攻击者最垂涎的兵家必争之地。单靠一个邮箱验证码做密码重置,在复杂的逻辑漏洞面前往往显得非常脆弱。

在实际生产体系中,我们建议落实以下四重防御纵深策略

mindmap
  root((IAM 防御纵深体系))
    特权账号物理隔离
      Master 域独立运维网络
      强制 WebAuthn / FIDO2 硬件 Key
      禁止特权账号自服务找回密码
    动态风险控制
      WAF 频率限制与暴力破解拦截
      异地重置与大流量异常阻断
    认证流多因子强化
      重置流程引入强制短信/MFA二次挑战
      敏感操作审批工作流
    全面可观测性
      SIEM / 日志中心实时告警联动
      密码变更企业微信/飞书/Slack秒级触达
  1. 特权账号杜绝“自服务找回”
    对于拥有全局控制权限的 master realm 管理员,应在安全规范中明确禁止通过前台邮箱找回密码。特权账户重置必须由安全团队走离线工单或物理控制台执行。
  2. 全面推行 WebAuthn / FIDO2 无密码或多因素强认证
    密码只是第一道凭据。为所有核心业务系统的管理员强制启用 Hardware Security Key(如 YubiKey),即使密码被恶意重置,攻击者在缺乏物理硬件 Key 的情况下依然无法完成二次登录。
  3. 关键事件多通道瞬时告警
    将 Keycloak 的 RESET_PASSWORDLOGIN_ERRORCODE_TO_TOKEN_ERROR 事件实时推送到 ELK / Datadog 或企业微信 / 钉钉机器人,实现异常行为 5 秒内感知。

5. 总结与行动清单

安全无小事,基础设施更是命门所在。针对本次 CVE-2026-18963,请各位运维与架构老铁严格对照以下 Checklist 快速闭环:

  • [ ] Step 1(今日必做):确认生产与预发所有 Realm 是否开启了 Forgot password
  • [ ] Step 2(立即止血):若未升级,立即通过 kcadm.sh 或 WAF 拦截重置密码路径;
  • [ ] Step 3(排期更新):拉取 Keycloak 26.7.2+ 或 RHBK 26.4.15+ / 26.6.6+ 完成滚动升级;
  • [ ] Step 4(安全取证):查询数据库与审计日志,核查近期是否有可疑管理员密码变更记录;
  • [ ] Step 5(加固纵深):收敛特权账号自服务权限,全面推进 WebAuthn 与 MFA 落地。

早排查、早止血、早升级,今晚才能睡个踏实觉!


参考技术源与公告:
- Red Hat Security Advisory: CVE-2026-18963 Official Advisory
- Keycloak Upstream Security Updates: Keycloak Release Notes 26.7.2

文章作者: tutu
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TutuのBlog
喜欢就支持一下吧