# engineer-your-data Workspace Boundary Bypass in File Operations Vulnerability Report ## 漏洞概述 该漏洞属于 **CNA / Submission Type**,类型为 **CVE ID request**,由独立安全研究员 **wing3e** 于 **2026年4月10日** 提交。 ### 漏洞类型 - **CWE**: CWE-73 (外部控制文件名或路径) - **简短描述**: 文件工具忽略配置的 `WORKSPACE_PATH` 边界 ### 受影响版本 - **确认受影响**: 0.1.3 - **疑似受影响范围**: 包含相同请求到 sink 流修订的版本 - **修复版本**: 报告时未提供(2026年4月10日) ### 漏洞描述 项目文档将 `WORKSPACE_PATH` 声明为用户数据工作区的目录,但实际文件工具(`read_file`, `write_file`, `list_files`, `file_info`)不强制执行此边界。它们接受来自调用者的任意路径,直接转换为 `Path(...)` 并立即操作。这允许攻击者读取或写入服务账户可访问的任何文件,而不仅限于配置的工作区。 ### 技术根因 1. 服务器广告专用工作区根目录 - `src/server.py:57` - `WORKSPACE_PATH = os.getenv("WORKSPACE_PATH", os.path.expanduser("~/Documents"))` 2. README 明确告诉用户配置工作区根目录 - `README.md:78-152` - Claude Desktop 示例设置 `WORKSPACE_PATH` 为 `/path/to/your/data/workspace` 3. 工具执行将原始 MCP 参数直接传递给注册表实现 - `src/server.py:142-153` 4. `read_file` 忽略 `WORKSPACE_PATH` 并直接打开任意路径 - `src/tools/file_operations.py:53-88` - `file_path = Path(file_path_str) followed by file_path.exists() and open(file_path, ...)` 5. `write_file` 对写入执行相同操作 - `src/tools/file_operations.py:227-288` - `file_path = Path(file_path_str) then file_path.parent.mkdir(...) and open(file_path, "w", ...)` 6. `list_files` 和 `file_info` 也未受限制 - `src/tools/file_operations.py:309-428` - `src/tools/file_operations.py:465-517` ### 攻击前提条件 - 能够调用暴露的 MCP 文件工具 - 服务账户必须对目标读取或写入路径具有权限 - 没有包装器在文件到达工具注册表之前重写或限制文件路径 ### 概念验证/复现指南 该仓库即使在 `WORKSPACE_PATH` 设置为不同位置时,也暴露了直接任意读取。 #### 1. 调用真实的 `read_file` 工具: ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "read_file", "arguments": { "file_path": "/etc/hosts", "file_type": "auto" } } } ``` #### 2. 为什么这会触发: - 工具将 `/etc/hosts` 转换为 `Path("/etc/hosts")` - 没有代码将路径加入 `WORKSPACE_PATH` 或检查它是否仍在配置的工作区下 - 如果文件可读,则直接打开并返回 #### 3. 预期结果: - 即使 `WORKSPACE_PATH` 指向其他地方,也会返回 `/etc/hosts` 的内容 - 通过 `write_file(file_path="/tmp/engineer-your-data_poc.json", ...)` 存在并行写入原语 ### 安全影响 - **机密性**: 高,因为可以披露任意可读的主机文件 - **完整性**: 高,因为可以创建或覆盖任意可写的主机文件 - **可用性**: 中等,因为任意写入可能会损坏或破坏本地工作流 - **范围**: 未改变 ### CVSS V3.1 建议 - **建议向量**: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L - **建议基本分数**: 9.1 (Critical) ### 变通方法/缓解措施 - 将 `WORKSPACE_PATH` 强制作为每个文件导向工具的硬根 - 使用受限账户运行服务,该账户无法访问敏感主机路径 - 在添加边界检查之前,在不受信任的部署中禁用文件写入工具 - 考虑为只读和写入能力路径使用单独的允许列表 ### 推荐修复 - 针对 `WORKSPACE_PATH` 解析每个请求路径,并拒绝任何逃逸路径 - 对 `read_file`, `write_file`, `list_files`, `file_info` 应用相同的工作区强制执行 - 添加针对绝对路径、`../` 符号链接转义和 Windows 驱动路径输入的回归测试 - 更新文档以匹配修补后的实际强制执行行为 ### 参考 - **仓库**: https://github.com/eghuzefa/engineer-your-data-mcp.git - **审查源文件**: `src/server.py`, `src/tools/file_operations.py` - **CWE-73**: https://cwe.mitre.org/data/definitions/73.html ### 信用 - **发现者**: wing3e - **发现方法**: 静态分析 (CodeQL) 加上仓库源代码审计 ### 表单映射的其他说明 - **审计结论**: 确认漏洞 - **审查的 SARIF 结果总数**: 16 - **核心问题**: 文档化的工作区根模型与不受约束的实现之间的不匹配 - **动态利用重放状态**: PoC 在批次中通过源代码级请求到 sink 分析验证