- 人工智能
- AI 应用
- 代码智能体
- 桌面应用
- 开发工具
- dsh-plugin
【免费下载链接】PiDeck
PiDeck 是一个开源的桌面工作台,用于在本地项目目录中统一管理 pi Agent 会话,并支持导入 Codex、Claude 本地会话以便统一浏览和恢复。支持多项目工作区、会话历史、Git 集成、内置终端、模型配置和插件管理,基于 Electron 构建。
PiDeck 是一个基于 Electron 构建的开源桌面工作台,用于在本地项目目录中统一管理 pi Agent 会话,并支持导入 Codex、Claude 本地会话统一浏览。本文拆解它的两套核心安全机制——最小权限 IPC与路径安全校验,并附带一份可直接抄作业的 Electron 安全规范清单。
为什么 Electron 应用需要一套安全架构
Electron 的渲染进程本质是一个浏览器窗口,但主进程拥有完整的 Node.js 能力:读任意文件、执行子进程、访问网络。一旦渲染层被注入恶意脚本(比如你打开的某个网页、加载的某个第三方插件),而 IPC 通道又"敞口",攻击者就能借渲染层之手操作系统。
PiDeck 的 AGENTS.md 里把安全约束写成硬性规范,核心四条:
| 约束 | 一句话原则 |
|---|---|
| IPC 最小权限 | preload 只暴露页面需要的 API,禁止ipcRenderer透传 |
| 输入校验在边界 | handler 第一行职责是校验入参,渲染层数据一律不可信 |
| 路径安全 | 文件读写限制在项目目录内,拼接前规范化 + 逃逸检查 |
| 进程调用 | spawn 必须数组形式,禁止字符串插值拼 shell |
下面逐条看它是怎么落地的。
最小权限 IPC:用 contextBridge 收窄攻击面
1. 渲染层拿不到ipcRenderer
PiDeck 所有窗口的基线配置是contextIsolation: true+nodeIntegration: false(见 src/main/index.ts),浮窗、宠物窗等小窗口同样如此。渲染进程与主进程之间被上下文隔离彻底隔断。
2. preload 是"白名单",不是"透传门"
在 src/preload/index.ts 中,preload 通过contextBridge.exposeInMainWorld暴露一个精心裁剪的 API 对象,每条通道都是具名函数(如files.readContent、git.status),底层走ipcRenderer.invoke(具体通道名, 参数)。渲染层无法自造通道名、无法拿到ipcRenderer原对象——这就是"最小权限"的含义:页面要什么功能,才暴露什么接口,多一个都不给。
3. preload 不做业务
项目规范明确:preload 只做校验后的转发与订阅封装,事件推送统一返回 unsubscribe 函数,渲染层卸载必须退订,避免监听句柄泄漏到应用退出。
输入校验在边界:渲染层数据一律不可信
IPC handler 的第一行职责是校验入参。以 src/main/ipc/filesIpc.ts 为例,能看到几类典型的边界防御:
- 类型守卫先行:
resolveProjectReadBoundary对 scope 做isProjectFileAccessScope校验,不合法直接抛INVALID_PROJECT_FILE_ACCESS_SCOPE,而不是带着脏数据继续跑; - 长度上限防滥用:文件搜索词限 256 字符、路径限 32KB;
- 资源上限兜底:二进制预览未显式传
maxBytes时,主进程按 64MB 上限兜底,注释里写明理由——"渲染层输入不可信,防单点无界读把内存推到数百 MB"。
这套思路值得记住:任何来自渲染层的参数,在触碰文件系统、子进程、网络之前,必须先过一遍类型/长度/枚举/范围四道关。
路径安全:三道防线挡住路径逃逸
文件类功能是路径逃逸的重灾区。PiDeck 在 src/main/files/projectFileAccess.ts 中实现了三层递进校验:
第一道:词法边界。assertProjectFilePathInsideRoot在触碰文件系统前,先折叠..检查目标是否落在项目根内,快速拒绝明显越界。
第二道:realpath 防符号链接。仅做词法比较会被"项目内 symlink 指向项目外"绕过,所以读取前用realpath解析真实路径再比一次边界(resolveProjectFileReadPath)。
第三道:写入路径逐层向上解析。resolveProjectFileWritePath对尚不存在的目标,沿"最近存在的祖先目录"逐级 realpath 并校验,确保新建文件/重命名/移回收站都不会被项目内的符号链接重定向到项目外。
还有一个精巧设计:渲染层读取项目文件时携带的授权上下文 ProjectFileAccessScope只有projectId一个字段。主进程据此从 ProjectStore 重新取得根目录——注释写得很直白:"不接受渲染层直接声明可信根路径"。也就是说,渲染层连"我觉得这个目录可信"都说不算,可信根永远由主进程单方面决定。
进程、外链与插件:把权限收口到少数入口
安全边界不止在文件层,PiDeck 把其他高风险面同样收口:
- 外部链接:
shell.openExternal不直接暴露给渲染层,统一走openExternalUrl收口函数校验协议白名单后才放行; - 子进程:所有 spawn 用数组形式传参、环境变量经
sanitizePiChildEnv类函数清洗,长时间不返回的外部命令必须带超时 kill; - webview 沙箱:内置浏览器面板使用专属 partition 强制
sandbox: true/nodeIntegration: false,删除外部传入的preload/allowpopups,导航白名单在will-frame-navigate、will-redirect、setWindowOpenHandler三层都要过——只拦一层会被重定向绕过(规范见 AGENTS.md 「窗口与 webview」一节); - 插件指纹信任:Host 插件启用时校验 SHA-256 指纹,插件文件一旦变动(指纹不匹配),授权自动失效并提示重新确认,逻辑集中在 src/main/plugins/HostPluginManager.ts;
- 运行时防护:内置
pi-deck-security-gate扩展拦截危险 shell 命令、保护.env与密钥文件,删除类操作先经回收站守卫备份,详见 docs-site/guide/architecture-deep-dive.md。
可以抄作业的 Electron 安全清单
如果你也在做 Electron 应用,PiDeck 的这套约束可以直接当 checklist 用:
- 所有窗口默认
contextIsolation: true+nodeIntegration: false,新窗口逐项评估; - preload 白名单式暴露 API,杜绝
ipcRenderer透传; - handler 首行校验入参(类型/长度/枚举/范围);
- 文件操作 = 词法边界 + realpath 双校验,可信根只由主进程持有;
- spawn 数组传参 + 环境变量清洗 + 超时 kill;
- 外链打开、webview 导航、插件加载各自收口到单一入口做白名单校验。
完整的约束原文维护在 AGENTS.md 「安全约束」章节,配合 src/preload/ 与 src/main/ipc/ 的实现一起阅读,能看清每条规则背后的真实攻击场景——这大概是从 PiDeck 源码里能学到的最值钱的 Electron 安全实践。
- 人工智能
- AI 应用
- 代码智能体
- 桌面应用
- 开发工具
- dsh-plugin
【免费下载链接】PiDeck
PiDeck 是一个开源的桌面工作台,用于在本地项目目录中统一管理 pi Agent 会话,并支持导入 Codex、Claude 本地会话以便统一浏览和恢复。支持多项目工作区、会话历史、Git 集成、内置终端、模型配置和插件管理,基于 Electron 构建。
相关推荐
Video2X完整指南:用AI免费将低清视频无损放大到4K的终极方法
Video2X完整指南:用AI免费将低清视频无损放大到4K的终极方法 你是否曾经为老旧视频的模糊画质感到困扰?想要将珍贵的家庭录像从480p提升到4K清晰度?现
音视频视频处理图像处理深度学习vue-cli-plugin-electron-builder安全最佳实践:保护您的Electron桌面应用
vue cli plugin electron builder安全最佳实践:保护您的Electron桌面应用 在当今数字化时代,桌面应用的安全性至关重要。 vu
钉钉桌面版dingtalk安全防护与进程管理:Electron应用安全最佳实践
钉钉桌面版dingtalk安全防护与进程管理:Electron应用安全最佳实践 钉钉桌面版是基于Electron和钉钉网页版开发的跨平台应用,支持Windows
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考