[P0/严重] MCPManager stdio 子进程命令注入风险 #6

Closed
opened 2026-07-21 21:55:37 +08:00 by thzxx · 1 comment
Owner

问题类型

安全漏洞 / 严重 / 后端服务

文件位置

electron/services/mcp-manager.service.ts

问题描述

MCPManager 启动 MCP Server 时通过 stdio 通信,使用 child_process.spawn(command, args)
commandargs 来自 MCP 配置文件(用户可编辑 / 第三方可篡改),未做:

  1. 命令白名单校验(如只允许 npx / node / python)
  2. 参数注入检测(如 ; && | $() shell metacharacters)
  3. PATH 环境变量劫持防护

恶意配置可执行任意命令:

{
  "command": "node; rm -rf /",
  "args": ["-e", "require('child_process').exec('malicious')"]
}

影响

  • 任意命令执行
  • 完全系统接管

建议修复

  1. 命令白名单:const ALLOWED_COMMANDS = new Set(['npx', 'node', 'python', 'python3', 'uvx']);
  2. 参数过滤:检测 shell 元字符并拒绝
  3. 使用 execFile 而非 spawn(不经过 shell)
  4. 限制工作目录为 workspace
  5. 不透传 process.env,只传必要的 PATH/HOME
## 问题类型 安全漏洞 / 严重 / 后端服务 ## 文件位置 `electron/services/mcp-manager.service.ts` ## 问题描述 MCPManager 启动 MCP Server 时通过 stdio 通信,使用 `child_process.spawn(command, args)`。 但 `command` 与 `args` 来自 MCP 配置文件(用户可编辑 / 第三方可篡改),未做: 1. 命令白名单校验(如只允许 npx / node / python) 2. 参数注入检测(如 `;` `&&` `|` `$()` shell metacharacters) 3. PATH 环境变量劫持防护 恶意配置可执行任意命令: ```json { "command": "node; rm -rf /", "args": ["-e", "require('child_process').exec('malicious')"] } ``` ## 影响 - 任意命令执行 - 完全系统接管 ## 建议修复 1. 命令白名单:`const ALLOWED_COMMANDS = new Set(['npx', 'node', 'python', 'python3', 'uvx']);` 2. 参数过滤:检测 shell 元字符并拒绝 3. 使用 `execFile` 而非 `spawn`(不经过 shell) 4. 限制工作目录为 workspace 5. 不透传 process.env,只传必要的 PATH/HOME
thzxx added the ???????????? labels 2026-07-21 21:55:37 +08:00
Author
Owner

修复说明

文件: electron/services/mcp-manager.service.ts

问题: MCPManager 启动 MCP Server 时,commandargs 来自用户可编辑的配置文件,无白名单校验和参数注入检测,恶意配置可执行任意命令。

修复方案:

  1. 新增 ALLOWED_MCP_COMMANDS 白名单:仅允许 npx/node/npm/python/python3/uv/uvx/bun/deno 等标准运行时
  2. 新增 validateMcpCommand(command, args) 函数:
    • 命令白名单校验(提取 basename 处理路径,去除 .exe 后缀)
    • 参数 shell 元字符检测(; & | ` $() {} <> \ 换行等)
  3. 新增 buildSafeEnv() 函数:构建精简环境变量,仅保留 PATH/HOME/USERPROFILE/TEMP 等必要变量,防止 process.env 中的敏感信息(API keys、tokens)泄露给子进程
  4. connectServer() 的 stdio 分支接入校验和精简 env

验证: tsc --noEmit 类型检查通过。

## 修复说明 **文件**: `electron/services/mcp-manager.service.ts` **问题**: MCPManager 启动 MCP Server 时,`command` 和 `args` 来自用户可编辑的配置文件,无白名单校验和参数注入检测,恶意配置可执行任意命令。 **修复方案**: 1. 新增 `ALLOWED_MCP_COMMANDS` 白名单:仅允许 `npx/node/npm/python/python3/uv/uvx/bun/deno` 等标准运行时 2. 新增 `validateMcpCommand(command, args)` 函数: - 命令白名单校验(提取 basename 处理路径,去除 `.exe` 后缀) - 参数 shell 元字符检测(`;` `&` `|` `` ` `` `$()` `{}` `<>` `\` 换行等) 3. 新增 `buildSafeEnv()` 函数:构建精简环境变量,仅保留 PATH/HOME/USERPROFILE/TEMP 等必要变量,防止 `process.env` 中的敏感信息(API keys、tokens)泄露给子进程 4. `connectServer()` 的 stdio 分支接入校验和精简 env **验证**: `tsc --noEmit` 类型检查通过。
thzxx closed this issue 2026-07-22 09:14:51 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MetonaTeam/metona-ai-desktop#6