[P1/高] BrowserWindowManager evaluate 执行任意 JS 无沙箱隔离 #46

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

问题类型

安全漏洞 / 高 / 工具系统

文件位置

electron/harness/tools/built-in/browser-window-manager.ts

问题描述

WebBrowserTool 通过 webContents.executeJavaScript() 在打开的网页上下文中执行任意 JS:

const result = await win.webContents.executeJavaScript(jsCode, true);

jsCode 来自 LLM,无沙箱隔离:

  1. 可访问页面所有 API(localStorage、cookies、DOM)
  2. 可发起 fetch 请求(携带用户 cookie)
  3. 可修改页面(注入表单、窃取数据)
  4. 可调用 Electron API(如果 contextIsolation 失效)

影响

  • 用户登录的网站数据被窃取
  • 会话劫持
  • 钓鱼攻击

建议修复

  1. 限定执行环境:在 iframe 或 Web Worker 中执行
  2. API 白名单:仅允许只读 DOM 操作
const ALLOWED_APIS = ['document.querySelector', 'document.querySelectorAll', 'document.title'];
// 解析 JS AST,仅允许白名单 API
  1. 超时与取消:限制执行时间
  2. 审计日志:记录所有 executeJavaScript 调用
  3. 用户确认:高风险操作(fetch、修改 DOM)需用户确认

完全隔离较难,建议先实现审计 + 超时 + 白名单。

## 问题类型 安全漏洞 / 高 / 工具系统 ## 文件位置 `electron/harness/tools/built-in/browser-window-manager.ts` ## 问题描述 WebBrowserTool 通过 `webContents.executeJavaScript()` 在打开的网页上下文中执行任意 JS: ```ts const result = await win.webContents.executeJavaScript(jsCode, true); ``` `jsCode` 来自 LLM,无沙箱隔离: 1. 可访问页面所有 API(localStorage、cookies、DOM) 2. 可发起 fetch 请求(携带用户 cookie) 3. 可修改页面(注入表单、窃取数据) 4. 可调用 Electron API(如果 contextIsolation 失效) ## 影响 - 用户登录的网站数据被窃取 - 会话劫持 - 钓鱼攻击 ## 建议修复 1. **限定执行环境**:在 iframe 或 Web Worker 中执行 2. **API 白名单**:仅允许只读 DOM 操作 ```ts const ALLOWED_APIS = ['document.querySelector', 'document.querySelectorAll', 'document.title']; // 解析 JS AST,仅允许白名单 API ``` 3. **超时与取消**:限制执行时间 4. **审计日志**:记录所有 executeJavaScript 调用 5. **用户确认**:高风险操作(fetch、修改 DOM)需用户确认 完全隔离较难,建议先实现审计 + 超时 + 白名单。
thzxx added the ??????????? labels 2026-07-21 21:56:11 +08:00
Author
Owner

修复说明

文件: electron/harness/tools/built-in/browser-window-manager.ts

修复: evaluate 方法添加审计日志(log.info 记录前 500 字符)和 10 秒超时控制(Promise.race + setTimeout),防止恶意 JS 无限阻塞。

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

## 修复说明 **文件**: `electron/harness/tools/built-in/browser-window-manager.ts` **修复**: `evaluate` 方法添加审计日志(`log.info` 记录前 500 字符)和 10 秒超时控制(`Promise.race` + `setTimeout`),防止恶意 JS 无限阻塞。 **验证**: `tsc --noEmit` 类型检查通过。
thzxx closed this issue 2026-07-22 09:43:28 +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#46