Files
agent/docs/security-boundaries.md
T

75 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 安全边界
## 信任模型
浏览器输入、模型输出、工具参数、上传文件名、MIME、Base URL、Skill 额外路径和 SSE cursor 都是不可信输入。Zod / TypeBox 负责结构校验,Harness 负责语义与权限校验,操作系统仍是最终权限边界。
## 已实现的课堂版保护
### 凭证
- Session 配置覆盖服务器环境变量;没有配置时明确报错。
- API Key 只保存在 Server 内存和 Pi `InMemoryCredentialStore`。
- 响应只返回 `keyHint`,不会返回原值或长度。
- 不写浏览器 Storage、日志、事件、URL、Pi 用户目录或仓库文件。
- 运行中禁止修改模型;清除凭证幂等。
### Base URL / SSRF
- 使用 WHATWG URL,默认仅 HTTPS。
- 拒绝 userinfo、fragment、非 HTTP(S)、异常端口和含凭证 query。
- DNS 结果若命中 loopback、private、link-local、unspecified、multicast 或 metadata 范围则拒绝。
- 开发模式只对显式 localhost HTTP 开例外;企业内网需要服务器管理员设置环境变量。
- 当前请求策略要求同源重定向,不能依赖首次 URL 校验后任意跳转。
### 路径与写入
- 每个 Session 使用独立随机目录。
- 已发现的 Skill 正文复制到 Session 内只读快照;Pi 仅使用该快照清单,不向模型工具开放项目或用户目录。Drama Minis 额外复制明确白名单内的两份参考文档、主题、渲染脚本及两份结构示例;逐段拒绝符号链接,单文件上限 1 MiB。其他 Skill 默认仍只复制正文。
- realpath + relative containment 防止 `..` 和绝对路径逃逸。
- 逐段拒绝符号链接,并保护 `.env`、`.git`、`.ssh` 和常见私钥名。
- write tool 只能调用 `SafeWorkspace.writeReportDraft`,目标固定为 `report.md`,临时文件以独占创建并原子 rename。
- 删除 Session 会取消 run 和审批,并清除附件和整个 Session 目录。
### 图片
- 只收 JPEG、PNG、WebP;同时检查扩展名、MIME 和 magic bytes。
- 流式字节上限、宽高上限与总像素上限阻止常见资源耗尽输入。
- Sharp 自动旋转并重新编码,去掉不需要的元数据。
- 随机服务端文件名,权限 0600;不提供任意路径下载或静态目录。
- base64 只在 Server 构造 Pi prompt 的最后阶段短暂存在。
### 工具与审批
- allowlist 只开放课堂所需 read-only 工具。
- 未知工具默认拒绝。
- `save_report_draft`、真实指标查询 `metrics_semantic_query`、报告生成 `generate_minis_report` 在 Pi tool preflight 阶段等待服务器 Broker。查询审批展示实际参数与第三方模型数据处理提示。
- 审批绑定 approvalId、runId 和 toolCallId;支持 approve、deny、expired、cancelled。
- Browser 点击不是最终事实,只有 `approval.resolved` 事件能改变投影状态。
### Drama Minis 真实数据与报告
- 服务端使用官方 MCP SDK,固定 swads HTTPS 地址,禁止重定向,只开放身份、目录和语义查询;未开放广告修改接口。
- swads token 仅由服务端环境注入,缺失时明确失败。源工具结果按 token 精确脱敏,不使用模拟数据替代失败。
- 报告必须引用同一 Session 已成功的真实查询 ID,JSON 保存查询参数和原始返回;这提供可追溯性,但不自动证明模型计算的每个字段正确。
- 仅运行管理员指定 Skill 中的固定 Python 渲染脚本,模型不能指定任意命令。Python/Chrome 子进程不继承 API 凭证。Chrome 禁止背景网络并使用临时 profile;这不是通用网络隔离。
- 当前原始渲染器的图表单位固定为 USD,因此其他币种明确拒绝生成,不静默换算或合并。
- 下载限定 Session、注册 report ID 与 json/html/pdf 三种格式;no-store、nosniff、attachment、沙盒 CSP。PDF 失败时仅返回 HTML/JSON 及明确提示。
- 仍是单用户 localhost 原型,无用户级身份认证。不得直接暴露公网或作为多租户生产服务。
## 不提供的隔离
Pi 没有内置 Sandbox,Project Trust 也不是 Sandbox。Pi Agent、Extension、Sharp 和所有 Node 依赖继承启动进程的用户权限与网络权限。应用层路径校验和审批不能防御依赖漏洞、Node 进程逃逸、同用户数据读取或不受控的出站模型请求。
因此不要用该课堂版处理生产密钥、不可信租户代码或敏感业务文件。真正部署至少需要:低权限系统用户、只读基础镜像、每 Session 容器或 microVM、挂载白名单、seccomp、出站网络 allowlist、资源配额和销毁验证。
## 部署前仍需补齐
- 登录、Session 所有权、租户授权和管理员权限。
- SameSite Secure cookie、CSRF、防点击劫持和严格 CSP。
- API、上传、run 和审批的速率限制与配额。
- KMS / Secret Manager,不在应用堆中长期保存明文凭证。
- 持久化且防篡改的审计日志。
- 恶意图片扫描、对象存储隔离和生命周期策略。
- 分布式锁、幂等键、Broker 持久化和崩溃恢复。