第八章:代码执行、浏览器与 Computer Use 沙箱及网络隔离
8.1 三类"给模型一双手"的能力,风险递增
代码解释器、浏览器自动化和 Computer Use(让模型直接操作图形界面、鼠标键盘)是当前 Agent 能力扩展最快的三类工具,也是攻击面最不容易被完整枚举的三类工具。它们的共同点是:执行的具体指令由模型运行时生成,无法在设计阶段穷举,因此防御重心必须放在"限制执行环境本身能造成的最大损害",而不是"预判模型会生成什么指令"。
flowchart LR
A[代码执行
风险:任意代码运行] --> B[浏览器自动化
风险:+ 跨站身份/会话]
B --> C[Computer Use
风险:+ 全操作系统访问面]
三者的风险依次叠加:代码解释器的风险边界通常局限在一个进程/容器内;浏览器自动化额外引入了用户登录态、Cookie、跨站请求等身份相关的风险面;Computer Use 则把风险边界扩大到整个操作系统——任何桌面应用、文件、剪贴板都可能被模型直接操作。
8.2 代码执行沙箱
8.2.1 隔离层级选择
| 隔离方式 | 隔离强度 | 典型场景 |
|---|---|---|
| 语言级沙箱(受限解释器) | 弱,容易被已知技巧绕过 | 不推荐用于不可信代码 |
| 容器(Docker 等) | 中,共享宿主内核 | 内部可信度较高的场景,仍需配合内核加固 |
| 用户态内核隔离(gVisor 等) | 较强,拦截并模拟系统调用,减少宿主内核暴露面 | 多租户代码执行服务 |
| 微虚拟机(Firecracker 等) | 强,独立内核和硬件虚拟化边界 | 面向不可信代码的默认选择 |
原则:只要执行的代码来自模型生成、且模型的生成过程可能被 Prompt Injection 或越狱影响(见第二章),就应该按"不可信代码"的最高标准隔离,而不是按"这是我们自己 Agent 生成的代码,应该问题不大"的乐观假设。
8.2.2 资源与生命周期限制
- 每次执行短生命周期、一次性环境:执行结束即销毁,不复用带有历史状态的沙箱,防止跨任务的状态污染或残留数据被后续任务读取;
- CPU/内存/磁盘/执行时长硬限制:防止资源耗尽型攻击(构造无限循环、大量写盘、fork bomb);
- 文件系统最小化:沙箱内不挂载宿主机的真实文件系统、不包含无关的凭据文件、环境变量默认不包含云凭据(呼应第三章"密钥不进上下文");
- 无出站网络或按需最小开放:默认禁止沙箱访问外部网络,确需网络能力时走 8.4 的出口控制,而不是给沙箱直连公网的能力。
8.3 浏览器自动化的特有风险
8.3.1 身份与会话相关风险
浏览器自动化 Agent 往往需要复用用户的登录态才能完成任务(订票、查账单等),这带来了代码执行沙箱不存在的风险:
- 会话劫持面扩大:一旦浏览器自动化环境被诱导访问恶意页面,攻击者可能读取到当前登录会话的 Cookie 或 Token;
- 跨站请求伪造放大:模型在浏览网页时遇到的任何可点击元素、表单都可能是攻击者构造的诱导内容(视觉/文本层面的间接 Prompt Injection),诱导 Agent 在已登录状态下执行转账、修改密码等操作;
- 下载文件执行:浏览器下载的文件如果被后续步骤(代码解释器、桌面操作)打开或执行,等同于引入了一个新的、来源不可控的代码执行入口。
8.3.2 防御设计
- 登录态最小化:只在完成特定任务必需时注入特定域名的登录态,不做"全程携带用户完整会话"的设计;任务结束后销毁会话;
- 页面内容视为不可信输入:网页的文本、alt 属性、隐藏元素都可能包含注入指令,处理方式与 RAG 安全 20.3.2 描述的间接注入防御一致——能力隔离和数据流控制是主防线,不能依赖"提醒模型小心网页内容"这种概率性缓解;
- 高风险操作二次确认:涉及支付、密码修改、数据提交类的页面操作,应有独立于模型判断的确定性规则触发人工确认,而不是让模型自己判断"这个操作安全吗";
- 下载文件默认隔离:下载内容进入独立沙箱做扫描和格式校验,不自动传递给可执行环境。
8.4 Computer Use 的特有风险
Computer Use 让模型通过截图理解界面状态、通过模拟鼠标键盘操作整个桌面环境,这是当前风险面最大、经验积累最少的一类能力。
8.4.1 视觉层面的间接 Prompt Injection
模型依赖截图来"看懂"当前屏幕,任何出现在屏幕上的内容——包括其他窗口的通知、桌面壁纸上的文字、恶意网页渲染出的伪造系统对话框——都可能被模型当作需要响应的指令。这是间接 Prompt Injection 在视觉模态上的延伸,与文本文档中的隐藏指令原理相同,只是载体从文本变成了截图。
8.4.2 操作系统级攻击面
| 风险 | 说明 |
|---|---|
| 剪贴板劫持 | 模型可以读写系统剪贴板,可能被诱导读取剪贴板中的敏感数据并粘贴到不当位置,或反过来把恶意内容写入剪贴板供用户后续误粘贴 |
| 伪造系统弹窗 | 恶意页面可以渲染出与真实操作系统权限请求框高度相似的界面,诱导模型(或后续的人工审批者)误点"允许" |
| 跨应用数据串联 | 模型可以在一个操作序列里跨越邮件、浏览器、文件管理器等多个应用,任何一环被注入都可能导致整个操作链被劫持 |
| 无法细粒度限权 | 相比 API 调用可以精确控制"允许调用哪个函数",图形界面操作很难做到"只允许点击这个按钮"级别的白名单 |
8.4.3 防御设计
- 默认在隔离桌面环境中运行:使用独立的虚拟桌面/容器化桌面环境执行 Computer Use 任务,与用户真实桌面环境物理隔离,即使被劫持也不能触及宿主机的真实数据;
- 任务范围声明与越界检测:在任务开始前声明允许操作的应用范围,运行时检测是否出现了超出声明范围的应用切换或窗口,超出则暂停并要求确认;
- 高权限操作的确定性拦截:涉及系统设置修改、权限授予、文件删除等操作,由操作系统层面的策略(而非模型自我克制)强制拦截或要求二次确认,这与浏览器自动化的"二次确认不能靠模型自我判断"是同一原则;
- 截图内容的输入检测:对截图做 OCR/内容分析,识别是否存在异常的、疑似注入的文字或界面元素,作为纵深防御的一层,但不能替代隔离桌面这一主防线。
8.5 统一的网络出口控制
三类执行环境都需要一致的网络隔离策略,这与 Tool Protocol 安全 15.3.1 描述的 SSRF 防护原则相通;放到执行沙箱里,就是下面这套网络设计:
flowchart TB
E[执行环境
代码/浏览器/Computer Use] --> P[强制走出口代理]
P --> W[域名/IP allowlist]
P --> N[拒绝 loopback/私网/metadata 地址]
P --> R[限制重定向次数与响应大小]
P --> L[无凭据网络段
凭据由代理按需注入]
- 执行环境不直连公网,所有出站流量强制经过受控代理;
- 代理层维护 allowlist 而非 blocklist,默认拒绝一切未声明的目的地;
- 代理层负责在需要时按需注入凭据(如访问特定内部 API 需要的 Token),执行环境本身不持有长期凭据,这与第三章“凭据不进模型上下文”的原则一致;
- 记录完整的出站请求日志,用于事后审计和异常检测。
8.6 上线检查表
- [ ] 不可信代码执行默认使用微虚拟机/用户态内核隔离级别的沙箱,而非仅语言级沙箱;
- [ ] 执行环境短生命周期、一次性,结束即销毁,不复用历史状态;
- [ ] 沙箱内 CPU/内存/磁盘/执行时长有硬限制;
- [ ] 浏览器自动化的登录态按任务最小化注入,任务结束即销毁;
- [ ] 浏览器/Computer Use 中涉及支付、密码修改等高风险操作,由确定性规则强制人工确认,不依赖模型自我判断;
- [ ] Computer Use 默认运行在隔离桌面环境,与用户真实桌面物理隔离;
- [ ] 所有执行环境的出站网络强制走代理,采用 allowlist 且拒绝 loopback/私网/metadata 地址;
- [ ] 执行环境不持有长期凭据,按需通过代理注入。
8.7 常见错误
8.7.1 认为"代码是自己 Agent 生成的"所以风险较低
只要生成过程可能被 Prompt Injection 或越狱影响,就应按不可信代码的最高标准隔离。
8.7.2 浏览器自动化全程携带用户完整登录会话
应按任务最小化注入特定域名的登录态,而不是让 Agent 拥有用户的完整会话权限。
8.7.3 依赖提醒模型"小心可疑内容"作为注入防御
无论文本还是视觉模态的间接注入,都需要能力隔离和数据流控制作为主防线,提示词层面的提醒只是概率性缓解。
8.7.4 Computer Use 在用户真实桌面环境直接运行
一旦被视觉层面的注入劫持,会直接影响宿主机的真实数据和应用,必须使用隔离桌面环境。
8.8 本章总结
- 代码执行、浏览器自动化、Computer Use 的风险依次叠加,防御重心应放在限制执行环境的最大损害,而非预判模型会生成什么指令;
- 代码执行应使用微虚拟机/用户态内核级别的隔离、短生命周期环境和严格的资源限制;
- 浏览器自动化的特有风险在于登录态和会话相关的攻击面,登录态应按任务最小化注入,网页内容按不可信输入处理;
- Computer Use 把风险扩大到整个操作系统,视觉层面的间接 Prompt Injection、剪贴板劫持和伪造系统弹窗是其特有风险,默认应运行在隔离桌面环境;
- 三类执行环境应共享统一的网络出口控制策略——强制代理、allowlist、拒绝内网地址、按需注入凭据。