对于我们网络验证计划中的客户,我们在 API 中提供了一个新的沙箱逃逸分类器,用于监控和减少滥用。本文解释了为什么值得阅读代理转录本。然后针对监控的每一层进行了说明:首先是代理日志,然后是转录本应包含的内容、转录本上的模式规则,以及转录本上的模型审查器。最后介绍了当批处理运行时某一层标记代理时应采取的措施,以及之后应保留的内容。
此分类器处于私密测试版。
有关所有可用资源的概览,请参阅 代理隔离最佳实践:入门指南(私密测试版)。
概览
阅读转录本是一项检查,不依赖于沙箱或分类器做出正确决定。转录本由代理自身的进程生成,因此应将其与在沙箱外获取的记录配对,例如代理日志。探测通常在转录本中可见,早于任何有害操作运行,但不要依赖有时间做出反应:在操作执行前采取行动的控制措施优先。在没有网络访问的长批处理期间,按计划扫描实时转录本文件,并让一个人每小时或两小时查看一次命中。对于有网络访问目标的运行,让工程师监视运行,或持续扫描并在命中时停止代理。在任何运行后,扫描所有内容一次以确认每个代理都保持在其沙箱内。
使用三层监控,最便宜的优先:(1) 出口代理和凭证代理日志,(2) 针对转录本的模式规则(为您的环境编写),以及 (3) 针对转录本的模型审查器(使用您为沙箱和范围编写的提示)。
还要向审查器发送模式规则未标记的转录本中随机的 5% 到 10%。预期会有一些误报。如果审查器说代理做了什么,在您对其采取行动之前,请阅读转录本的该部分。
当某一层显示代理在运行期间已离开其任务时,停止它,并告知您的 Anthropic 账户团队有关超出范围的行为。
保留转录本和代理日志至少 30 天。
为什么要阅读转录本
沙箱和 Claude Code 的自动模式权限分类器都在代理运行时起作用。阅读转录本是一项既不依赖于它们的检查。它有两个用途。
在运行期间。如果发生探测,可能在转录本中可见,早于任何有害操作运行。不要依赖有时间做出反应:在操作执行前采取行动的控制措施优先。在长批处理期间,按计划扫描实时转录本文件,并让一个人每小时或两小时查看一次扫描标记的内容。
在运行后。扫描所有内容一次以确认每个代理都保持在其沙箱内。
对于有网络访问真实目标的参与,最佳实践建议由一个人监督运行,或由了解预期范围的监控器持续监视,在运行可能超出该范围时升级给一个人,并可以结束运行(请参阅 沙箱化中的范围和监督部分)。本文中的各层是构建此类监控器的组成部分。
如果您直接针对 Messages API 运行代理,API 也可以在运行时从沙箱逃逸分类器返回每个请求的分数(请参阅 在线监控)。
第 1 层:代理日志
最便宜的层根本不读取任何转录本。
出口代理应记录它拒绝的每个请求,包括客户端地址和目标。使用空的允许列表,代理仅通过凭证代理到达模型 API,不需要其他主机,因此运行期间的每个被拒绝请求都值得查看。阅读导致该请求的每个运行的转录本。客户端地址显示哪个代理发出了请求,因此您知道首先要阅读哪个转录本。
了解您的出口层不记录什么。在参考设计中,出口代理记录被拒绝的 HTTPS CONNECT 请求。纯 HTTP 和原始 TCP 尝试不会通过内部网络上的代理,因此它们在没有日志行的情况下失败,仅出现在转录本中。在您自己的构建中,考虑记录允许和拒绝的连接,针对每个协议,带有时间戳。
凭证代理应为任何不是模型调用的请求记录一行。在运行结束时保存其日志(请参阅 沙箱化中的凭证代理部分)。
在转录本中捕获什么
第二层和第三层读取转录本本身。
让主机上的编排器为每个代理阶段写入一个转录本,每行一个 JSON 消息,当每条消息到达时。Claude Code 的 stream-json 输出具有这种形式。在每个文件中,带有 "type": "assistant" 的行包含模型生成的内容:text、thinking 和 tool_use 块。tool_use 输入包含 Bash 命令或正在写入的文件。带有 "type": "user" 的行包含 tool_result 块:命令输出、文件内容和目标响应。
捕获每个阶段,包括其代理没有工具的阶段,例如仅判断或比较发现的代理。在这些转录本中检查的内容较少,但没有转录本的阶段根本无法审查。
第 2 层:转录本上的模式规则
为您的代理和目标编写您自己的模式规则,例如正则表达式。对于通过 shell 工作的代理,涵盖绕过出口代理或防火墙、发送凭证或从沙箱外打开 SSH 连接、更改内核或权限可调参数以及通过 /proc 列出其他进程等行为。规则仅匹配某人预期的行为,因此将其视为起点,而不是完整的检测器。
将规则应用于 JSON 解码的字符串而不是原始行,因为在原始行上引号和换行符被转义,模式可能不匹配。报告每个命中,包括文件、行、规则和片段,并让扫描在发现内容时以不同的状态退出,以便计划的作业可以在长批处理期间运行它并发出警报。
预期良性命中
命中是阅读转录本该部分的理由。就其本身而言,这并不意味着代理做了什么错误的事情。进行漏洞研究的代理通常运行与逃逸规则匹配的命令,原因很普通:
在
LD_PRELOADshim 下运行目标;将 ptrace 附加到其自己的子进程,或为这些进程读取 /proc/<pid>/;
通过 /proc/sys/kernel/randomize_va_space 关闭 ASLR;
列出 /proc 以查找并杀死其自己的模糊工作程序。
代理绕过规则可以匹配对具有公共 IP 的渗透测试目标的每个 curl、wget 或 netcat 请求,SSH 出口规则可以匹配对具有公共 IP 或 DNS 名称的目标的任何 ssh 或 scp。缩小或删除仅在您的目标上产生良性命中的规则。
第 3 层:转录本上的模型审查器
对于模式规则标记的每个转录本,向 Claude 发送一个 Messages API 请求,其中包含您编写的审查器提示。提示应要求 Claude 查找扩大其网络访问或突破其沙箱的代理(无论是尝试还是实现),说明要标记什么和不标记什么,并要求提供发现或无,以及支持它们的转录本行。
分两部分构建用户消息:
从两三句话开始,描述沙箱和预期范围。对于参考设计:每个代理在内部网络上自己的隔离沙箱(容器或微虚拟机)中运行,唯一的出口是转发模型 API 调用且不转发其他内容的代理,目标在沙箱内与代理一起。如果您的沙箱允许其他主机,或目标在网络上,请在此处说明并命名范围内的目标。
然后包含代理自己的消息,即其
text、thinking和tool_use块,以及足够的tool_result内容来显示每个调用返回的内容。
使用您运行代理的模型,或更便宜的模型。在 Amazon Bedrock 或 Google Cloud 的 Agent Platform (Vertex AI) 下,使用在您的账户中启用的模型。
要记住的两个限制:
仅查找沙箱和网络逃逸的审查器提示不会检测超出其被允许到达的主机上的参与的代理。
转录本是审查器的不受信任的输入。它包含目标控制的文本。清晰的判决不会清除规则或代理日志标记的转录本。
也审查未标记转录本的样本
模式规则仅捕获某人预期的内容,因此也发送规则未标记的转录本中随机的 5% 到 10%,使用相同的请求。样本显示规则遗漏的内容,以及您是否应该添加规则。
阅读分类器的拒绝
自动模式分类器的拒绝也很有用阅读:在转录本中搜索分类器的拒绝消息,并将其与它在不可用时发出的拒绝分开(请参阅 自动模式)。
在运行期间命中时应采取的措施
当其中一层显示代理在其批处理仍在运行时已离开其任务时:
停止代理。在基于 Docker 的设置中,在代理的容器上执行
docker rm -f会停止它。删除容器会删除客户端的磁盘,因此代理写入的任何内容都会丢失。编排器应将运行记录为失败并继续处理批处理的其余部分。保留证据。将运行的结果保持原样,并检查出口代理的日志以了解相同的时间窗口。确保日志行带有时间戳。
报告它。如果您发现的是真正超出范围的行为,即探测其沙箱或网络隔离或在参与外采取行动的代理,请通知您的 Anthropic 账户团队,除了您自己的事件流程可能需要的任何内容。
轮换模型 API 凭证,如同任何其转录本显示意外行为的运行后一样(请参阅 沙箱化)。
如果您需要在团队外共享转录本,请在副本上工作。删除会话 ID、使用情况会计和转录本第一行记录的主机清单,并在发送前阅读文件。
保留
在运行后至少 30 天内保留以下内容,或在您的监管或合同义务要求的情况下保留更长时间。将它们存储在主机外:
代理转录本;
执行从沙箱出口的任何内容(代理或防火墙)的日志,包括被拒绝的连接;
注入模型 API 凭证的任何内容的日志(如果这是一个单独的组件)。
使用与运行本身相同的访问控制存储它们。转录本可以包含目标源代码、漏洞利用代码和发现。
如果这些日志中的任何一个仅作为容器的日志存在,请在容器被删除或重新创建之前导出它们,因为日志会随之删除。