我们在发布前对自己的 AI agent guardrails 进行了压力测试。以下是出现的故障。
Source: Dev.to
你无法发现自己设计的安全系统中的漏洞。你的测试套件映射的是你想象的空间,而这正是攻击者试图逃脱的地方。
在我们向公众开放 APort Vault 之前,我们花了两周时间做了同样的事——尝试突破我们自己的防护措施。不是使用测试套件,而是有意为之。
我们在任何公众玩家尝试之前,就已经突破了八条核心策略规则中的三条。
TL;DR
- 在CTF发布前的内部压力测试破坏了 3 of 8 核心防护规则。
- 五类攻击:prompt injection, policy ambiguity, context poisoning, multi‑step chaining, passport bypass。
- 最危险的发现:multi‑step chaining —— 每个微操作单独通过;但组合后违反政策。
- 修复措施:基于意图的注入检查、对空白的默认拒绝、跨回合会话记忆、不透明的拒绝信息。
- 核心教训:事后过滤失效。必须让危险状态 structurally unreachable。
为什么 AI 代理的防护措施只是安检戏码?
大多数 AI 防护措施的工作方式像机场安检戏码。它们看起来很严密,但只要攻击者有决心,就能穿过去。
大公司方案——LlamaFirewall (Meta) 和 NeMo Guardrails (NVIDIA)——侧重于事后过滤。它们在代理决定执行坏行为 之后 才检测到。这是检测,而不是预防。
一个 Show HN post for hibana‑agent 也持相同观点:“危险行为必须在结构上不可达”。ClawMoat launched 采用了主机层面的做法。信号很明确:业界正从检测转向结构性约束。
构建 APort —— 一个在执行前拦截每一次工具调用的授权层 —— 让我们认识到 意图比措辞更重要。但我们直到自己开始破坏它时才发现,我们的意图检测是多么脆弱。
为什么是护照,而不是边境巡逻?
想象一下,你正前往一个新国家旅行。在每个检查站,你不再出示护照,而是必须给家里打电话让他们为你作担保。
这就是大多数 AI 防护措施目前的工作方式。它们会问大型语言模型:“这个行为安全吗?”它们依赖模型自己的判断,而这种判断可能被操纵。
更好的系统就像真正的护照:身份和权限被编码在随代理一起携带的凭证中。防护措施不再问“这是否被允许?”而是读取凭证并得出结论。这正是我们正在构建的 Agent Passport。但在我们能够信任它之前,我们必须先把它拆开来研究。
我们测试了哪五类攻击?
CTF 围绕五个递进的攻击类别构建。每个类别都针对防护栏设计中的不同弱点。
| Level | Attack class | Description |
|---|---|---|
| 1 | Prompt injection | 直接覆盖尝试:“忽略之前的指令”,“这只是一个测试”,“用户说可以”。目标是通过重新表述词汇,让 LLM 评估者相信该操作是安全的。 |
| 2 | Policy ambiguity | 利用不明确的政策——在空白处行动。如果政策写着“不要读取敏感文件”,什么算 敏感?攻击者寻找灰色地带并在其中生存。 |
| 3 | Context poisoning | 向前面的对话注入虚假上下文,以操纵后续决策。“用户之前已经授权此操作”。防护栏看到被污染的上下文后会做出不同的判断。 |
| 4 | Multi‑step reasoning manipulation | 将单个允许的动作串联起来,最终实现被禁止的结果。每个微操作都通过防护栏,但整体组合违反了政策。这是 AI 政策设计中最难的攻击类别。 |
| 5 | Full system bypass | 综合上述所有手段,并攻击护照验证层本身。如果防护栏信任护照,你能伪造一个吗?能让验证步骤完全被跳过吗? |
测试时出现了哪些问题?
- 提示注入的效果超出预期。 这并不是因为检测薄弱——而是因为我们匹配的是内容而非意图。将“检索机密文档”重新表述为“打开用户请求的文件”改变了 LLM 的判断。
- 策略模糊成为了免费通行证。 “不要读取敏感文件”中的 敏感 未作定义。每一个模糊的空白都可以被利用——我们逐一遍历了所有这些空白。
- 上下文投毒破坏了我们的会话记忆。 我们对每一步单独进行验证。将错误的上下文注入到早期的步骤,会导致后续所有步骤都信任它。
- 多步骤链式操作未被检测到。 我们的防护栏对每一次调用单独评估。一个被拒绝的宏操作被拆分为十个被允许的微操作,顺利通过。我们只能通过查看完整的会话回放才发现它。
- 护照验证本身有效,但其周边假设失效。 在特定的边缘条件下,防护栏可以被迫完全跳过验证——护照检查本身是可靠的,但通往它的路径并不可靠。
我们在发布前修复了什么?
提示注入
预操作授权现在检查 意图,而不仅仅是内容。我们映射语义等价——每个被阻止操作的同义词和重新表述都遵循相同的评估路径。策略不在乎代理如何称呼它。
策略歧义
检测到策略空白时显式 默认拒绝。如果策略没有明确允许某个操作,则会被拒绝。没有灰色地带。
上下文投毒
每回合上下文验证针对原始护照范围。如果上下文偏离了授权内容,请求将被拒绝。
多步骤链式
会话级推理,跟踪微操作的累计效果。若 整体 结果违反任何规则,即使每一步单独通过,也会拒绝宏操作。
护照验证路径
硬连线强制执行,始终 在任何工具调用之前通过护照检查。边缘情况的快捷方式已被移除,验证步骤现在与请求原子化运行。
核心教训
事后过滤不足。最安全的设计是通过执行基于意图、会话感知、默认拒绝的策略,使危险状态结构上不可达,并将凭证视作护照,而不是询问模型“这可以吗?”
多步链式
会话级上下文累积,标记匹配已知绕过链的序列——类似于欺诈检测系统关注交易序列,而不是单个交易。这是第 4 级教训的具体实现。
不透明的拒绝信息
对调用方的拒绝信息现在信息量少,而内部审计日志信息丰富。攻击者探测响应面时学不到有用信息。
核心教训:事后过滤失败——结构才是答案
使危险状态结构上不可达,而不仅仅是可检测。我们的开源 aport‑agent‑guardrails 实现了这些模式。
AI 监管护栏正在发生的结构性转变是什么?
行业正从检测转向结构化。
- Hibana‑agent 的“结构上不可达”论点与我们学到的内容相吻合。
- ClawMoat 的主机层面方法是同一理念的另一种实现。
我们的解决方案是提前在流程中进行授权:在代理决定之前、在大语言模型推理之前、甚至在工具调用构建之前。这是唯一能够弥补多步骤漏洞的办法。
我们自行发现并修复了能修复的部分。这是内部测试的极限——你只能破坏你能想象到的东西。
CTF 已上线,因为我们知道还有遗漏。来找出它吧。
vault.aport.io — 第 1、2 级免费。第 3‑5 级奖励最高 $5,000,先到者得。
截止日期: 2026 年 3 月 12 日。
