在 AI Agent 快速发展中,安全隔离执行成为关键挑战。传统沙箱依赖内核级隔离如 Docker 或 seccomp,引入复杂性和权限提升风险。而浏览器提供天然沙箱机制:通过 iframe 的 sandbox 属性结合 postMessage 通信和能力式 API(capability APIs),可在用户浏览器中实现 Agent 的可扩展隔离执行。这种方案无需服务器内核权限,利用浏览器同源策略和 CSP(Content Security Policy),实现零信任执行,特别适合 Web 端多租户 Agent 平台。
核心观点是 “浏览器即沙箱”:iframe 创建独立浏览上下文,sandbox 剥离危险能力,postMessage 作为唯一通信通道,父页面代理所有敏感操作(如网络、存储)。这确保 Agent JS 代码运行在最小权限下,仅通过显式授权的能力调用外部资源。相比服务器沙箱,该方法启动毫秒级、可并行数百个 iframe、资源消耗低,支持客户端渲染 Agent 推理路径,提升用户体验。
证据来自浏览器标准实现。根据 MDN 文档,iframe sandbox 默认禁用脚本、弹出、表单提交、插件加载和顶级导航,仅通过白名单 flag 恢复必要权限。例如,<iframe sandbox="allow-scripts"> 允许 JS 执行但保留唯一源隔离,无访问 cookies 或 localStorage。
实际架构如下:父页面(主应用)动态创建 iframe,加载 Agent 运行时(如自定义 agent.html)。iframe 加载后发起 handshake:postMessage 发送 {type: 'hello', sessionId: uuid ()},父页面验证 origin 后回复 {capabilities: ['fetchHttp', 'readFile'], timeoutMs: 5000}。后续 Agent 调用如 {type: 'call', capability: 'fetchHttp', args: {url: 'api.example.com'}, id: 1},父页面校验参数、执行 fetch 并返回结果。拒绝无效调用或超时直接销毁 iframe。
这种 capability 设计借鉴对象能力模型:每个能力是窄化函数,如 fetchHttp 仅限白名单域名、限 10KB 响应;readFile 仅读特定路径。父页面维护能力注册表,支持动态授予 / 撤销,实现多 Agent 隔离:每个 Agent 一 iframe,不同 capabilities 集。
可落地参数与清单:
-
Iframe 配置:
- sandbox="allow-scripts"(基础,仅 JS;避免 allow-same-origin 防源泄露)。
- referrerpolicy="no-referrer" 防 referrer 攻击。
- src 使用 data: URL 或 srcdoc 嵌入 Agent 代码,避免网络加载:"data:text/html,/* agent runtime */"。
- 双 iframe 模式:外层 iframe 限 frame-src,外层代理内层导航。
-
PostMessage 协议(JSON RPC 风格):
// 请求 { id: uuid(), type: 'call/hello/result', capability: 'fetchHttp', args: {url, method}, timestamp: Date.now() } // 响应 { id: uuid(), type: 'result/error', result: {...}, error: 'Invalid capability' }- 父 / 子均校验 event.origin === '*' 或预期源(沙箱源为 null)。
- 限消息大小 <1KB,超时 30s 无响应销毁。
- 使用 MessageChannel 专用端口:parent.port.postMessage (),更安全。
-
CSP 强化(iframe 源 meta):
Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'none';- 禁用外部脚本 / 连接,Agent 网络全代理。
-
能力清单示例(父页面实现):
能力 参数 限额 用途 fetchHttp {url, headers?} 域名白名单,5s 超时,10 req/min Agent 工具调用 log {level, msg} 无 调试 updateUI {state} 校验 schema 渲染结果 callTool {toolId, input} 预授权工具 LLM 工具 -
生命周期管理:
- 创建:createIframe (url, caps) → load → handshake (3s 内)。
- 心跳:每 10s {type: 'heartbeat'},超时 kill。
- 销毁:iframe.remove () 清内存。
- 多 Agent:池化 50 iframe,LRU 复用。
监控要点:
- 指标:iframe 数、消息延迟、能力调用率、销毁因(超时 / 错误)。
- 异常:postMessage 频率 >100/s 限流;异常栈代理返回不泄露父信息。
- 回滚:fallback 到 Web Workers(弱隔离)或服务器代理。
风险与缓解:
- postMessage 注入:始终校验 source === iframe.contentWindow。
- 侧信道(timing/cache):CSP block 外部,随机化响应延迟。
- JS 逃逸:避免 allow-top-navigation,监控异常。
该方案已在插件系统和本地 LLM 工具中验证,如 Model Context Protocol 提案中使用 postMessage 传输工具。Browser Use 等平台虽聚焦服务器,但浏览器沙箱补全客户端场景。
参数落地后,单页支持 100+ Agent 并行,内存 <50MB/Agent,安全高于 naive eval。
资料来源:
- MDN iframe sandbox: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox
- Web.dev sandboxed iframes: https://web.dev/articles/sandboxed-iframes
- Browser Use 灵感: https://browser-use.com/posts/two-ways-to-sandbox-agents