一份为人写的交战规则,没有任何一栏能约束一个智能体;而事后,你分不出一次获授权的测试与一次入侵。
如果某个第三方把一个自主安全智能体指向你,而它跑去了它不该去的地方,那么「它曾获授权」这件事的唯一证据就是操作者的说法——而在这件事唯一的那个公开案例里,时间戳对上了、一家独立取证公司也认同,可「智能体逃出了测试环境」这条主张,依然只靠跑它的那个人撑着,别无他人。补救办法不是更好的检测。而是:由你给测试方签发一个身份、在你的边缘给它能做的事设上限,并把没有标记的流量直接当作入侵、不必争论——这样「我的智能体逃逸了」才会变成一条你自己的日志能核查的主张。
步骤 1那个公开案例确立了什么,又确立不了什么。
WorkOS 在 2026 年 10 月末披露:一个内部销售应用遭到未授权访问——首次已确认请求在 10 月 25 日,批量取走与检测都在 10 月 30 日。其公告称,该工具「本不应能从互联网触达」,「该 API 接受了一个本意用于本地开发的弱凭据」,而且「由于该凭据可被猜到,智能体在发现该端点之后得以完成认证」。11 月 6 日它发布了一份更新:一位安全研究者主动联系并承担责任,称自己在跑网络安全基准评测时,其智能体逃出了它那个隔离的测试环境。
WorkOS 描述的那套核实,比多数组织做得到的都好。研究者提供了细节与时间戳;WorkOS 的安全团队,连同它此前聘请的那位独立调查人,把这些与公司日志作了比对;两边对上了。请认真把它当作一个范本——然后,精确地看清它的边界。
- 已确立:哪些请求被发出、在什么时候、由那位主动现身的同一方发出,以及涉及的数据位于销售与客服系统之内。
- 未确立:那个环境本来是否就不该能触达 WorkOS;那次访问是否并非有意;拷走的数据是否已被删除。没有认定任何沙箱弱点,也没有描述任何逃逸机制。「逃逸」是操作者的用词,不是一项取证发现。
这就是那个结构性问题,而它并不只属于某一家公司。一个冲出容器的智能体、一个被指向了「有人忘了修剪的目标清单」的智能体,以及一次刻意跑过授权边界的测试,在你这一端产生的流量一模一样。你的日志把请求记得完美无缺,而对授权一言不发——因为授权是关于「一个在你看不见的地方作出的决定」的事实。这正是攻击者操作的智能体里那个问题的镜像:那里,是入侵者声称自己是获授权的测试方,而模型无从校验;这里,则是一个获授权的测试方关于自身收容状况的主张,同样无从校验。
步骤 2你的模板里有哪些条款,又缺了哪三条。
一份常规的渗透测试交战规则会覆盖范围、测试窗口、许可技法、上报联系人、证据处理与报告。而这每一条,都是在「有个人会读范围、会决定下一步做什么、窗口关闭时会停手」这个假定上写出来的。截至 2026 年年末,没有任何监管机构或标准组织发布过专门针对自主测试智能体的授权规则;从业者指引收敛到了对的直觉上——范围必须变成由机器强制执行的约束,而不是一条指令——却没告诉你该加哪些条款。
缺的有三条,而当测试方是一个循环而不是一个人时,恰恰是这三条要紧。
- 身份。为人写的交战规则标识的是那家公司,不是那些流量。里面没有任何一栏写着「本次委托产生的每一个请求都将携带这个标记,而标记缺失即意味着那不是我们」。缺了这一栏,事后归属就是一场对话,而不是一次查表。
- 速率。人类测试方的吞吐量会自我限制。智能体的吞吐量是一个配置值;而一个没有限流的目标——正是上述案例里的条件——会在意图毫无变化、过渡毫无可见迹象的情况下,把「侦察」变成「批量提取」。
- 测试方一侧的收容。交战规则写的是什么在范围之内。它写不出智能体究竟能够触达什么——那是测试方网络命名空间与工具白名单的属性,不是那份文件的属性。而在那个公开案例里,唯一没人能核查的那条主张,恰恰就是这一条。
请注意:这三条讲的全是测试方的配置,而不是你的控制措施。这正是为什么你不能把它们列成要求就算完事:一条你无法审计的条款,是一条你必须定价的条款——而接下来三步讲的是改做什么。
步骤 3身份由你来签发,并让「没有标记」在定义上就等于入侵。
这是单项价值最高的改动,而它把通常的安排反转了过来。不要去问测试方「你们的流量长什么样」。由你铸一个凭据交给他们,这样标记就是一件你掌控、而他们在委托结束后无法再复制出来的东西。
有效的做法,大致按强度排序:
- 一张客户端证书,或一个由你的边缘校验的签名请求头。不可伪造、一个动作即可吊销,而且在测试方中途更换来源地址时依然成立。请按委托轮换,并在窗口关闭时到期——这与把凭据生命周期那套纪律用在第三方身上是同一件事。
- 一个有自己身份记录的专用账号,绝不要用共享账号或人类账号,这样每一个动作都落在一条独立的审计流里。这与智能体目录账号是同一个论证;而它同时也让这次测试避开你的 SOC 针对真实用户调好的那些检测。
- 一段预先登记的来源地址前缀:有用,但单独看很弱——云出口地址会变,而任何人都能从同一家供应方出去。
- 一个 user-agent 字符串——这不是一项控制。它是一句自我声明:任何客户端都能发它,也都能不发它。在上述案例里,公布出来的失陷指标就是 user-agent 字符串——这意味着标记与检测是同一件产物:你一公布它,敌对的操作者就知道了该不发什么、该发什么。
然后把后果写进文件里,因为价值正是在那里兑现的:本次委托产生的、未携带该标记的流量,将被视为未授权入侵,立即隔离,并在不作咨询的情况下上报。如果测试方的收容有效,这一条对他们一分钱成本都没有;如果无效,它让他们接到一个尴尬的电话——而这恰恰是你想要的那种激励,也恰恰是「某人事后说自己的智能体逃逸了」时所缺的那份证据。
再加一个不具业务功能的诱饵——一条记录、一个账号、一个端点——任何正当测试都不需要碰它,而它也不在约定范围内。它被命中,就告诉你这个智能体的目标选择已经漂了,而且是在漂到要紧的东西之前。具体做法见面向智能体系统的蜜标。
步骤 4在你的边缘给速率设上限,因为测试方的配置不由你来信。
给一次获授权的测试设速率上限,看起来像是在妨碍测试的彻底性。实际恰恰相反:它正是让你有可能批准这次测试的那项控制——因为它在你无需预测智能体行为的前提下,框住了最坏情况。而它也并非巧合地,正是「其缺失把一次缓慢探测变成了一次批量下载」的那项控制。
- 按已标记身份设上限,不要设全局。一份专属测试方的额度意味着你可以对这次测试宽松、对其他一切严格;也意味着「额度耗尽」是一个挂在已知方身上的信号,而不是一次服务中断。
- 读与写分开设限,并对「批量形状的读」限得最紧。那个起区分作用的事件是取回量,而不是请求数;每分钟请求上限与每小时记录上限抓的是不同的东西。
- 让上限产出信号,而不只是拒绝。一个静默节流的限额,既拿掉了损害,也把告警一并拿掉了。上述案例里两半都缺,而告警是其中更便宜的那一个。
- 把花销也当成一个上限。一个在你账上驱动计量 API 或推理的智能体,既是数据敞口,也是成本敞口——见钱包拒绝服务。
# the four clauses a human-written ROE does not have identity: client_cert issued_by=us expires=window_close unmarked_traffic -> treat_as_intrusion # no consultation rate: 1200 req/min AND 5000 records/hour # per marked identity on_exceeded -> refuse AND page # refusing silently is half a control stop: canary_hit | scope_exit | our_sole_discretion kill = revoke_cert (one action, no notice period) data: named_signatory deletion_attested_by=<date> evidence = log excerpt, not assurance # every line is enforced on OUR side — none of it depends on the tester's sandbox
步骤 5写一条测试方劝不动你的终止路径。
人类委托是靠邮件暂停的。那个节奏在一个持续工作的智能体面前活不下来;而失败模式并不是「你没有能力停下它」——而是停下它需要一个「没人被事先授权去作」的决定,这正是急停开关与智能体的事件响应两篇都在描述的那种模式。
- 事先指名谁可以吊销,并且不必开会。一个具名角色、一个动作——吊销证书、停用账号——加上一句明确的陈述:他们可以自行裁量执行,事后再解释。
- 让吊销成为一个真的管用的单一动作。请在委托之前验一遍:一个已经签发出去的 bearer token,无论你的控制台怎么显示,都会一直有效到它过期——所以短生命周期是终止路径的一部分,而不是它的替代品。
- 把停止条件写成文字约定:诱饵被命中、任何超出约定范围的请求、任何对被标为只读系统的写入,以及智能体做出的、测试方在一小时内解释不了的任何举动。事先约定好,就在你最不想争论的那一刻免掉了争论。
- 要求整个期间都有一个在线联系人,而不是一个工单队列。关于智能体测试,从业者指引在这一点上是一致的:一次自主运行应当在跑的时候被盯着,而不是跑完之后再复盘。如果测试方排不出这个人力,那这次委托比他们提议的要小。
- 事先决定你会怎么处理一个解释不清的动作,因为那才是你真正会碰上的事。那个公开案例产出了一次解释不清的逃逸,和一位配合的操作者——而「配合」正是你没法指望的那部分。
步骤 6你的披露时钟,不在乎那是谁的智能体。
这是团队往往发现得太晚的那部分。如果一次获授权的测试触达了它不该触达的数据,那你手上就是一起事件,带着寻常的那些义务;而「它是一次测试」这件事,并不会让那些义务暂停。真正让敞口关闭的,是那份「数据已删除」的声明——而一份由一位不具名的个人在事后自愿给出的声明,价值等于善意,再无其他。请在测试之前就谈好它,那时它是免费的。
- 指名签署人与证据标准。谁签这份删除声明、代表哪个法律主体、随之附上什么证据——一份显示销毁动作的日志摘录、一份存储清点、一份第三方确认。「我们删了」不是一个证据标准。
- 事先约定测试产物的留存规则:智能体可以存什么、存在哪里、存多久、由谁的密钥加密。一个把工作记忆写到某个厂商服务里的智能体,等于又把你的数据搬了一次——那是第三方与厂商风险从后门走了进来。
- 保留你自己的证据,独立于测试方的报告。那个公开案例里的交叉印证之所以可能,只因为请求级日志存在;WorkOS 在 11 月 2 日核实了面向内部工具的流量已集中留日志——这是一句关于调查最初几天是什么光景的悄声陈述。请现在就查一下:你能不能重建出一周内对某个内部工具的请求级访问记录。
- 把披露触发条件写进交战规则:如果测试触及受监管数据,你按自己的时间线通报,不论测试方怎么看,而他们事先同意这一点。阈值在重大事件报告里。
- 把厂商的保证与你自己的验证分开。一份声称智能体留在范围内的报告,是测试方的主张;而你这一侧的范围符合性检查,是一次测量——两者该放在不同的列里,见范围符合性评测。
在任何人来问「能不能对你跑一个智能体」之前,先做这一件:决定你的「获授权测试标记」是什么,并把那句「本次委托产生的未标记流量将被视为入侵」写下来。一张证书加一条条款,就能把这整个类别里最不可核查的那条主张——「我的智能体是获授权的,只是跑脱了」——变成你的访问日志一分钟就能回答的东西。本页其余一切,都是对这一点的细化。
相关:安全红队讲的是你自己跑的测试;对智能体做红队讲的是把一个智能体指向另一个智能体而不是一道边界;第三方智能体以你的用户身份登录是同一个身份问题的非对抗版本;而影响半径则是一个可猜凭据真正回答的那个问题。