IPBUF安全漏洞报告
English
CVE-2026-43888 CVSS 8.7 高危

CVE-2026-43888 Outline协作文档服务Zip解压路径穿越漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-43888
漏洞类型
路径穿越
CVSS评分
8.7 高危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Outline

相关标签

路径穿越沙箱逃逸文件上传OutlineZip Slip

漏洞概述

Outline是一款用于协作文档的服务。在1.7.0版本之前,其ZipHelper.extract组件存在安全漏洞。当计算ZIP条目的提取路径时,如果嵌套路径足够长,导致连接后的文件系统路径超过MAX_PATH_LENGTH(4096字节), trimFileAndExt函数会静默地删除所有目录组件并返回一个裸文件名。这导致fs.createWriteStream在进程工作目录而非提取沙箱内打开文件。由于cleanupExtractedData仅删除临时提取目录,逃逸的文件会在导入清理后持续存在。

技术细节

该漏洞源于Outline处理ZIP文件时的路径验证逻辑缺陷。具体而言,ZipHelper.extract在处理文件路径时调用了trimFileAndExt辅助函数,该函数在截断文件名时使用path.basename。攻击者可以构造一个包含超长嵌套路径的恶意ZIP文件。当路径长度超过4096字节限制时,trimFileAndExt会错误地剥离路径中的所有目录信息,仅保留文件名。随后,fs.createWriteStream根据处理后的路径创建文件流,由于缺少相对路径引导,文件被直接写入进程的当前工作目录(CWD),打破了沙箱限制。此外,系统的清理机制仅针对临时解压目录,因此写入CWD的恶意文件不会被自动删除,从而可能导致任意文件写入或持久化后门。

攻击链分析

STEP 1
1. 构造恶意文件
攻击者创建一个特制的ZIP文件,其中包含具有超长嵌套路径的条目,长度超过4096字节。
STEP 2
2. 上传文件
攻击者将恶意ZIP文件上传到Outline服务,触发文档导入功能。
STEP 3
3. 路径处理异常
Outline的ZipHelper.extract处理ZIP文件,检测到路径过长。trimFileAndExt函数移除目录组件,仅保留文件名。
STEP 4
4. 沙箱逃逸
fs.createWriteStream使用被截断的文件名,在进程当前工作目录(CWD)而非临时沙箱目录中创建文件。
STEP 5
5. 持久化驻留
清理进程仅删除临时目录,写入CWD的恶意文件保留在系统中,攻击者可利用此文件进行进一步攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import zipfile import os # Create a malicious ZIP file with a path length designed to trigger the bug # The path needs to be long enough (> 4096 bytes) to trigger trimFileAndExt logic long_path = "A" * 5000 # Adjust length to exceed MAX_PATH_LENGTH filename = "escaped_file.txt" with zipfile.ZipFile('malicious.zip', 'w') as zf: # The arc_name simulates the long nested path zf.writestr(os.path.join(long_path, filename), 'This file should escape the sandbox.') print('Malicious ZIP file created: malicious.zip')

影响范围

Outline < 1.7.0

防御指南

临时缓解措施
建议立即限制未授权用户对文档导入功能的访问,并检查服务器工作目录中是否存在异常文件。如无法升级,应在网络层面拦截包含异常超长路径的ZIP文件上传请求。

参考链接