Caloogy 文章
English

网络出口控制:Agent 能连到哪里

日期
2025 年 6 月 6 日
系列
Agent 沙箱
阅读
4 分钟
主题
SandboxNetworkEgressAllowlist

一句话版本

被注入的 Agent 要偷数据,最后一步总是把数据发出去。控制它能连到哪里(出站 / 出口流量),就切断了这最后一步。 最稳妥的做法是默认拒绝、白名单放行,并且让所有流量经过一个代理统一检查。但要小心几个容易被忽略的出口:DNS 查询、白名单里本身就能"存储数据"的网站(代码托管、文档、粘贴板)、以及模型输出里自动加载的图片。

全文分三层:

  1. 通俗理解:大楼只开一个出口,门口有保安
  2. 实际用处:企业网络、云端执行环境、AI Agent 的实践
  3. 原理与工程要点:白名单 vs 黑名单、代理、DNS 外泄、"合法网站"的滥用

第一层:通俗理解

1.1 只开一个出口

一栋大楼如果有一百个出口,每个都要派人看着,迟早会漏。更好的办法是:只开一个出口,门口有保安检查,只有名单上的人和货物能出去。

网络也一样:

1.2 "禁止联网"比"禁止访问某网站"简单得多

策略 难度
完全不能联网 最简单、最可靠
只能访问少数几个指定网站(白名单) 可行,需要代理和维护名单
能访问除了"坏网站"以外的一切(黑名单) 几乎不可能做好:攻击者随时可以注册一个新域名

第二层:实际用处


第三层:原理与工程要点

3.1 实现方式

方式 说明
网络隔离 沙箱没有网卡或没有默认路由,彻底断网
防火墙规则 按 IP 和端口放行;问题是现代网站的 IP 经常变化、大量共享 CDN
出站代理 所有流量必须经过代理,代理按域名白名单放行(HTTPS 可通过 SNI 或 CONNECT 请求里的域名判断),并记录日志
TLS 检查代理 代理解密 HTTPS 检查内容(需要在沙箱里信任代理的根证书);能做内容级检查,但更复杂

代理方案还有一个好处:可以由代理注入凭证。沙箱里的 Agent 看不到真正的 API 密钥,代理在转发请求时自动加上(见《凭证泄露与上下文窗口》)。

3.2 DNS 外泄

即使所有 HTTP 流量都被拦住,如果沙箱还能做DNS 查询,数据仍能泄露:

把数据编码进子域名,查询:
  6d7920736563726574.攻击者域名.com
攻击者控制这个域名的 DNS 服务器,从查询日志里就能读出数据。

DNS 查询通常会经过多层递归解析器,最终到达攻击者的服务器,防火墙未必拦截。

对策:沙箱只能使用受控的 DNS 解析器;解析器只解析白名单域名;或者只允许代理做 DNS 解析,沙箱本身不做。

3.3 白名单里的"合法网站"也能被滥用

白名单通常包含代码托管、文档、软件包仓库等网站。问题是这些网站本身允许用户上传内容:

白名单网站 可能的滥用
代码托管平台 把数据推送到攻击者的仓库、写进 Issue 或评论
软件包仓库 发布一个包含数据的包(需要凭证)
粘贴板、云文档 创建公开文档
任何带搜索功能的网站 把数据放进搜索词,出现在对方的日志里

对策:

3.4 别忘了"客户端出口"

Agent 的输出最终会显示在用户的浏览器或终端里。如果输出中包含会被自动加载的外部资源(图片、iframe),这些请求是从用户的浏览器发出的,完全绕过了沙箱的出口控制(见《Markdown图片数据外泄》)。所以出口控制要两头都管:沙箱的出口,和渲染端的 CSP。

3.5 默认拒绝

代理不可用、名单加载失败时,应该拒绝所有流量,而不是放行(见《Fail-closed》)。每一次被拒绝的请求都记录下来:被注入的 Agent 尝试连接陌生地址,本身就是很有价值的告警信号。


总结

层次 要点
原则 默认拒绝、白名单放行、统一经过代理
容易漏 DNS 查询、白名单网站的写功能、客户端自动加载的资源
好处 切断外泄最后一步;代理还能代管凭证、记录日志
配套 只读凭证、路径级规则、渲染端 CSP、拒绝即告警