我最近读了一篇很值得琢磨的论文解读,标题是《当"提示词"学会绕路:用拓扑学方法一次击穿多智能体安全防线》。在 AI 安全这个方向上,提示词攻击早就不是新鲜事,但把"拓扑学"这个词和"多智能体安全防线"放在一起,还是让我眼前一亮。读完它的核心思路后,我觉得它解决了一个我一直头疼的问题:为什么单点防御做得越多,多智能体系统还是能被花式击穿。
这篇文章适合正在搭建多Agent应用、或者负责大模型安全评估的开发者看。它给出的不是一个具体的咒语式防御补丁,而是一套"先看整体拓扑、再找薄弱路径"的分析方法。简单说,这篇论文的核心主张是:当多个大模型Agent协作时,安全边界不应该只看单个Agent的输入输出,而应该看整个Agent通信网络的连通性——攻击者只需要找到一条绕过所有局部守卫的路径,就能从某个不起眼的入口直达高危操作。
1. 这篇论文把"安全边界"放进了拓扑空间:问题从点变成了路径
1.1 多智能体系统的安全困境:防御了左边,右边又进来
过去我们做大模型安全,习惯是给每个入口加过滤:用户输入做一轮敏感词检查和大模型安全性分类,Agent输出再做一轮检测,系统提示词里写满"不要执行危险操作"。这套思路在单Agent时代还算能应付,一旦上了多智能体,很快就会发现力不从心。
我见过太多实际例子:一个协作系统里有任务解析Agent、工具调用Agent、结果汇总Agent,每个节点都单独配置了安全过滤器。攻击者并不硬碰任何一个节点的防线,而是把一段恶意指令拆成几个看似无害的片段,分别塞进不同上下文,让A Agent输出了一段完全正常的话,这段话却恰好成了B Agent的"任务指令"。等恶意行为真正触发时,负责把关的每个Agent都说"我这边没问题"。
这其实就是论文想点破的尴尬局面:所有点的安全都是局部正确的,但整个系统的安全性是全局属性。你没法通过无限叠加局部过滤器来获得全局安全,因为攻击者可选的路径数量,远远大于你部署过滤器的节点数量。
1.2 为什么安全边界天然是一个"拓扑对象"
拓扑学是研究空间在连续变形下不变性质的数学分支。论文把它借过来,是因为"安全边界"这个对象太适合用拓扑语言来描述了:安全边界本质上是一个"可到达性"问题,而不是"某个点是否合法"的问题。
打个比方,你要保护一栋楼,可以在每个门口安排保安,但攻击者如果走地道、爬管道、翻天台,你再多的门口保安也拦不住。拓扑学关心的是建筑整体有哪些通道、哪些连通分支、哪些地方存在"开的口子",而不是单纯数门口有几个保安。多智能体系统的安全边界也是一样的道理:每个Agent的过滤规则决定了一个"被允许的安全输入集合",但Agent之间的信任边、消息流转路径、工具调用的可达关系,共同构成了攻击者可以绕行的"拓扑结构"。
论文把这个问题形式化之后,得出的结论很有冲击力:只要Agent通信图中存在一条连通路径,使得路径上的每一步在局部过滤器看来都是"安全"的,那么整个系统就可能被击穿。更关键的是,这种漏洞不是某一条提示词写得不好,而是拓扑结构本身注定的。
1.3 这篇论文给出的三个核心贡献
为了避免空对空,先把论文的主要贡献整理成一张表,后面再逐个展开:
| 贡献点 | 内容 | 工程意义 |
|---|---|---|
| 建模层 | 把提示词攻击重新定义为语义空间中的"路径搜索"问题 | 让漏洞分析从拼运气变成可枚举、可计算 |
| 分析层 | 把多Agent信任边纳入拓扑图,定义跨Agent的攻击路径 | 暴露了"局部安全但全局不安全"的系统性根因 |
| 方法层 | 用连通性、路径覆盖等拓扑工具定位防御薄弱环节 | 提供了一套可落地的安全体检思路 |
我读完后最大的感受是:论文不是发明了一种新攻击,而是给所有已知攻击方式提供了一个统一的解释框架。它让你看清,那些分散的越狱技巧、提示注入、角色扮演套路,本质上都在做同一件事:在防御边界之间找到一条无损的绕行路径。
2. 两层建模:语义空间里的"绕行"和Agent通信拓扑里的"信任借道"
2.1 第一层建模:语义空间中的安全集与攻击路径
论文的第一层建模,是把提示词想象成高维语义空间里的点。每个提示词经过向量化之后,都对应空间中的一个坐标。语义相近的文本,距离就短;意思完全不同的文本,距离就远。在这个空间里,安全过滤器相当于划出了一个"安全子集"——凡是落在子集内的输入都被放行,落在子集外的就被拦截。
但要命的是,攻击者的目标往往落在安全集之外。如果攻击者直接输入恶意指令,自然会被拦下。可如果攻击者从任意一个安全点出发,沿着一条路径连续微调文本,每一步产生的中间变体在过滤器看来仍然"安全",那么他就能像走迷宫一样,绕到那个先前被禁区包裹的恶意目标上。
"绕路"这个词的数学直觉就在这里:恶意目标和合法指令之间可能不存在直线距离上的相似,但语义空间里存在一条弯弯曲曲的路径,把两者连接起来。过滤器只检查点,不检查路径,所以攻击者可以沿着这条路径一步一步挪过去。
为了让你更容易理解,论文给出的核心判断其实就是一句话:安全过滤器越复杂,它的安全边界就越可能存在"缝隙",因为每一个检测规则都只能覆盖一个局部邻域,而攻击者不需要穿过邻域中心,只需要贴着边界的缝隙走。
2.2 第二层建模:Agent通信拓扑中的信任边
如果说第一层是描述"单个Agent如何被骗",第二层就是描述"多个Agent如何被串起来骗"。多智能体系统本身是一张有向图:每个Agent是一个节点,节点之间的消息传递是有向边。论文把边的特殊性拎出来分析——上游Agent的输出,往往被下游Agent当成可信输入,甚至当成指令来执行。
这就产生了单Agent里不存在的攻击面:攻击者不需要直接污染最终执行者,他可以污染一个上游Agent,让上游Agent输出一段"看起来正常但内嵌恶意意图"的文本;下游Agent没见过原始输入,只看到了这段被"洗白"的输出,自然放行。
论文把这种边叫做"信任边",并指出:信任边上缺少独立的语义校验,是整个多Agent系统安全防线最容易被击穿的部位。因为你防住了用户输入,却没防住另一个Agent的"转述"。这就像你严格核查了访客身份,但访客带来的那个"内部人员"却可以大摇大摆走进机房。
2.3 论文用到的几个关键拓扑概念,逐一对应到安全场景
论文里有几个拓扑学概念,我读的时候做了映射,整理成下面这张表,应该能帮你快速抓住它的分析思路:
| 拓扑概念 | 论文里的安全对应 | 识别信号 |
|---|---|---|
| 路径连通 | 从安全输入到恶意输入是否存在连续可走的文本变体链 | 同义改写、编码混淆、拆句插入 |
| 开覆盖 | 一组安全过滤规则是否真的覆盖了所有可能输入 | 规则盲区、特殊格式绕过 |
| 连通分支 | Agent图中哪些节点实际上处于同一个信任域 | 一个Agent被攻破后能影响多少下游节点 |
| 边界点 | 安全集的边界区域,微小改动就能跨越安全判定 | 判定阈值附近的输入 |
| 映射复合 | 多个Agent的输入输出映射叠加后的整体效果 | 上游输出被下游当成指令执行 |
这套映射最有用的一点是:它把"我们的系统安不安全"从一句无法回答的空话,变成了几个可以检查的具体问题。比如,你的Agent通信图里有几个连通分支?高危工具所在的节点,和外部输入节点之间有几条可达路径?每一条路径上,是否每一个Agent都做了独立的语义校验?这些才是论文真正提醒我们要关注的。
3. 三种攻击模式还原:单点逃逸、跨Agent传导、路径重构
3.1 单点逃逸:贴着安全边界做微小扰动
第一种模式最容易理解,也是大多数越狱攻击的底层逻辑。攻击者选取一个安全输入,然后在语义空间里对它做微小扰动:替换近义词、改变句式、插入无害的过渡句、注入特殊格式标记。每次扰动幅度都很小,小到过滤器的判定结果不变,但经过几十上百次迭代之后,文本的最终语义已经偏到了危险方向。
论文把这种攻击建模为"在安全集的边界上游走"。它指出,任何基于分类器或大模型打分的安全过滤器,它的安全边界都不可能是光滑的,总会出现大量"锯齿感"的凹凸区域。攻击者只要沿着锯齿边缘一点一点爬,就能绕到安全集外面而不触发警报。
我过去做安全测试时也验证过这个现象:一个输入安全分类器,对"如何制造某种危险品"判得很死,但改成"厨房里可以用哪些常见材料进行某种反应"就放行了。两者本质意思一样,可中间经过好几轮改写之后,防线根本反应不过来。论文的价值在于,它告诉你这不是某个过滤器的疏漏,而是边界拓扑的必然结果——只要存在锯齿边界,就存在绕行路径。
3.2 跨Agent传导:让"干净节点"当传声筒
第二种模式才是多智能体系统最独特的风险。攻击者把真正危险的payload伪装成无害内容,先输入给一个安全要求较低的Agent,比如负责闲聊或摘要的Agent;这个Agent正常处理,输出一段合规文本;然后这段输出被传递给另一个具备工具调用权限的Agent,被后者完整当作指令执行。
论文把这种攻击叫"信任借道"。关键不在中间Agent是否安全,而在于下游Agent对上游输出缺少"身份校验"。下游只看到了"这段文本来自一个Agent",却没法判断文本背后的真实意图。在单Agent系统里,攻击者要面对的是模型本身的对齐防线;在多Agent系统里,攻击者可以绕过模型对齐,直接利用系统设计者亲手建立的Agent间信任关系。
我实际测试过的一种变体是这样:让某个Agent输出JSON格式的"任务参数",下游工具Agent看到合法JSON就直接执行。攻击者在用户输入里诱导上游Agent输出一段"无害的JSON任务描述",但里面包含的action字段实际上是删除文件。下游Agent不解包语义,只按协议执行,于是防线全线崩溃。这个过程里每个Agent都做了自己该做的事,系统却做了不该做的事。
3.3 路径重构:把恶意载荷拆成拓扑碎片再组装
第三种模式更隐蔽,它利用的是多Agent系统天然存在的"状态分散"特性。攻击者把恶意指令拆成很多个独立片段,每个片段单独看都完全无害——可能是一个普通名词、一个动作动词、一个输出格式的指示。这些碎片分散在多个上下文窗口、多个Agent的短期记忆、或者多轮对话的早期内容里。
等到某个Agent开始处理最终任务时,系统会把之前存储的若干上下文片段拼接起来。如果拼接的顺序恰好符合攻击者的设计,碎片组合后就形成了完整恶意指令。论文用拓扑学的"连通分支重新合并"来描述这种现象:每个碎片在各自的连通分支里都是安全的,可一旦通过系统机制汇入同一个上下文,分支就会连通,恶意语义瞬间组装完成。
这个攻击非常难防,因为你没法在任何一个中间环节识别出恶意意图。它让我想起一个老段子:寄一封信的每个字都很正常,但收信人按行首字连起来读,就拼出了一句不该出现的话。多Agent系统里的记忆、工具返回值、上游转述,都可能是这些"行首字"的藏身处。
3.4 "一次击穿"的含义:先定位拓扑漏洞,再精准构造载荷
论文标题里"一次击穿"这个说法,我一开始以为是夸张的修辞,读完才发现它有明确的指向:传统攻击是去各个入口试payload,成功与否看运气;论文的攻击是先对整个多Agent系统做一次拓扑分析,画出信任边和可达路径,找到那条最可能"局部全部安全、全局通向危险"的通道,然后再为目标通道量身定制一组最小载荷。
所以"一次击穿"指的是攻击者把分析成本前置了,真正执行攻击时只需要一次有效输入。这个思路对防守方也是一个提醒:我们不是在跟一个随机试错的攻击者对抗,而是在跟一个会系统性地先画图、再选路、最后精准命中的攻击者对抗。你的拓扑图越透明,他定位弱点的速度就越快。
4. 实验复盘:三Agent协作流水线如何被一次击穿
4.1 实验环境:一个标准的任务解析、工具调用、结果汇总流水线
论文的验证实验搭建了一个非常典型的模拟环境,这种结构在真实项目里随处可见。系统由三个Agent组成:
- 任务解析Agent:接收用户原始输入,理解用户意图,输出结构化任务描述。
- 工具调用Agent:接收任务描述,决定调用哪些工具、传入什么参数。
- 结果汇总Agent:收集工具执行结果,整理成最终回复。
安全防护层面,每个Agent都配备了输入过滤器和输出过滤器,并且系统提示词里也明确要求"不得执行危险操作"。
单看每个节点,这套防护并不弱。任务解析Agent会拒绝明显敏感的指令;工具调用Agent会校验工具名称和参数类型;结果汇总Agent会过滤输出中的敏感内容。但论文要展示的恰恰是:局部防护齐全的系统,全局拓扑依然可能是一张漏勺。
4.2 攻击链路完整还原:从一段"角色扮演"到一次文件删除
我没有复现论文的原始代码,但按它的描述逻辑,完整攻击链路可以拆成以下几个阶段:
第一阶段,攻击者不直接提任何危险意图,而是给任务解析Agent设定一个角色扮演前提,让它把后续内容当成某种"合规的内部任务描述格式"来解析。这个阶段没有任何敏感词,过滤器判定为正常。
第二阶段,攻击者在角色设定里嵌入提示,引导任务解析Agent输出一个"工具调用指令块",其中包含了工具名和一个文件路径参数。关键技巧是让这个文件路径看起来像一个普通的资源地址,比如"清理临时缓存文件 /tmp/project/cache"。
第三阶段,工具调用Agent拿到任务解析Agent的输出。由于上游输出是结构化JSON,工具Agent认为这已经是"经过安全确认的指令",不再对参数意图做深层检查,按照工具名映射执行了删除操作。如果攻击者精心构造路径,比如通过符号链接指向关键目录,实际删除范围就会远超"临时缓存"。
第四阶段,结果汇总Agent拿到工具执行结果,只做了输出格式化,并未发现异常。最终用户收到一段"清理完成"的正常回复,风险已经落地,整个流程里没有任何一个环节发出警报。
这就是论文说的"一次击穿":攻击者只发了一段初始输入,后续所有环节被动配合。整个过程不需要直接给工具Agent发送恶意指令,也不需要突破任何单个Agent的安全过滤,攻破点是Agent间的"信任传递"。
4.3 防线为什么全线崩溃:三个层面的根因分析
实验复盘后,论文给出的根因分析特别值得记下来,我把它总结成三点:
第一,检测点覆盖范围错位。所有安全过滤器都放在"Agent的输入输出边界"上,却没有覆盖"Agent与Agent之间的通信信道"。上游Agent已经完成了一次语义判断,下游Agent默认相信这次判断的结果,省掉了二次校验。安全机制看似布满了节点,实际在每个信任边上都是盲区。
第二,信任传递缺少认证和授权。下游Agent接收上游消息时,没有验证消息的"语义来源"是否可信。它只验证了消息格式对不对,却默认携带消息的Agent已经被系统授权。在安全领域,这相当于把"系统集成商认证"误当成"内容安全认证"。
第三,全局状态没有汇聚。碎片化攻击之所以能成功,是因为任何单一Agent都看不到整个上下文的全貌。论文指出的方向是:必须在系统层增加一个"跨Agent语义审计"组件,专门负责把多个节点的输入输出拼起来检查,而不是各自为战。
为了直观对照,我列一个简单的攻防对照表:
| 防线位置 | 原有的防御手段 | 失效原因 |
|---|---|---|
| 用户入口 | 敏感词过滤、安全分类器 | 角色扮演和间接诱导绕过了关键词 |
| 任务解析Agent输出 | 输出格式校验 | 格式合法且内容看似无害 |
| 工具调用Agent输入 | 上游信任+工具名白名单 | 没检查参数背后的真实意图 |
| 工具执行层 | 无 | 高危操作在这里直接落地 |
| 结果汇总Agent输出 | 脱敏过滤 | 恶意行为已执行完毕,过滤无意义 |
4.4 论文的边界与局限:什么情况下这套分析会失效
论文的结论看起来吓人,但它自己也在分析部分做了限定,这一点我读的时候没有被完全说服,但觉得有必要讲清楚。
首先,实验环境是模拟系统,真实生产环境往往还有额外的访问控制层、网络隔离、人工审批流程,攻击路径不一定像实验里那么畅通。拓扑分析找到的是"可能存在"的可达路径,不代表每条路径都能被稳定利用,更不代表攻击者一定能构造出实际可用的载荷。
其次,论文的模型偏重于语义层面的软攻击,对需要精确控制工具参数、或者需要绕过操作系统权限的技术型攻击者来说,拓扑漏洞只是第一步,后面的传统安全机制仍然会拦截。所以论文应该被理解为"多智能体系统新增风险的分析工具",而不是"传统安全可以直接放弃"的理由。
最后,论文没有给出一个现成的自动化防御产品,它提供的更多是思想框架和分析方法。要把这套方法落地成工程工具,还需要结合具体系统的日志、消息结构、工具权限清单去做定制化开发。这部分也正是下面我想展开的实践内容。
5. 读完论文后我建议的"拓扑体检":五步自检多智能体系统
5.1 第一步:绘制Agent通信拓扑图,并标出所有信任边
我拿到一篇新论文,最关心的永远是"明天能不能用上"。这篇论文给我最直接的工程启发,就是把自家多Agent系统的拓扑图画出来。图不需要很精确,但要包含所有Agent节点、外部输入入口、工具调用出口、以及数据在节点间的流转方向。
画完之后,要重点标注哪条边属于"信任边",也就是下游Agent会直接或间接信任上游Agent输出的场景。我自己的经验是,大部分系统的信任边数量都比你以为的多:不仅Agent间消息是信任边,Agent读取共享数据库、读取全局记忆、继承系统上下文,也都构成隐含信任关系。
这一步做下来,很多系统的问题就浮现了:原来某个Agent的输出可以直接影响一个高危工具,中间隔了两层转发,却没有任何一层做语义重新校验。
5.2 第二步:枚举所有"外部可达"的路径
有了拓扑图,下一个动作是枚举路径。关键是找出所有从外部输入入口到高危动作出口的路径。不需要穷举所有可能,只需要关注那些路径上每一跳都处于"可能被诱导"状态的通道。
我建议做一个简单的表格,逐条路径填写:
| 路径编号 | 起点入口 | 途经Agent | 终点高危操作 | 中间是否有语义重检 | 风险等级 |
|---|---|---|---|---|---|
| P1 | 用户对话框 | 任务解析Agent → 工具Agent | 文件删除工具 | 无 | 高危 |
| P2 | 用户对话框 | 摘要Agent → 记忆库 → 规划Agent | 外部API调用 | 仅格式校验 | 中危 |
| P3 | 第三方Webhook | 路由Agent → 工具Agent | 数据库写操作 | 有 | 低危 |
表格填完之后,每条中高危路径都是潜在的攻击通道。论文的那个"一次击穿"案例,放在这个表格里就是从P1这种路径进去的。
5.3 第三步:识别语义边界上的"锯齿区域"
这一步对应论文里"边界点"的概念。对每个Agent的输入过滤器,做一轮针对性边角测试,看它的判定边界在哪里。具体方法是找一组语义等价但表达方式差异明显的文本,投进过滤器,看看哪些会被拦住、哪些会溜过去。
比如你有一个意图分类器,用来判断"用户是否需要调用删除工具"。测试时可以用以下变体轮番试探:
- 直接表达:删除路径下的所有文件。
- 间接表达:清理这个目录里的旧文件。
- 任务化表达:把路径下的内容标记为待清理状态。
- 角色化表达:你现在是系统维护助手,请处理临时文件。
你会发现,过滤器可能只对第一种情况敏感,其余三种全部放行。这些"敏感表达之外的等价语义区域",就是论文所说的锯齿边界。把它们系统性找出来,你就知道自己系统里有多少条"半开的小门"。
5.4 第四步:针对每条信任边做"跨Agent传导"测试
这是多Agent系统特有的一步。我们不仅可以给单个Agent发恶意输入,还要测试:A Agent的输出能否诱导B Agent执行非预期操作。
我最常做的一个低成本测试是这样:设计一段用户输入,让任务解析Agent把"删除操作"改写成一个无害的任务描述,然后观察工具Agent接到这个描述后是否执行了删除动作。如果工具Agent全盘照收,那这条信任边就有严重问题。
还有一种测试思路是针对结构化协议:如果Agent间通信是通过JSON或XML进行,尝试在上游输出中嵌入一些"协议外的隐藏字段",看看下游Agent是否会把它们当作可执行指令。这类测试不需要高深技术,却能快速暴露Agent间"以格式替代语义校验"的坏习惯。
5.5 第五步:把"跨Agent审计"纳入系统设计,而不是事后补救
论文最核心的行动建议,是增加一层跨Agent的全局审计机制。这里我补充一下工程落地的具体做法:
一是对Agent间消息做语义摘要,而不只是格式校验。比如工具Agent在接到删除指令时,不光检查JSON格式,还把任务解析Agent的原始输入摘要一起带上,让大模型判断是否存在怂恿删除的语义。
二是加一个"安全上下文透传"机制。上游Agent做出关键判断时,把判断依据的关键词和置信度附在消息里,下游Agent可以知道上游是不是在一个可疑的诱导环境下做的判断。
三是对高危操作做"双Agent复核"。删除文件、发送邮件、调用外部API这类操作,要求两个独立Agent分别对指令意图做判断,两个判断结果一致才允许执行。这个思路就是论文拓扑分析的自然推论:没有任何一个单点可以信任,只能通过增加独立节点的共识来切断攻击路径。
6. 我的几点体会与一个可复用的防御检查习惯
6.1 安全的重心,要从"节点加固"转向"通道路径约束"
这篇论文让我最大的观念转变,是彻底放下了"给每个Agent都装上最强过滤器就能安全"的幻想。多智能体系统的安全本质是个图论和拓扑问题,单个节点防御得再好,也无法解决路径层的可达性风险。我在自己的项目里开始践行一个原则:不是问"这个Agent能不能被攻破",而是问"外部输入能不能通过若干路径触达高危操作"。前者是点思维,后者才是系统思维。
6.2 对个人开发者和团队的实际建议:先画图,再改架构
如果你正在搭多Agent应用,我强烈建议别等上线被攻破后再反思。拿一个周末的时间,把Agent通信拓扑图画出来,把信任边标出来,把高危工具列出来,然后逐条路径做一遍5步自检。画图的过程中你大概率就能发现好几个"看起来没毛病、实际上漏洞明显"的设计。
架构层面,最划算的改进是让每个Agent对上游消息保持"怀疑态度"。具体说,任何Agent接收到另一个Agent的文本输出时,都应该重新做一次意图判断,而不是把上游输出等同于用户直接输入的"已验证安全内容"。
6.3 一个我一直在用的检查口诀
最后分享一个我自己总结的检查口诀,用在这类系统上特别顺手:"入口可污染,路径可绕行,节点可诱导,出口可落地——处处皆风险。"
具体展开就是:每次设计一个多Agent模块,我都强制回答四个问题。入口能不能被角色扮演绕过?路径上有没有哪条边不做语义重检?某个节点有没有可能被诱导输出误导性指令?最终出口是否有工具权限能落地危险操作?
如果四问里有一问不达标,我就认为这个模块存在论文描述的安全隐患。这套方法不能保证绝对安全,但确实帮我在项目早期拦下了好几次"看起来正常、细想很危险"的设计方案。
这篇论文解读给我最大的启发是:AI安全领域的攻防对抗,正在从"提示词技巧比拼"升级为"系统结构分析"。攻击者在用数学工具寻找路径漏洞,防守方也得学会用同样的视角审视自己的系统。拓扑学听起来高深,落到工程上其实就是一句话:别只守着大门,把整座建筑的地道、管道和天台都数一遍,你才真正知道哪里该设防。