Skip to content

Agent 浏览器可用性提案:可见性、会话登录、下载与授权粒度(保持现有隔离边界) #491

Open

Description

@Qiyuanqiii

背景

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 画在身份和站点上,本项目画在能力和可见性上。

问题

  1. 可见性被当成风险。 无 screencast,用户只能看 3 秒轮询的截图;而"看得见"和隔离强度没有因果关系。
  2. 一次性 profile 一刀切。 每次会话都无登录态,staging 预览、OAuth、2FA、需要会话的表单基本不可用。
  3. 下载被全局禁止。 MaxDownloadBytes 定义了 16MB,但 setDownloadBehavior=deny 直接关掉,无法验证"导出/下载"类功能。
  4. 上传没有工具。 文件选择框无法操作。
  5. 授权粒度粗。 用浏览器必须先开全局 Full access;但系统里已经有 TargetScope(1~8 origin),完全可以按站点授权。
  6. 预算像取证不像调试。 5 分钟 / 500 请求 / 8 origin 对"打开看一眼"够用,对"调一个 bug"不够。
  7. waiting_user 语义不成立。 提示"网页需要人工处理",但 headless 下用户没有接管入口。
  8. 证据模型绑死了交互模型。 哈希截图、审批账本本身是优点,但不应该推出"不能有实时视图"。

影响

  • 能做好:本地 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/ 证据。

相关


说明:本 issue 是设计讨论,不涉及具体漏洞;如果维护者认为方向可行,我可以按 P0 先出一个 screencast 原型 PR。

Activity

  1. added
    enhancementNew feature or request
    browserBrowser runtime and CDP capabilities
    agent-runtimeAgent orchestration, memory, and extensions
    on Oct 23, 2026
  2. added 2 commits that reference this issue on Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-runtimeAgent orchestration, memory, and extensionsbrowserBrowser runtime and CDP capabilitiesenhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions