ocra

安全与隐私

哪些内容会离开你的机器,以及 ocra 如何做隔离。

恶意 PR 能尝试什么、由什么挡住,见威胁模型。

会发送给模型供应商的内容

  • 审查员的指令、变更的标题和描述,以及被审查文件的 diff。
  • AGENTS.md 和匹配的 .ocra/rules.json 规则。
  • 审查员通过工具请求的文件内容和搜索结果。
  • .ocra/memory.json 里与被审查文件有关的已接受问题。
  • 核查时,每个文件的问题连同它的 diff 和问题附近的代码;裁决时,所有问题以及变更的标题和描述。

供应商就是模型链里写的那个;对于在 providers 下声明的供应商,就是你配置的 baseUrl(见模型供应商)。审查过程中,opencode 运行时只会访问模型链里的模型供应商,以及 OpenCode 的价格目录 models.opencode.ai;direct 运行时只访问模型链里声明的端点,此外不访问任何地址。OpenCode 还会尝试从 npm 安装包:启动时安装它自己的插件包,以及它没有自带的供应商代码(见模型供应商)。ocra 把这些安装都指向本机上一个直接拒绝的 registry,因此不会下载任何代码,也不会发送 npm 令牌。有一个测试在拒绝所有其他地址的情况下运行 OpenCode,并检查这一点。

除此之外不会附加任何内容:ocra 启动 agent 运行时时,会关闭你本机的 OpenCode 全局配置、已安装的 skill 和项目指令文件,因此你本机的信息不会进入提示词。

隔离

  • OpenCode 运行时只监听 127.0.0.1,每次运行使用随机端口和随机密码,状态存放在临时目录里,结束后删除。
  • OpenCode 在它自己的空目录里运行,而不是在你的代码目录里,并且关闭了 OpenCode 的项目配置。提交在被审查代码里的插件、自定义工具和设置(.opencode/、opencode.json)都不会被加载;有一个测试专门预置这些文件,并分别单独检查这两道防护。
  • 审查工具由 ocra 自己的进程在 127.0.0.1 上提供,需要随机生成的 bearer token 才能访问。
  • 运行时只拿到系统基础变量和模型链中供应商的凭据,而不是你的全部环境变量。
  • 所有内置 agent 工具(shell、编辑文件、访问网络)都被关闭,审查员只能读取被审查的那个版本。
  • 模型请求的路径被限制在仓库之内。读取从不跟随符号链接:链接读出来是它指向的路径(和 git 存储的一样),所以 notes.txt -> .env 这样的链接无法暴露它背后的文件。
  • 审查员无法读取、查看 diff 或搜索疑似密钥文件(.env、私钥、证书、云服务和镜像仓库凭据、Terraform 变量和状态文件),也无法访问 .git/ 下的任何内容;即使文件就在磁盘上、或者提示词要求读取也不行。从这类文件名重命名而来的文件同样无法读取。同一套规则也会把这些文件排除在审查之外。
  • 会话日志永远不会通过被审查代码树里预置的符号链接写到别处。

不可信的输入

PR 的文字、diff、仓库文件、规则、仓库指南、工具返回的结果、用 --import-sarif 传入的 SARIF 日志、人们对问题的回复,以及模型针对它们写出的一切(问题、审查计划、重新定位的引用),一律当作数据处理,其中的指令永远不会被执行。ocra 自己的分段标签都以 <ocra_…> 开头;数据中任何可能拼成这种标签的文本(包括形似的尖括号、空格、大小写和不可见字符)在交给模型之前都会被改写成 ‹ocra_…,所以数据既跑不出自己的分段,也冒充不了另一条问题。被审查代码里普通的 HTML 和 XML 原样保留。PR 标题和描述有长度上限。ocra 打印到终端的文字(问题、commit 信息、错误)中的控制字符、转义序列和双向文本覆盖符都会被替换,被审查的改动无法借此改写你的屏幕、藏起某条问题或写入你的剪贴板。ocra 写出的 JSON(--format json、会话报告和日志)会转义同样的字符。每个审查任务最多报告 50 条问题,文字长度也有上限,被操纵的模型无法刷屏式地往 PR 里灌评论。

结论不是安全门禁

流水线里的每个模型(审查员、核查和 Judge)都会读到被审查的改动,改动因此可以试图影响它们:让审查员漏掉问题,或在 Judge 面前把问题辩掉。代码层面限制了影响:只有经核查确认的 critical(或者经确认、被 Judge 提升为 critical 的问题)才会让结论成为 significant_concerns,Judge 也既不能丢弃、也不能降级这类问题。但结论干净从来不能证明改动安全。凡是不能漏掉的东西,仍要靠人工审查和专门的安全工具。

共享配置

extends 只通过 https 获取设置和规则,从不获取插件,并且可以用 #sha256= 固定内容。审查 PR 时,它和其他配置一样从 base 提交读取。

密钥

供应商 key 只从环境变量读取,绝不会写入配置、日志或会话文件。仓库里的密钥文件对审查员不可读(见“隔离”),因此其内容也不会进入提示词、报告或会话文件。

CI

  • 把 key 存为 CI 的 secret。
  • 要审查来自 fork 的 PR,请按来自 fork 的 PR 配置。它运行在 pull_request_target 上,会把你的 secret 交给 job;之所以可以接受,只是因为 ocra 不运行 PR 里的任何东西,所以绝不要再加一个会运行 PR 代码的步骤。
  • ocra review --pr 和 GitHub Action 会从 PR 的 base 提交读取 .ocra/config.json、.ocra/rules.json 和 AGENTS.md,并且从不加载仓库插件。见 GitHub Pull Request。ocra review --mr 对 GitLab Merge Request 也是如此;令牌和来自 fork 的 Merge Request 见 GitLab Merge Request。

审查不信任的代码

.ocra/config.json 可以列出插件,而插件会执行代码。ocra review --no-repo-config 会完全忽略这个文件,模型改从 OCRA_MODEL_* 读取。它也不再从被审查的代码里读取 .ocra/memory.json(它可以压掉问题)、.ocra/rules.json 和 AGENTS.md:使用 --from/--to 时从 --from 所在的提交读取,其他情况下不使用。ocra-eval 总是带上这个开关,因为基准测试里的仓库都是第三方代码。

报告漏洞

请通过 GitHub 私下报告,不要发公开 issue:SECURITY.md 说明了哪些属于漏洞,以及之后会发生什么。

在 GitHub 上编辑

本页目录