[P0/严重] RunCommandTool env 透传 process.env,子进程可读取所有 API keys #9

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

问题类型

安全漏洞 / 严重 / 工具系统

文件位置

electron/harness/tools/built-in/command.ts

问题描述

RunCommandTool 创建子进程时使用 spawn(cmd, args, { env: process.env }),将主进程的所有环境变量透传给子进程。
主进程中包含:

  • DEEPSEEK_API_KEY
  • AGNES_API_KEY
  • MIMO_API_KEY
  • GITEA_PASSWORD(如本会话曾设置)
  • 其他敏感 token

LLM 可通过 envecho $DEEPSEEK_API_KEY 命令读取这些密钥,然后通过 WebFetch 等工具外传。

影响

  • API 密钥泄露
  • 账户接管

建议修复

  1. 白名单 env:仅传递必要变量
const SAFE_ENV_VARS = ['PATH', 'HOME', 'USERPROFILE', 'SystemRoot', 'TEMP', 'TMP'];
const safeEnv = Object.fromEntries(
  Object.entries(process.env)
    .filter(([key]) => SAFE_ENV_VARS.includes(key))
);
spawn(cmd, args, { env: safeEnv });
  1. 过滤敏感 key:删除任何包含 KEY TOKEN SECRET PASSWORD 的变量
  2. 审计日志:记录每次 env 透传的 key 列表
## 问题类型 安全漏洞 / 严重 / 工具系统 ## 文件位置 `electron/harness/tools/built-in/command.ts` ## 问题描述 RunCommandTool 创建子进程时使用 `spawn(cmd, args, { env: process.env })`,将主进程的所有环境变量透传给子进程。 主进程中包含: - `DEEPSEEK_API_KEY` - `AGNES_API_KEY` - `MIMO_API_KEY` - `GITEA_PASSWORD`(如本会话曾设置) - 其他敏感 token LLM 可通过 `env` 或 `echo $DEEPSEEK_API_KEY` 命令读取这些密钥,然后通过 WebFetch 等工具外传。 ## 影响 - API 密钥泄露 - 账户接管 ## 建议修复 1. **白名单 env**:仅传递必要变量 ```ts const SAFE_ENV_VARS = ['PATH', 'HOME', 'USERPROFILE', 'SystemRoot', 'TEMP', 'TMP']; const safeEnv = Object.fromEntries( Object.entries(process.env) .filter(([key]) => SAFE_ENV_VARS.includes(key)) ); spawn(cmd, args, { env: safeEnv }); ``` 2. **过滤敏感 key**:删除任何包含 `KEY` `TOKEN` `SECRET` `PASSWORD` 的变量 3. **审计日志**:记录每次 env 透传的 key 列表
thzxx added the ???????????? labels 2026-07-21 21:55:40 +08:00
Author
Owner

修复说明

文件: electron/harness/tools/built-in/command.ts

问题: RunCommandTool 创建子进程时 env: { ...process.env } 透传所有环境变量,包括 DEEPSEEK_API_KEY / AGNES_API_KEY / MIMO_API_KEY 等敏感信息,LLM 可通过 envecho $KEY 命令读取。

修复方案:

  1. 新增 buildSafeCommandEnv(isWindows) 函数:使用白名单机制,仅保留子进程运行所需的最小环境变量集合
    • 保留:PATH / HOME / USERPROFILE / SystemRoot / TEMP / TMP / COMSPEC / LANG / LC_ALL / SHELL / TERM 等
    • 过滤掉所有 API keys / tokens / passwords / secrets
  2. execute 方法中用 buildSafeCommandEnv() 替换 { ...process.env }
  3. 同时设置 NODE_ENV: 'production' 和 Windows UTF-8 编码变量

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

## 修复说明 **文件**: `electron/harness/tools/built-in/command.ts` **问题**: RunCommandTool 创建子进程时 `env: { ...process.env }` 透传所有环境变量,包括 `DEEPSEEK_API_KEY` / `AGNES_API_KEY` / `MIMO_API_KEY` 等敏感信息,LLM 可通过 `env` 或 `echo $KEY` 命令读取。 **修复方案**: 1. 新增 `buildSafeCommandEnv(isWindows)` 函数:使用**白名单**机制,仅保留子进程运行所需的最小环境变量集合 - 保留:PATH / HOME / USERPROFILE / SystemRoot / TEMP / TMP / COMSPEC / LANG / LC_ALL / SHELL / TERM 等 - 过滤掉所有 API keys / tokens / passwords / secrets 2. `execute` 方法中用 `buildSafeCommandEnv()` 替换 `{ ...process.env }` 3. 同时设置 `NODE_ENV: 'production'` 和 Windows UTF-8 编码变量 **验证**: `tsc --noEmit` 类型检查通过。
thzxx closed this issue 2026-07-22 09:24:44 +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#9