try{contextBridge.exposeInMainWorld('metonaAPI',api);}catch(err){log.error('contextBridge failed:',err);// 生产环境:抛出错误,阻止应用以不安全状态启动
if(app.isPackaged)throwerr;// 开发环境:仅警告
log.warn('Falling back to globalThis in dev mode');globalThis.metonaAPI=api;}
## 问题类型
安全漏洞 / 严重 / IPC 通信
## 文件位置
`electron/preload.ts`
## 问题描述
preload.ts 在 try/catch 中调用 `contextBridge.exposeInMainWorld()`,失败时降级到 `globalThis.metonaAPI = ...` 直接赋值。
这削弱了 Electron 的 context isolation 安全边界:
1. 页面恶意脚本可通过原型链访问 Node API
2. contextBridge 的对象克隆/函数白名单机制失效
3. 渲染进程可篡改 API 实现
## 影响
- 恶意网页(如 WebFetch 加载的内容)可访问受限 API
- 违反 Electron 安全最佳实践
## 建议修复
1. **不要降级**:contextBridge 失败应直接 throw,让应用崩溃并暴露问题
2. 或者在开发环境降级,生产环境强制失败
```ts
try {
contextBridge.exposeInMainWorld('metonaAPI', api);
} catch (err) {
log.error('contextBridge failed:', err);
// 生产环境:抛出错误,阻止应用以不安全状态启动
if (app.isPackaged) throw err;
// 开发环境:仅警告
log.warn('Falling back to globalThis in dev mode');
globalThis.metonaAPI = api;
}
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
问题类型
安全漏洞 / 严重 / IPC 通信
文件位置
electron/preload.ts问题描述
preload.ts 在 try/catch 中调用
contextBridge.exposeInMainWorld(),失败时降级到globalThis.metonaAPI = ...直接赋值。这削弱了 Electron 的 context isolation 安全边界:
影响
建议修复