Repository navigation
Agent 浏览器可用性提案:可见性、会话登录、下载与授权粒度(保持现有隔离边界) #491
Copy link
Copy link
Open
Labels
agent-runtimeAgent orchestration, memory, and extensionsAgent orchestration, memory, and extensionsbrowserBrowser runtime and CDP capabilitiesBrowser runtime and CDP capabilitiesenhancementNew feature or requestNew feature or request
Description
背景
Agent 浏览器目前是一套能力隔离 + 取证模型:headless Chromium、每次会话一次性 profile、封死的 CDP 方法表、origin scope、请求级拦截、哈希截图。它对"agent 被 prompt injection 后乱来"的防护是真实有效的,但把可见性、登录态、下载这些与隔离无关的能力也一起关掉了,导致它更像一台取证终端,而不是用户理解的"内置浏览器"。
本 issue 不是要削弱安全边界,而是建议把安全目标和产品目标解耦:该保留的隔离保留,该还给用户的体验还回去。
现状(代码索引)
- headless 写死:
run_runtime.go:97、api_command.go:459、control_plane.go:700均为Headless: true;启动参数固定--headless=new、--remote-debugging-port=0、--window-size=1280,900(browserruntime/agent_browser_start.go:42-49)。 - 一次性 profile:
browserruntime/profile.go的IsolationControls强制DisposableProfileRequired、PersonalProfileForbidden、ExtensionsForbidden、PasswordStoreForbidden。 - CDP 白名单:
browserruntime/restricted_cdp_transport.go:45-67只有约 20 个方法;Browser.setDownloadBehavior=deny(:509);每个请求经Fetch.requestPaused→scope.AuthorizeNavigation;Runtime.evaluate只在 full CDP。 - 站点范围:
browserruntime/scope.go默认拒绝、重定向与 DNS 复检、禁 link-local/云元数据;profile.go:119-123预算为 8 个 origin / 500 请求 / 5 分钟 / 8MB 响应。 - 证据:
application/agent_browser_screenshot.go的ReadScreenshot校验 run/session/artifact 归属并返回 SHA-256。 - UI:
web/src/v2/components/agent-browser.tsx每 3 秒轮询状态、下载校验过的 PNG,以<img>展示;无实时画面。
对照:Codex 的 In-app browser 同样是不碰个人 profile/cookie、不支持登录页、站点逐个授权,但它把浏览器做成内嵌的实时渲染视图,可手动导航、可评论、可下载页面资源、可做只读 JS 检查。差别不在"谁更安全",而在边界画在哪:Codex 画在身份和站点上,本项目画在能力和可见性上。
问题
- 可见性被当成风险。 无 screencast,用户只能看 3 秒轮询的截图;而"看得见"和隔离强度没有因果关系。
- 一次性 profile 一刀切。 每次会话都无登录态,staging 预览、OAuth、2FA、需要会话的表单基本不可用。
- 下载被全局禁止。
MaxDownloadBytes定义了 16MB,但setDownloadBehavior=deny直接关掉,无法验证"导出/下载"类功能。 - 上传没有工具。 文件选择框无法操作。
- 授权粒度粗。 用浏览器必须先开全局 Full access;但系统里已经有
TargetScope(1~8 origin),完全可以按站点授权。 - 预算像取证不像调试。 5 分钟 / 500 请求 / 8 origin 对"打开看一眼"够用,对"调一个 bug"不够。
waiting_user语义不成立。 提示"网页需要人工处理",但 headless 下用户没有接管入口。- 证据模型绑死了交互模型。 哈希截图、审批账本本身是优点,但不应该推出"不能有实时视图"。
影响
- 能做好:本地 dev server 预览、公网无登录页面、点击/输入/滚动、DOM 快照、截图验收、请求元数据。
- 做不了:登录态预览、实时观看 agent 操作、卡住时接管、下载产物、上传文件、超过 8 origin / 500 请求 / 5 分钟的长流程。
- 用户预期落差:用户说"内置浏览器"时预期的是 Codex 那种交互;现在 UI 文案("通过截图查看")其实已经承认了差异。
建议(分阶段,均不削弱现有隔离)
P0:只加可见性,不动权限模型
- 增加只读 screencast:
Page.startScreencast(≤10fps,JPEG,按帧丢弃),后端经现有 session 转发,前端画到<canvas>;断流自动重连。 - 现有截图证据链保持不变(screencast 不替代
captureScreenshot与哈希账本)。 - 明确
waiting_user:要么提供接管入口,要么把文案改成"当前无法人工接管"。
P1:会话级身份与下载
- 会话级 profile:允许用户显式"本次会话登录",会话结束擦除;仍然禁止个人 profile、扩展、密码库。
- 下载走审批:落到隔离目录,记录审批与哈希,复用
MaxDownloadBytes。 - 站点级授权:复用
TargetScope,对已声明 origin 直接可用,不再要求全局 Full access。
P2:预算与交互
- 时间/请求数/origin 数做成可配置预算(按会话或按任务),而不是写死。
- 上传:仅限 workspace 文件,走审批。
- 可选 headed 交接:代码已支持关闭
--headless,可作为"人工接管"模式。
不做什么(保持边界)
- 不接用户个人 Chrome/Edge profile、cookie、扩展、已有标签页。
- 不放开任意 CDP 方法;
Runtime.evaluate仍只在 full CDP,且保持元数据-only。 - 不取消 origin scope、请求级拦截、DNS/IP 复检。
- 不取消截图哈希与审批账本。
验收标准
- 在隔离强度不变的前提下,用户能看到 ≥5fps 的页面画面,断流可恢复。
- 会话内登录后可继续操作,会话结束 profile 被擦除,且有清理回执。
- 下载落到隔离目录,有审批记录与 SHA-256,越界/超限被拒绝。
- 未开启全局 Full access 时,已授权 origin 仍可使用浏览器。
-
waiting_user有明确的接管路径或明确的"不可接管"文案。 - 预算可配置,且默认值不劣于当前。
- 上述行为有测试与
docs/acceptance/证据。
相关
- 关联:fix(ui): let Agent Browser screenshots open at original size #444(截图原图查看,属于本 issue 的 P0 前置体验)
- ADR:0082(CDP 权限上限)、0083(受限 loopback runtime)、0103(Full access 启动令牌)、0106(full CDP 通道)
说明:本 issue 是设计讨论,不涉及具体漏洞;如果维护者认为方向可行,我可以按 P0 先出一个 screencast 原型 PR。
Metadata
Metadata
Assignees
Labels
agent-runtimeAgent orchestration, memory, and extensionsAgent orchestration, memory, and extensionsbrowserBrowser runtime and CDP capabilitiesBrowser runtime and CDP capabilitiesenhancementNew feature or requestNew feature or request
Activity
Merge pull request #508 from CWNU-Open-Source-Community/Qiyuanqiii/ag…
feat(browser): operator takeover mode — visible headed window for log…