跳转到主要内容

出口账本:记录智能体去了哪里,而不仅仅是它发送了什么

内容检查看到的是载荷,而不是目的地。出口账本记录智能体去了哪里、以什么顺序前往,以及每一跳有多新颖。

Close-up of a green illuminated recording button on electronic device in low light.

智能体安全遥测中的盲区

大多数智能体安全遥测都是围绕内容构建的。提示词会被扫描以查找注入字符串,工具参数会被检查以查找密钥,模型响应会被过滤以查找策略违规。这是有用的工作,但它在一种容易被忽视的方式上是不完整的:一个请求可以在载荷上完全无害,却在目的地和时序上具有敌意。载荷说的是 GET /。目的地却表明这个智能体以前从未与该主机通信过,而且它是过去一分钟内的第十四个新主机。

逐调用允许列表无法捕捉序列。如果一个智能体被允许访问主机 A、主机 B 和主机 C,那么每一次单独的调用都会通过。漏洞利用不是任何单次调用。漏洞利用是 A,然后 B,然后 C,按这个顺序,在一个很短的时间窗口内,其中 A 返回一个 B 接受的令牌,B 返回一个 C 解析的定位符。每一跳都是被授权的。这次遍历却不是。内容检查看不到这一点,因为内容没有问题。流量的形态才是攻击。

这正是出口账本旨在填补的缺口。

出口账本记录什么

出口账本是对智能体产生的每一个出站网络事件的仅追加记录,写在连接实际建立的位置。记录的单元是目的地,而不是消息。

对于每个事件,账本至少应捕获:

A Stream Deck on a wooden desk, featuring various buttons and controls in a home studio setup.

  • 目的地身份:主机名、SNI 值,或客户端实际用于寻址对端的标识符
  • 解析后的地址:该名称在当时解析到的 IP,这一点很重要,因为 DNS 是一个智能体可能被引导穿过的控制平面
  • 协议和端口:HTTPS、DNS、SMTP、原始 TCP,以及实际使用的端口
  • 每次运行的首次出现时间戳:不仅是此事件发生的时间,还包括该目的地在此次运行中是否出现过
  • 运行和智能体身份:哪个智能体、哪次执行、由哪个父任务派生

账本按运行划分,而运行才是重要的作用域。对于一个长期运行的摄取工作进程来说正常的目的地,对于一个短生命周期的规划智能体来说却是新颖的。基数和新颖性只有相对于它们所属的运行才有意义。

从这份记录中几乎可以免费得到两个派生信号:

  1. 每次运行的目的地基数。 这次运行触及了多少个不同的目的地?一个通常访问三个内部服务的规划智能体突然访问了四十个,不一定已被攻陷,但它不再表现得像一个规划器。
  2. 相对于基线的新颖性。 这些目的地中有多少相对于该智能体在此环境中历史上访问过的内容是新的?新颖性是更敏锐的信号,因为它是有界的,并且可以在不同运行之间进行比较。

被拒绝的尝试必须保留,而不是丢弃。被阻止的连接是账本中价值最高的一行:它是一个智能体明确试图前往策略禁止的地方,即使执行生效了,它也告诉你意图。为了保持日志干净而丢弃拒绝记录,恰恰移除了调查人员需要的证据。

执行点

账本的可信度取决于它被写入的位置。如果智能体框架自己写出口日志,那么该日志就是智能体关于自身行为的一种声明。这对调试来说没问题,对安全来说毫无用处。

出口必须终止于一个智能体无法用自身凭据绕过的代理。在实践中,这意味着智能体的运行时除了通过正向代理或出口网关之外,没有通往外部网络的路径,并且智能体持有

Spacious textile machinery hallway in an Indian industrial plant showing advanced equipment.

  • 账本写入发生在代理处,而不是在智能体框架中。 代理看到连接,因为它就是连接。智能体中没有可以跳过记录的代码路径。
  • 策略评估序列和基数,而不仅仅是主机名成员资格。 一条说“允许主机 A”的规则是成员资格测试。一条说“允许主机 A,但只能在主机 B 之前,并且在五分钟窗口内不同目的地绝不超过 N 个”的规则是序列测试。第二种才能捕捉横向移动。
  • DNS 在边界之内。 解析是一个出口事件。一个无法打开到攻击者控制主机的 TCP 连接的智能体,如果解析没有被代理和记录,仍然可以通过 DNS 查询进行外泄。

一个可行的具体机制:代理在内存中维护一个按运行标识符键控的每次运行目的地集合。在每次连接时,它检查成员资格,然后检查基数是否超过阈值,然后检查转换是否通过一个允许的前驱目的地的小型状态机。如果任何检查失败,连接被拒绝,并写入一个带有完整上下文的拒绝事件。状态机很小,因为它不需要建模智能体可能做的一切;它需要建模的是那几个会表明遍历的转换。

运维权衡

新颖性阈值需要按环境设定基线,否则会不断触发告警。 在一个智能体每天重新部署的预发布环境中,如果基线是全局计算的,几乎每次运行都会产生新颖性。基线必须按环境、按智能体角色,最好还按部署代次来限定作用域,并且必须随着系统变化而重新计算。在生产中正确的阈值在预发布中会成为噪声,反之亦然。不存在单一的数字;存在的是一项维护义务。

记录目的地比记录载荷更便宜,并且能在加密下存活。 一条目的地记录很小:一个名称、一个地址、一个端口、一个时间戳、一个结果。它不会随响应大小增长,不需要 TLS 拦截,并且在载荷端到端加密时仍然有意义。这就是账本的实用论据:它在你始终能够观察的那部分流量中给你一个安全信号,而没有检查内容的成本和法律风险。

诚实的局限是,账本告诉你智能体去了哪里,而不是它在那里完成了什么。一个完全被授权的目的地仍然可能是数据离开的地方。账本缩小了搜索范围;它不能替代内容检查,也不能替代判断哪些新颖目的地是合法的人类判断。它所做的,是让遍历变得可见,而这正是内容检查永远看不到的部分。

对于构建智能体系统的团队,实际的顺序是:把出口放在智能体无法绕过的代理之后,在代理处写账本,保留拒绝记录,并评估序列和基数,而不仅仅是成员资格。埋点很小。它填补的覆盖缺口却不小。

封面照片:Connor Scott McManus / Pexels。

分享XLinkedIn永久链接5 分钟阅读

相关阅读

这能回答的问题

What is an egress ledger for an AI agent?

An append-only record, written at the egress proxy, of every outbound network event an agent produces: destination identity, resolved address, protocol, port, first-seen timestamp per run, and whether the attempt was allowed or denied.

Why is payload inspection not enough for agent security?

A request can be innocuous in payload and hostile in destination and timing. Per-call allowlists do not capture sequence, so a traversal across several individually permitted hosts is invisible to content inspection.

Where should the ledger be written?

At the proxy where egress terminates, not in the agent framework. If the agent writes its own log, the log is a claim about its own behaviour; if the agent can bypass the proxy, the log is incomplete.

Why retain denied egress attempts?

A denied attempt is an agent explicitly trying to reach somewhere policy forbids. It is the highest-value line in the ledger because it reveals intent even when enforcement held.

What is the main operational cost?

Novelty thresholds require per-environment, per-role baselines that must be maintained as the system changes. A threshold tuned for production will generate noise in staging and vice versa.