# Yii2-MCP-Server 命令注入漏洞总结 ## 漏洞概述 * **漏洞名称**:Yii2-MCP-Server 命令注入漏洞 (CVE ID Request) * **漏洞类型**:命令注入 (CWE-78) * **严重程度**:高危 (CVSS v3.1 基础评分 8.8) * **漏洞描述**:在 `yii2-mcp-server` 1.0.2 版本中,`yii_command_help` 和 `yii_execute_command` 工具存在命令注入漏洞。服务器将用户提供的参数直接拼接到 PHP CLI 命令中执行,未进行有效过滤,攻击者可注入任意操作系统命令,导致服务器被完全控制。 ## 影响范围 * **受影响版本**:1.0.2 * **受影响组件**: * `src/index.ts` * `src/yii2.ts` * **安全影响**: * **机密性**:高(可读取环境变量、应用密钥、数据库凭证等)。 * **完整性**:高(可修改文件、应用状态或执行非预期的 Yii 命令)。 * **可用性**:高(可终止进程、删除数据或耗尽资源)。 ## 修复方案 1. **限制访问**:仅允许受信任的用户和受信任的本地 MCP 客户端访问。 2. **权限控制**:在专用的低权限账户下运行 MCP 服务器。 3. **禁用危险工具**:禁用 `yii_command_help`、`yii_execute_command` 等命令执行导向的工具。 4. **网络隔离**:避免向不受信任的用户暴露网络传输中的 MCP 服务器。 5. **代码修复建议**: * 不要使用未受信任的输入构建 shell 命令字符串。 * 使用 `exec`/`execAsync` 的数组参数形式(如 `spawn('php', ['yii', 'migrate/status', 'id'])`)代替字符串拼接。 * 验证 `command` 和 `args` 是否符合预期的 Yii 命令名称和选项格式。 * 在 MCP 模式架构中拒绝 shell 元字符和不受支持的参数。 ## POC 代码 (Proof of Concept) **1. 利用 `yii_command_help` 工具执行 `id` 命令:** ```json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "yii_command_help", "arguments": { "command": "migrate/status; id" } } } ``` **2. 利用 `yii_execute_command` 工具执行 `id` 命令:** ```json { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "yii_execute_command", "arguments": { "command": "help", "args": ["migrate/status", "id"], "interactive": false } } } ```