OpenIDEA 的插件安全由三层组成,下面分别说明每一层及其局限。
- 沙箱与能力。 插件代码运行在 WebAssembly 沙箱中,只能通过用户批准的能力访问文件、网络、进程和密钥。这是最主要的防护,对所有来源的插件都有效。
- 签名。 发布者为自己的插件包签名。插件市场索引记录哪个密钥属于哪个发布者,IDE 据此判断插件包是谁发布的、是否被改动过。
- 审核。 官方插件作为 OpenIDEA 仓库的一部分接受审查。新的社区发布者和插件在上架前由登记仓库的维护者审核。
高风险能力(process:、fs.read:、fs.write:、ipc:、ide.commands)相当于在你的机器上运行任意代码,授权对话框也会这样提示。只把它们授予你信任其发布者的插件。
沙箱与授权
- 代码本身没有文件系统、环境变量、网络或进程访问能力。见 架构与沙箱。
- 每个能力都有风险等级,用户在安装时批准。要求更多能力的新版本在用户允许前保持停用。optional 能力之后可以撤销。见 权限与能力。
- 批准运行的程序按路径和内容哈希固定,每次启动前都会检查。
- 项目插件(
.openidea/plugins)只在受信任的项目中、且批准后才运行。在受限模式下,不能改变正在运行哪些插件代码。
签名与发布者
- 发布者拥有一个插件 id 前缀:发布者
acme 发布 acme.*。索引列出每个发布者的 Ed25519 公钥。
- 插件包中的
SIGNATURE.json 对插件 id、版本和全部包内文件的摘要签名。
- 从插件市场安装时,签名不成立的包会被拒绝:签名后被改动、密钥不属于该发布者、使用了其他发布者的 id 前缀,或者密钥已被吊销。下载内容与索引中的摘要不一致时同样会被拒绝。
- 未签名的包仍可以从磁盘安装,授权对话框会给出警告。对话框也会显示插件包是否由插件市场信任的发布者签名。
更新与签名者变更
已安装的插件只会静默更新到用安装时的同一密钥签名的包,或者用该密钥背书过的密钥(直接背书或经由一串背书)签名的包。被吊销密钥做出的背书不算数。签名者变化(未经背书的密钥,或用未签名的包替换已签名的包)会在授权对话框中警告,需要用户确认。
更换密钥
发布者让旧密钥为新密钥背书,即可切换到新密钥:
- 自己维护的索引:
openidea-plugin index <dir> --key new.key --previous-key old.key …。
- 由他人维护的索引(例如社区登记仓库):
openidea-plugin endorse "<new public key>" --key old.key --publisher acme 会打印需要添加的背书。
旧密钥在被吊销之前一直有效,所以轮换前签名的包仍能安装。丢失或被盗的密钥无法为任何东西背书:请申请吊销它,用户会在下次更新时确认新密钥。
索引可以吊销插件版本(或某个插件的全部版本)以及发布者密钥。IDE 每天读取一次索引。被吊销的插件以及用被吊销密钥签名的插件会被禁用并显示原因,同时通知用户;重启后也会在其代码运行之前生效。
官方密钥
OpenIDEA 的 release 构建内置官方发布者的公钥,它由 release 的签名密钥导出。openidea.* 的插件必须用它或它背书过的密钥签名,与索引为 openidea 列出什么密钥无关。从源码构建的开发版本没有内置密钥,以索引为准。
实际有哪些审核
官方插件
openidea.* 插件位于 plugins/official/。改动走仓库正常的 pull request 审查和 CI。CI 会重新构建所有插件,已提交的组件过期时失败(plugins/build.sh --check)。发布流程用官方密钥构建并签名它们。
社区登记仓库
社区插件通过 l0ng-ai/openidea-plugins 上架,其规则如下:
- 新发布者和新插件由维护者审核:源码、所申请的能力及理由,以及是否与已有插件重复。
- 版本更新需要通过检查并由维护者合并。owner 身份按 pull request 之前的发布者文件核对。
- 插件必须有开源许可证下的公开源码仓库,插件包必须由该源码构建;README 必须说明插件做什么,以及为什么需要每一项网络、进程或其他高风险能力;不得包含非由该源码构建的混淆或压缩代码。
- 每次改动时,CI 校验每个插件包的 SHA-256,用最新 release 运行
openidea-plugin check,并用发布者的公钥验证签名;定时任务每天重复一次。
- 插件在新的 OpenIDEA release 下检查失败时会开 issue 报告,30 天内没有上架修复版本就会下架。
- 遇到恶意软件、owner 不修复的安全问题或密钥丢失时,维护者会吊销对应版本或密钥。owner 可以开 issue 申请吊销。
审核的局限
- 审核是人工阅读源码和所申请的能力,不是安全审计。
- CI 不会从源码重新构建社区插件包。“插件包由公开源码构建”这一规则在人工审核中检查,而不是通过可复现构建验证。
- 登记仓库的规则要求对新发布者和新插件做源码审核;对版本更新只要求通过检查并由维护者合并,没有承诺重新审查源码。
- 从磁盘安装的插件、链接的文件夹、项目插件以及自建市场中的插件不经过 OpenIDEA 的任何审核,但沙箱、授权对话框和签名仍然有效。
报告问题