# 漏洞报告总结:mcp-server-rijksmuseum 命令注入漏洞 ## 漏洞概述 在 `mcp-server-rijksmuseum` 版本 1.0.4 中发现了一个命令注入漏洞(CVE-78)。该漏洞存在于 `open_image_in_browser` 工具中,该工具接受用户提供的 `imageUrl` 参数,仅执行基本的类型检查,并通过 `child_process.exec` 执行未转义的 shell 命令字符串。攻击者可以通过 `imageUrl` 参数注入 shell 元字符(例如 `; id #`),以服务器进程的权限执行任意操作系统命令,导致完全主机妥协,包括数据泄露、完整性丢失和服务中断。 ## 影响范围 - **受影响版本**:1.0.4 (commit: a9fc2a2b0a1e7097193a59b37ee3a3b6d38b65) - **受影响组件**: - `src/index.ts` - `src/handlers/ToolHandler.ts` - `src/utils/typeguards.ts` - `src/utils/SystemIntegration.ts` - **安全影响**: - **机密性**:高(任意命令执行可读取服务器进程可访问的文件和环境变量) - **完整性**:高(任意命令执行可修改服务器进程可访问的文件或应用程序状态) - **可用性**:高(任意命令执行可终止进程、删除文件或消耗系统资源) - **CVSS v3.1 评分**:7.8 (High) - **CVSS 向量**:CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H ## 修复方案 1. **替换 `child_process.exec`**:使用 `child_process.execFile` 或 `spawn`,并使用参数数组和 `shell: false`。 2. **分离命令和 URL**:将浏览器打开命令和 URL 作为单独参数传递,而不是构建单个 shell 命令字符串。 3. **严格验证 `imageUrl`**:将其作为 URL 验证,并拒绝嵌入的引号、控制字符、shell 元字符和非 HTTP(S) 方案。 4. **实施白名单**:如果工具仅用于打开 Rijksmuseum 图像 URL,则强制执行预期的 Rijksmuseum 图像主机名的白名单。 5. **添加回归测试**:证明包含 `";`, `|`, `&&`, `|`, 反引号, `$()`, 和重定向的 payload 无法执行额外命令。 6. **发布维护者安全公告**:一旦补丁发布,发布维护者安全公告。 ## POC 代码 ```json { "jsonrpc": "2.0", "id": "1", "method": "tools/call", "params": { "name": "open_image_in_browser", "arguments": { "imageUrl": "http://127.0.0.1:7; id 1>&2; exit 1; #" } } } ``` ## 其他信息 - **发现者**:BruceZin - **发现方法**:静态分析(CodeQL)、仓库源代码审计和手动复现(使用 mcp-inspector) - **审计结论**:手动复现成功;攻击者控制的 MCP `imageUrl` 到达 OS 命令 sink 并执行注入的 shell 命令。 - **动态利用复现状态**:使用注入的 `id` 命令完成,`mcp-inspector` 显示了 `id` 命令的结果。 - **维护者应验证发布映射**:在协调披露之前。