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

50 lines
4.9 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.
# 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 删除,部署方需管理持久目录容量。