当我们讨论 Agent 安全时,一个很自然的问题是:不同 Agent 框架,本身会不会带来不同的安全性?
例如,同样使用一个大模型、同样遭遇 Prompt Injection,如果把 LangChain 换成 CrewAI,或者把 AutoGen 换成 LlamaIndex,攻击成功率会不会随之发生明显变化?
这个问题看起来很简单,但真正做实验时却很难回答。
因为所谓“换了一个 Agent 框架”,往往不只是换了一层代码。不同框架可能会自动添加系统提示词、改变消息角色、重写工具描述,甚至重新组织整个上下文。最终送到大模型面前的内容,很可能已经不是同一个输入。
于是,当两个 Agent 的安全表现出现差异时,我们很难确定:
究竟是框架本身导致的,还是框架悄悄改变了模型看到的内容?
论文 AgentPort-Bench 正是围绕这个问题展开。

https://www.researchgate.net/profile/Waqar-Javed-3/publication/414611060_AgentPort-Bench_A_Controlled_Seven-Framework_Evaluation_of_Agentic_AI_Security_Portability/links/6ab34c874b53e25e421f581e/AgentPort-Bench-A-Controlled-Seven-Framework-Evaluation-of-Agentic-AI-Security-Portability.pdf
研究者在 7 个主流 Agent 框架和直接 API 调用之间进行了超过 9000 次受控实验,试图把攻击类型、模型和框架三个变量拆开,回答一个非常基础、但长期没有被认真验证的问题:
Agent 的安全表现,到底主要由什么决定?
最终结果有些出人意料。
攻击类型解释了约 28% 的结果差异,模型解释了约 4.14%,而 Agent 框架只有约 0.05%。
换句话说,在论文控制的实验条件下:
攻击 >> 模型 >> 框架。
换个 Agent 框架,安全性真的会变吗?
今天的 Agent 应用通常不会直接调用一次大模型接口,而是建立在一层 Agent 框架之上。
典型框架包括:
LangChain
CrewAI
AutoGen
LlamaIndex
OpenAI Agents SDK
Google ADK
Semantic Kernel
这些框架负责处理 Prompt、工具、记忆、任务编排以及模型调用。
因此一个很容易产生的直觉是:
不同 Agent 框架拥有不同的架构,那么它们的安全性应该也有所不同。
于是很多安全评测会分别测试:
“某个攻击在 LangChain 上成功率多少?”
“同一个攻击在 CrewAI 上成功率多少?”
如果结果不同,似乎就可以得到:
某个框架更安全。
但 AgentPort-Bench 的作者认为,这里面存在一个非常严重的实验问题:
不同框架可能根本没有把同样的东西发送给模型。
比如你在程序中输入:
请完成任务 XLangChain 最终可能发送:System:You are a helpful assistant.User:请完成任务 X
而另一个框架可能自动添加:System:You are an autonomous agent.You should safely and carefully complete your goal.User:请完成任务 X
表面上看,测试使用的是同一个输入。实际上模型面对的已经是两个不同的上下文。
这时候,如果第二种方式表现得更安全,我们真正测到的可能并不是:
框架 B 比框架 A 更安全。
而是:
Prompt B 比 Prompt A 更安全。
这也是 AgentPort-Bench 首先要解决的问题。

AgentPort-Bench:把三个变量真正拆开
为了尽可能隔离“框架”这个因素,研究团队构建了 AgentPort-Bench。
整个实验主要由三个变量组成:
攻击类型 × 模型 × Agent 框架
框架方面,实验覆盖 7 种 Agent 框架:
LangChain
CrewAI
AutoGen
LlamaIndex
OpenAI Agents SDK
Google ADK
Semantic Kernel
除此之外,研究者还增加了一种直接通过 HTTP API 调用模型的方式,作为基准。
模型则覆盖 Anthropic、OpenAI 和 Google 三家厂商,共 6 个不同能力档位的模型。
最终完成的实验总量达到:
9360 次。
但实验设计中真正重要的并不是数量,而是作者加入了一道此前很多 Agent Benchmark 没有做过的检查:
验证不同 Agent 框架最终发送给模型的 Payload 是否真的一致。
这里检查的不是“语义大概一样”,而是尽可能比较:
System Prompt
User Message
Message Role
Tool Description
Instruction
序列化结果
如果某个框架额外添加了一段文本,那么研究人员首先不会把它解释成“框架安全差异”,而会认为这是一个:
Adapter 差异。
也就是说,在真正比较框架之前,先确保实验对象确实是同一个。
这是整篇论文非常关键的方法论设计。
CrewAI 差点制造出一个“框架更安全”的假象
作者真的在实验中发现了这样的问题。
最典型的是 CrewAI。
CrewAI 的 Agent 通常不是简单接受一段 System Prompt,而是需要定义:
Role
Goal
Backstory
因此研究人员一开始为了适配 CrewAI,把原本的系统提示词重新包装成了一段更完整的 Agent Persona。
问题就在这里出现了。
新的 Prompt 不但比其他框架长了很多,其中还额外出现了类似 “safely” 这样的安全语义。
这意味着实验虽然名义上比较的是:
CrewAI vs 其他框架
实际上已经变成:
一个带额外安全提示的 Prompt
vs一个没有额外安全提示的 Prompt。
结果果然出现了明显差异。
CrewAI 最初的 PASS 比例达到:
66.4%。
当作者发现问题,并把 Adapter 修正为尽可能保持 System Prompt 一致之后,他们重新执行了 1170 次相关实验。
CrewAI 的 PASS 比例下降到了:
61.3%。
前后相差超过 5 个百分点。
如果研究者没有审计 Adapter,这个结果很容易被解释成:
CrewAI 的安全性比其他框架更高。
但实际上,相当一部分所谓的“框架安全优势”,只是来自 Prompt 被改写了。
这说明:
Agent 安全 Benchmark 中,Adapter 本身就是一个隐藏变量。

甚至可能出现“什么都没有,所以攻击失败”
论文还发现了另一个更极端的例子。
在部分实验配置中,HTTP 基线和 LangChain 并没有真正传递 System Prompt。
但其中一项测试恰好是:
System Prompt Extraction。
也就是让模型泄露自己的系统提示词。
结果自然是:
攻击成功率接近 0。
乍一看,这似乎说明:
LangChain 对 System Prompt 泄露具有极强防护能力。
但真实原因非常简单:
它根本没有 System Prompt 可以泄露。
这不是“防住了攻击”,而是:
攻击目标不存在。
这个例子揭示了 Agent 安全评测中的一个基础问题:
在比较安全结果之前,首先要确认不同系统里的“攻击面”本身是否存在、是否一致。
否则很多所谓安全结论,都可能只是在比较不同的系统配置。
真正决定 Agent 安全性的是什么?
在尽可能控制输入等价性之后,作者终于开始回答论文最核心的问题。
他们通过方差分析,估计不同因素对安全结果差异的解释程度。
结果是:
因素 | 对结果差异的解释程度 |
|---|---|
攻击类型 | 约 28.00% |
模型 | 约 4.14% |
Agent 框架 | 约 0.05% |
这个结果非常直观。
如果把 Agent 的最终安全表现看作一个结果:
Security Outcome
那么在这套实验中:
[
Attack \\gg Model \\gg Framework
]
攻击类型产生的影响,大约是框架的 500 多倍。
模型本身的影响,也大约是框架的 80 倍。
换句话说:
你遭遇了什么攻击,比你用了什么 Agent 框架重要得多。
甚至:
你使用了什么模型,也远比你使用 LangChain、AutoGen 还是 LlamaIndex 更重要。
这也是 AgentPort-Bench 最核心的实验结论。

“没有显著差异”还不够
但作者没有在这里直接得出:
所有框架都一样安全。
这是这篇论文统计设计中比较严谨的一点。
传统统计检验如果得到:
p > 0.05
通常只能说明:
没有足够证据证明两个东西存在差异。
但这并不等于:
已经证明两者相同。
因为还有另一种可能:
样本不够,所以真正的差异没有被发现。
因此 AgentPort-Bench 又做了一次:
等效性检验(Equivalence Test)。
它问的问题并不是:
两个框架有没有任何差异?
而是:
两个框架之间的差异是否小到,在实际安全场景中可以忽略?
研究者事先设定一个“小效应”边界,然后对不同执行条件两两比较。
8 种执行方式,总共产生:
C(8,2)=28
组比较。
最终:
28 组全部进入实践等效区间。
这意味着论文能够给出的结论比“没有发现差异”更强:
至少在当前实验设计覆盖的安全问题中,七个 Agent 框架的差异小到基本可以视为实践等效。
CrewAI 是一个有意思的例外
虽然整体框架效应极低,但 CrewAI 出现了一个小的残余效应。
即便修正 Prompt Adapter 后,在部分统计模型中,CrewAI 仍然表现出稳定的小幅差异。
这个差异具有统计显著性。
但它依然没有超过研究者设定的“实践意义”边界。
换句话说:
统计上能测出来,工程上却可能不值得在意。
这也是一个很典型的问题。
当实验次数足够多时,非常小的差异也可能得到极低的 p 值。
但安全工程真正需要关心的是:
这个差异大到值得改变系统设计吗?
论文给出的答案依然是:
目前还没有。
不过 CrewAI 为什么会残留一点差异,作者提出了一个值得继续研究的猜测。
CrewAI 天然采用:
Role + Goal + Backstory
构造 Agent。
即使具体文字已经尽可能保持一致,不同的消息结构仍可能改变模型对于上下文的理解。
这意味着:
文本内容一致,不一定意味着模型看到的语义结构也完全一致。
这其实把 Agent Benchmark 带到了一个更深的问题。
“同一个 Prompt”到底意味着什么?
很多安全实验经常写:
所有系统使用相同 Prompt。
但在 Agent 场景里,“相同 Prompt”其实没有想象中那么简单。
因为模型真正看到的不只是文字。
还包括:
System / User / Assistant 的角色层级
消息顺序
Tool Schema
Function Calling 格式
Prompt Template
上下文边界
Provider 的序列化方式
框架自动加入的隐藏说明
所以可能出现:
Text_A = Text_B
但:
Context_A ≠ Context_B
进一步甚至可能:
Meaning_A ≠ Meaning_B
因此,一个严格的跨 Agent 安全 Benchmark,未来可能不能只检查:
Prompt 文本是否相同。
而应该检查整个:
Model Input Representation。
这是 AgentPort-Bench 很值得继续扩展的一点。
论文还发现了一种“推理资源耗尽”现象
除了框架可迁移性之外,论文还观察到一个很有意思的异常。
某个模型在面对特定测试输入时,会持续消耗内部 Reasoning Token。
结果是:
内部推理把几乎整个 Token Budget 用完。
但最后没有剩余空间生成可见答案。
最终表现为:
Empty Output。
可以把这个过程理解成:
输入↓模型进入长时间内部推理↓不断消耗推理 Token↓达到 Token 上限↓没有空间生成最终回答↓输出为空
这与传统 Prompt Injection 或 Jailbreak 不太一样。
它更像一种:
Reasoning Resource Exhaustion——推理资源耗尽。
过去我们更关注:
攻击者是否能让模型生成危险内容。
但推理模型引入了一个新的资源维度:
Reasoning Budget
于是未来 Agent 安全可能还需要考虑:
攻击者是否能够故意让模型陷入异常长的内部推理,从而消耗计算资源、Token 配额和执行时间。
从系统角度看,这已经有些接近:
推理层的拒绝服务。
这并不是论文的主贡献,却是一个非常值得继续关注的新现象。

但这篇论文其实并没有真正测完整的 Agent 安全
看到这里,很容易得出:
Agent 框架不影响安全。
但这个结论必须非常谨慎。
因为 AgentPort-Bench 实际测到的只是 Agent 安全的一部分。
它的实验流程更接近:
攻击 Prompt↓Agent Framework↓LLM↓文本输出↓安全检测
而现实中的 Agent 通常是:用户请求↓任务规划↓工具选择↓权限判断↓工具调用↓环境返回结果↓状态更新↓记忆写入↓重新规划↓继续执行
这两种系统复杂度完全不同。AgentPort-Bench 并没有真正覆盖大量 Agent Runtime 问题,例如:
工具权限
MCP
Credential
Sandbox
Memory
State
Hook
Callback
Multi-Agent
Delegation
Human Approval
Retry
External Action
因此,论文真正证明的是:
在攻击 Payload、模型输入和模型本身尽可能保持一致,同时主要评价文本响应结果时,不同 Agent 编排框架带来的安全差异很小。
它并没有证明:
Agent 框架本身没有安全差异。
这是理解这篇论文最重要的边界。
作者为了控制变量,其实主动“抹掉”了一部分框架差异
这里还有一个很有意思的问题。
为了科学地研究:
框架本身是否影响安全?
作者需要让不同框架尽可能向模型发送相同的输入。
但现实中:
框架如何包装 Prompt,本身就是框架行为的一部分。
比如 CrewAI 的 Role、Goal、Backstory,本来就是它的设计理念。
如果为了实验控制,把这些东西全部压平成完全一致的 Prompt,相当于主动消除了一部分真实的框架特征。
所以 AgentPort-Bench 实际上研究的是一个更加精确的问题:
当我们消除 Prompt、Adapter 和输入结构带来的大部分差异后,剩余的 Agent 编排框架本身还会不会明显改变模型安全表现?
答案是:
基本不会。
这其实并没有削弱论文价值。
反而让它真正说明了另一件事情:
很多过去被认为是“框架安全差异”的结果,可能根本不是 Framework Effect,而只是 Prompt、Adapter 或配置差异。
Agent 安全评测可能需要重新分层
如果把 Agent 安全拆开来看,大致可以分成几个层级。
第一层:输入层
关注:
Prompt
System Message
Tool Description
Role
第二层:模型行为层
关注:
Prompt Injection
Jailbreak
Refusal
Instruction Following
第三层:工具运行时
关注:
Tool Selection
Argument
Permission
External Execution
第四层:状态与轨迹
关注:
Memory
Context
State
Trajectory
第五层:系统协作
关注:
Delegation
Multi-Agent
Credential
Identity
Authorization
AgentPort-Bench 实际主要覆盖的是:
第一层和第二层。
而当前 Agent 安全研究越来越多的问题,已经进入:
第三层到第五层。
例如:
Agent 是否调用了错误工具?
是否把不可信内容写入长期记忆?
是否在多 Agent 委托过程中扩大了权限?
是否因为 Hook 或运行时状态被劫持而执行错误操作?
这些问题都不是单纯比较 Prompt 输出能够回答的。

真正重要的,不是选哪个框架,而是测什么
AgentPort-Bench 最终给出的结论并不是:
LangChain、CrewAI、AutoGen 都一样,所以安全团队不用考虑框架。
更准确的理解应该是:
如果只是模型输入—模型输出层面的安全问题,那么框架很可能不是最重要的变量。
在这个层面上,真正值得投入资源的是:
第一,扩大攻击覆盖面。因为攻击类型解释了最大的安全差异。
第二,认真评估模型。不同模型本身仍然存在明显差异。
第三,审计 Adapter。确保所谓的“框架差异”不是 Prompt Template、Role 或 System Message 偷偷发生了变化。
第四,把评测继续向 Agent Runtime 延伸。真正的 Agent 风险越来越多发生在:工具、权限、状态、记忆、身份和委托关系中。
这也是 Agent 安全研究正在发生的一次明显迁移:
从“模型会不会说错话”,走向“系统会不会做错事”。
写在最后
AgentPort-Bench 最值得关注的地方,并不是它给七个 Agent 框架排出了一个安全榜单。
恰恰相反。
它发现:
在严格控制变量之后,框架本身几乎排不上号。
真正主导安全结果的是:
你遭遇了什么攻击,其次才是用了什么模型。
而很多看起来属于“框架”的差异,可能只是因为框架在背后偷偷改写了 Prompt、角色或上下文。
这给 Agent 安全评测留下了一个很重要的方法论提醒:
在比较一个系统更安全还是更危险之前,首先要确认我们比较的真的是同一个东西。
但这也恰恰意味着,AgentPort-Bench 并不是这个问题的终点。
当 Agent 真正开始调用工具、持有权限、维护长期记忆、相互委托任务之后,安全问题就不再只是模型输出是否安全。
到了那时,我们真正需要回答的问题将变成:
当模型开始行动,什么才是真正决定 Agent 安全的变量?
而这可能才是下一代 Agent 安全 Benchmark 真正需要解决的问题。
声明:本文来自模安局,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。