跳转到内容

安全

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

项目信任控制 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 为单次运行覆盖项目信任。

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

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

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

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

常见模式记录在 Containerization 中:

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

如果你以读写方式绑定挂载主机工作区,容器或 VM 内的写入仍可能修改主机文件。需要更强保护以防止意外写入时,请使用只读挂载或将文件复制进出沙箱。

要报告安全问题,请遵循仓库 Security Policy。不要为敏感安全报告公开 issue。

预期的本地代理行为、缺少内置沙箱、来自不可信内容的提示词注入,以及用户安装的扩展或技能的行为,通常不在安全边界内,除非报告能证明存在真实的权限边界绕过,或说明 pi 如何授予本地用户原本没有的访问权限。