Files
sw-ads-agent/docs/security-boundaries.md

4.9 KiB
Raw Permalink Blame History

Security boundaries

Trust model

Pi 没有内置 Sandbox。Project Trust 只控制项目资源加载,不隔离进程、文件系统或网络。Pi、Extension 与 Tool 都继承 Node 进程权限。本项目是安全教学基线,不是恶意代码隔离器。

Credentials and logs

  • API Key 只经同源 body 进入服务端;Pi 运行时仍使用 Session 专属 InMemoryCredentialStore
  • 前端提交的 API Key 使用 MODEL_CREDENTIAL_ENCRYPTION_KEY 提供的 32-byte master key 做 AES-256-GCM 加密,采用随机 96-bit IV、认证标签和模型连接 identity AAD;密文文件使用 0600 权限与临时文件原子 rename。master key 只来自 .env/进程环境,绝不写入密文文件。
  • 浏览器刷新创建新 Session 时,只提交非敏感模型 identity;服务端按 identity 解密恢复对应凭证。删除 Session 不删除持久凭证,只有 Clear Credentials 会删除。
  • 浏览器 localStorage 只保存白名单模型元数据;保存前主动移除 apiKey 并用不接受额外字段的 Zod schema 校验。损坏或超限数据会删除。
  • 不写 Pi 全局 auth/models 文件,不执行 !command,不接受自定义 headers。
  • 响应仅回传配置状态和末四位 hint;SSE、事件、日志和测试快照禁止原始 key。
  • Fastify 只记录安全元数据并对 Authorization/API Key 路径 redaction;生产错误不返回 stack/绝对路径。

Filesystem

  • 每个 Session 独立 canonical cwdresolve 后必须仍在 root 内。
  • realpath 验证父目录,拒绝 ..、绝对路径逃逸与符号链接路径。
  • .env.git、SSH、用户主目录和系统路径受到 preflight 保护。
  • save_report_draft 目标固定为 report.md,临时排他创建后原子 rename;审批不能替代路径检查。
  • 默认不注册 shell、write、edit。

课堂实现使用 Node 文件 API,无法完全消除恶意同机进程造成的 TOCTOU。生产版应把每个任务放进独立 mount namespace / micro-VM,并使用只读输入卷和受控输出卷。

Images

multipart 流有字节上限;扩展名、MIME、magic bytes 三重匹配。Sharp 限制像素、解码并重新编码,自动旋转且移除多余 metadata。随机文件名仅写 Session attachments,预览不提供任意路径静态服务。事件仅记录 ID、MIME、大小和尺寸。

Model Base URL and SSRF

默认 HTTPS;拒绝 URL credentials、fragment、危险 credential query、畸形 URL、metadata hostname,以及 DNS 解析得到的 private/loopback/link-local 地址。开发环境可使用 loopback HTTP,企业内网必须显式 opt-in。DNS rebinding、重定向逐跳策略和出口 DNS 固定应由生产 egress proxy 强制执行。

Approval

审批发生在 Pi tool_call preflightTool 尚未执行。Broker 校验当前 Session/Run、响应 abort、释放 timer/Promise,并将 approve/deny/expired/cancelled 作为服务器事实发送。未知工具 deny,未注册高风险工具无法被模型调用。

Required production isolation

不可信 Skill、仓库、脚本、附件解析或无人值守 Agent 必须在 Docker(配合 seccomp/AppArmor 和无特权用户)、VM、micro-VM 或远程 Sandbox 运行,并施加 CPU/内存/磁盘/时间/网络配额。Project Trust 不能替代这些措施。

SW Ads read-only facade and artifacts

  • SWADS_MCP_TOKEN 仅存在服务端配置和出站 Authorization Header。URL 不允许凭据/query/fragmentfetch 禁止 redirect,避免 Header 转发。Gateway 原始错误正文、Headers 和 Token 不进入模型/SSE/日志/下载,返回固定 SWADS_* 错误分类。响应中的 Token 精确值及敏感键在模型交付前脱敏。
  • swads_cli 只允许约定九个 command。参数拒绝任意 URL/Header/Token/tool name 和未知顶层字段;语义 query 允许有界嵌套 JSON,但不能提供传输控制项。Tool 必须存在并声明只读;非只读 runtime_findings 禁止执行。缺少所需 TikTok 能力时 fail closed,不用 mock 数据兜底。
  • render_swads_daily_report 不接收路径、命令或 Chrome 参数。strict schema 限制字符串/数组长度、真实 ISO 日期、有限数值/null、倍率/百分比与恰好三条建议。动态 HTML 字段全部转义,CSS 无外部字体;CSP 禁止脚本/网络资源,Chrome 使用独立临时 profile、固定参数和进程超时。
  • Artifact URL 仅按 accountKey、ISO 日期、UUID 和 png/html/json enum 定位;逐段拒绝 symlink,无目录枚举。PNG inline、HTML/JSON attachment,准确 MIME、nosniff、限制性 CSP、private no-store。随机 ID 不是身份授权,现有单进程无认证应用仅适合内部/本地边界;公网多租户部署需要独立授权设计。
  • JSON/HTML 即使 PNG 失败仍保留。PNG 超时、缺浏览器、截断分别返回 warning;取消 Run 则清理未发布临时目录。报告不随 Session 删除,部署方需管理持久目录容量。