跳至内容

安全

创建于 2025-07-16·更新于 2026-07-16

Pi 是一个本地编码代理。它使用启动它的用户账户所拥有的权限运行,并将该用户可写的文件视为处于同一本地信任边界内。

项目信任 Project Trust

项目信任控制着 Pi 是否加载项目本地的设置、资源、包和扩展。它不是一个沙箱,也不会限制模型在您进入某个目录开始工作后要求工具执行的操作。

当从当前工作目录中发现以下任一内容时,Pi 认为该项目拥有需要信任的资源:

  • .pi/settings.json
  • .pi/extensions.pi/skills.pi/prompts.pi/themes
  • .pi/SYSTEM.md.pi/APPEND_SYSTEM.md
  • 当前目录或上级目录中的项目 .agents/skills

单独的 .pi 目录不计为需要信任的项目资源。

当交互会话在拥有需要信任资源的项目中启动,且当前目录或上级目录没有已保存的决策时,Pi 会遵循全局设置中的 defaultProjectTrust。默认值为 "ask",即在有 UI 可用时询问是否信任该项目。已保存的决策按规范目录存储在 ~/.pi/agent/trust.json 中,并且当前路径或上级路径上最近的已保存决策会优先于全局默认值。

信任项目允许 Pi 加载需要信任的项目资源,包括:

  • .pi/settings.json
  • .pi 资源,如扩展、技能、提示模板、主题和系统提示文件
  • 通过项目设置配置的缺失项目包
  • 项目本地扩展以及项目包管理的扩展

拒绝信任则会跳过受保护的资源。AGENTS.mdCLAUDE.md 上下文文件无论项目信任设置如何都会被加载,除非上下文加载被禁用。在信任状态确定之前,Pi 仅加载上下文文件、用户/全局扩展和 CLI -e 扩展。用户/全局扩展和 CLI 扩展可以处理 project_trust 事件;第一个返回是/否决策的扩展拥有该决策的决定权。

非交互模式(-p--mode json--mode rpc)不会显示信任提示。在没有适用的已保存信任决策时,defaultProjectTrust: "ask""never" 会忽略此类资源,而 "always" 则会信任它们。使用 --approve/-a--no-approve/-na 可在单次运行中覆盖项目信任设置。

无内置沙箱 No Built-in Sandbox

Pi 不包含内置沙箱。内置工具可以读取文件、写入文件、编辑文件,并以 Pi 进程的权限运行 shell 命令。扩展是以相同权限运行的 TypeScript 模块。包安装、shell 命令、语言服务器、测试命令和其他开发者工具的行为与普通本地进程一致。

这是有意为之。Pi 被设计为在本地源代码树上操作、调用项目工具链,并与用户现有的开发环境集成。一个不完整的进程内沙箱很容易被误解为安全边界,同时仍然依赖于主机 shell、文件系统、包管理器、凭据和扩展代码。真正的隔离需要来自操作系统或虚拟化/容器边界。

项目信任仅是一个输入加载保护。它防止仓库在您批准之前静默更改 Pi 的设置或扩展。它并不能使不受信任的代码、不受信任的提示或不受信任的模型输出变得安全。来自仓库文件、注释、文档、上下文文件或构建输出的提示注入是预期的本地代理风险,无法由 Pi 可靠地防止。

运行不受信任或无监控的工作 Running Untrusted or Unmonitored Work

对于不受信任的仓库、您不打算密切监控的生成代码,或无人值守的自动化任务,请在受控环境中运行 Pi。使用容器、虚拟机、微虚拟机、远程沙箱或策略控制沙箱,并仅包含任务所需的文件和凭据。

常见模式在容器化中有文档说明:

  • 在容器/沙箱内运行整个 pi 进程
  • 运行宿主 Pi,同时将内置工具执行路由到 Gondolin 微虚拟机
  • 仅挂载代理应访问的工作区路径
  • 避免挂载宿主 ~/.pi/agent,除非容器需要访问宿主会话、设置和凭据
  • 传递所需的最少 API 密钥,或使用短期凭据
  • 在任务不需要网络访问时限制网络
  • 在将结果复制回受信任系统之前,审查差异和输出

如果您将宿主工作区以读写模式绑定挂载,容器或虚拟机内部的写入仍然可以修改宿主文件。当需要更强的保护以防止意外写入时,请使用只读挂载,或者将文件复制进出沙箱。

报告安全问题 Reporting Security Issues

要报告安全问题,请遵循仓库的安全策略。对于安全敏感的报告,请不要公开提交 issue。

预期的本地代理行为、缺少内置沙箱、来自不受信任内容的提示注入,以及用户安装的扩展或技能的行为,通常不在安全边界之内——除非该报告展示了真实的权限边界绕过,或说明了 Pi 如何授予了本地用户本不具备的访问权限。