# 安全模型 ## 默认约束 - WebSocket 服务器只允许 `127.0.0.1`、`::1` 或 `localhost`。 - 只有 `chrome-extension://<32字符ID>` Origin 才能进入鉴权阶段。 - token 少于 16 字符时 bridge 保持禁用;token 不写入扩展源码、URL 或 WebSocket 帧。配对使用双向 nonce + HMAC-SHA-256 challenge-response。 - 不提供 `eval_js`、任意 shell、任意 CDP command。 - 截图只允许白名单化的 `Page.captureScreenshot`:临时 attach 的会话在完成或失败后立即 detach;若网络 runtime 已持有同一会话则只复用、不越权释放。 - 持续网络捕获仅在 tool 明确调用 `network.start` 后附加到指定标签页。 ## 本机扩展准备 - 启动检测只做文件存在性/可执行性检查,不扫描 Chrome profile。 - `browser_extension_install` 由 `tools/pre-execute` 返回 `ask`,使用 DSH `ctx.approval` 的一次性授权;缺少 Agent 或审批应答者时 fail closed。 - 授权内容精确说明目标目录和将打开的 `chrome://extensions` 页面。 - 安装器只接受包内合法 MV3 bundle,拒绝 symlink、未知目标目录和 hash 不一致的已部署目录。 - 更新使用临时目录、同卷 rename 和失败回滚;不会写 Chrome Preferences、注册表、密码库或 Cookie 数据库。 - 不使用 `--load-extension`、OS UI 注入或其他绕过 Chrome 安装确认的方式。 ## 本机设置页面 - 设置页由包自己的 `dsh.client` bundle 注册到 Harness 的 `settings.plugins.tab`,桌面壳不注入额外脚本或私有 IPC。 - 状态与扩展下载只注册到 Harness Web Host 的 loopback exact routes;非 loopback Host、跨站 Fetch-Metadata、Origin 不匹配及非 `GET|HEAD` 请求均拒绝,响应不开放 CORS。 - 状态响应包含扩展弹窗必须使用的配对 token,因此设置为 `no-store`,页面默认以密码框隐藏。其信任边界与本机 Harness 配置平面一致:防普通跨站网页读取,不防已经能以同一账户访问 loopback 或进程环境的本地恶意代码。 - 下载 route 只压缩随 npm 包发布的 `extension/dist`,不读取 Chrome Profile 或用户目录。ZIP 下载本身不写扩展安装目录;解压、开发者模式和“加载已解压”仍由用户与 Chrome 完成。 ## 密码与敏感输入 插件不访问 Chrome 密码库,也不选择密码管理器候选项。对密码、OTP、CVV、token、secret 等敏感字段: - observe 只返回 `sensitive: true` 和 `filled: boolean`; - 不返回值、长度、`outerHTML` 或可反推内容的属性; - `page.type` 拒绝向敏感字段注入文本; - 可以对已由 Chrome 自动填充的字段所在表单执行普通点击,例如点击登录按钮; - 错误和日志不得回显敏感参数。 ## Browser Worker 上下文防火墙 - 主 Agent 只获得 `browser_delegate_task` 的有界结构化结果与经宿主验证的 opaque artifact 元数据,不获得页面快照、元素列表、网络正文、内部路径或低层工具结果。 - 可复用定位器采用相同所有权边界:Worker 只获得随机 locator ID,不能输出 selector text;Host 仅解析当前 Worker 实际捕获并由扩展唯一性复验的 CSS/XPath。模型伪造或跨 Worker 复用 ID 会被静默丢弃。 - 页面数据只进入 fresh Browser Worker Session;不 fork 父历史。低层工具同时受 Agent scoped catalog 与根级 monotonic guard 保护。 - `page.find` 优先在页面侧裁剪元素;observe、extract、network list/body 均由宿主配置强制上限,模型参数不能扩大。 - 低层结果只保留一个 Worker 推理步骤,随后被固定过期回执替换。确定性 checkpoint 不保存页面正文、输入文本、网络 body 或 ref。 - Worker 输出使用 closed schema;宿主对超长字段做限长、对 HTML/DOM、凭据、邮箱和敏感 URL 参数做替换/脱敏,不因单项轻微超长丢弃整次成功结果。 - Worker 的实际 tool schema 与继承提示保持一致;不可用工具提示被过滤,任何未知工具调用计入预算并立即以 `invalid-tool` 确定性停止。稳定页面同一进展版本的重复截图不再重置无进展计数。 - Artifact 路径由 top-level Agent 预声明为 session-cwd 下的相对路径;Host 拒绝绝对路径、traversal、symlink/non-directory 祖先和默认覆盖。已验证 ID 只授权给原始父 Session,交付重试不启动 Worker。 - `browser_delegate_task` 拒绝 goal/constraints 中形如赋值的明文密码、token、API key 或 secret;敏感字段仍禁止 `page.type`,优先依赖 Chrome 自动填充。 - 父 Session 当前 Agent 回合会跨 fresh Worker 累计委派与失败结果;达到 `8` 次委派或 `2` 次 `blocked/failed` 后,仅对后续浏览器委派 fail closed。`needs_user_input` 立即停止本回合浏览器委派;新用户回合复位,不影响主 Agent、其他工具或普通子代理。 - 96K soft / 128K hard 默认阈值会销毁当前 child 并从内容无关 checkpoint 启动 fresh generation,避免依赖通用自然语言压缩。 - 页面内容始终视为 prompt-injection 不可信数据,不能扩大工具权限、改变 persona 或输出契约。 - selector 字符串仍属于不可信页面数据,只能作为自动化定位参数使用;不得解释为代码或指令。closed Shadow Root 不绕过,子 iframe 未验证 frame chain 时 fail closed。 ## 网络脱敏 - 删除 Cookie、Set-Cookie、Authorization、Proxy-Authorization、X-API-Key 等 header 值。 - URL query 中的 token、session、code、password 等键被替换为 `[REDACTED]`。 - JSON 和表单正文递归脱敏常见 secret 键。 - 登录、OAuth、token、SSO 等 endpoint 默认不保存正文。 - 正文按 MIME、单体大小、总缓冲和 TTL 限制;截图与正文应视为敏感 artifact。 ## 信任假设 这是用户主动安装、带有广域站点权限和 `debugger` 强提示的本地自动化工具。共享 token 与双向 HMAC 可防止普通网页、其他扩展以及仅能抢占端口但不知道 token 的本地进程冒充任一端;它不能抵御已经能读取进程环境、Chrome 扩展存储或注入进程的同账户恶意代码。需要操作系统级身份绑定时,应使用具有固定 `allowed_origins` 的 Chrome Native Messaging host,并配合短期授权和操作审计。