> ## Documentation Index
> Fetch the complete documentation index at: https://openidea.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# 审核规则与安全

> 插件的信任模型：沙箱与授权、发布者签名、吊销、更换密钥、官方密钥，以及插件实际接受哪些审核。

OpenIDEA 的插件安全由三层组成，下面分别说明每一层及其局限。

1. **沙箱与能力。** 插件代码运行在 WebAssembly 沙箱中，只能通过用户批准的能力访问文件、网络、进程和密钥。这是最主要的防护，对所有来源的插件都有效。
2. **签名。** 发布者为自己的插件包签名。插件市场索引记录哪个密钥属于哪个发布者，IDE 据此判断插件包是谁发布的、是否被改动过。
3. **审核。** 官方插件作为 OpenIDEA 仓库的一部分接受审查。新的社区发布者和插件在上架前由登记仓库的维护者审核。

> [!WARNING]
>
> 高风险能力（`process:`、`fs.read:`、`fs.write:`、`ipc:`、`ide.commands`）相当于在你的机器上运行任意代码，授权对话框也会这样提示。只把它们授予你信任其发布者的插件。

## 沙箱与授权

* 代码本身没有文件系统、环境变量、网络或进程访问能力。见 [架构与沙箱](https://openidea.sh/zh/plugins/architecture.md)。
* 每个能力都有风险等级，用户在安装时批准。要求更多能力的新版本在用户允许前保持停用。optional 能力之后可以撤销。见 [权限与能力](https://openidea.sh/zh/plugins/capabilities.md)。
* 批准运行的程序按路径和内容哈希固定，每次启动前都会检查。
* 项目插件（`.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/`](https://github.com/l0ng-ai/openidea/tree/main/plugins/official)。改动走仓库正常的 pull request 审查和 CI。CI 会重新构建所有插件，已提交的组件过期时失败（`plugins/build.sh --check`）。发布流程用官方密钥构建并签名它们。

### 社区登记仓库

社区插件通过 [l0ng-ai/openidea-plugins](https://github.com/l0ng-ai/openidea-plugins) 上架，其规则如下：

* **新发布者和新插件**由维护者审核：源码、所申请的能力及理由，以及是否与已有插件重复。
* **版本更新**需要通过检查并由维护者合并。owner 身份按 pull request 之前的发布者文件核对。
* 插件必须有开源许可证下的公开源码仓库，插件包必须由该源码构建；README 必须说明插件做什么，以及为什么需要每一项网络、进程或其他高风险能力；不得包含非由该源码构建的混淆或压缩代码。
* 每次改动时，CI 校验每个插件包的 SHA-256，用最新 release 运行 `openidea-plugin check`，并用发布者的公钥验证签名；定时任务每天重复一次。
* 插件在新的 OpenIDEA release 下检查失败时会开 issue 报告，30 天内没有上架修复版本就会下架。
* 遇到恶意软件、owner 不修复的安全问题或密钥丢失时，维护者会吊销对应版本或密钥。owner 可以开 issue 申请吊销。

### 审核的局限

* 审核是人工阅读源码和所申请的能力，不是安全审计。
* CI 不会从源码重新构建社区插件包。“插件包由公开源码构建”这一规则在人工审核中检查，而不是通过可复现构建验证。
* 登记仓库的规则要求对新发布者和新插件做源码审核；对版本更新只要求通过检查并由维护者合并，没有承诺重新审查源码。
* 从磁盘安装的插件、链接的文件夹、项目插件以及自建市场中的插件不经过 OpenIDEA 的任何审核，但沙箱、授权对话框和签名仍然有效。

## 报告问题

* 恶意或有漏洞的社区插件：在 [l0ng-ai/openidea-plugins](https://github.com/l0ng-ai/openidea-plugins/issues) 开 issue 申请吊销。
* 插件宿主或沙箱本身的漏洞：见 [安全](https://openidea.sh/zh/contribute/security.md)。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.