AgentSecGraph:面向 LLM Agent 的安全感知依赖分析框架与 AgentSecBench 语料
Beyond Predefined Sinks: Security-Aware Dependency Analysis for LLM Agents
AgentSecGraph在9个held-out案例上上下文完整度91.1%,sink-only为20.0%。
- 在智能体中,模型输出可触发命令、文件、网络或浏览器操作,而不只停留在文本。预定义敏感操作的身份分不清依赖是否仍在、是否被切断,以及有没有守卫。
- AgentSecGraph把敏感操作当锚而非漏洞裁决,为每个候选建Security-ADG,记录来源、依赖、信任边界、守卫和外部效果。Python做局部AST反向追踪,TypeScript/JavaScript做更保守的词法追踪。
- 全语料23866个候选中,依赖证据41.15%、潜在守卫12.88%。22个复现行为中确认漏洞1个。9个held-out例上Security-ADG上下文完整度91.1%(守卫5/5),sink-only为20.0%(0/5)。
- 作者称分析是局部静态证据,不确立可达性、可利用性或守卫充分,且67个仓库不能统计代表整个生态。计时来自单次运行;22个复现行为与9个表示案例不支持通用漏洞检测声明。344项清单的独立裁定仍是后续工作。
- 基准
- AgentSecBench
- 指标
- Context CompletenessGuard Visibilitysource-to-operation dependency evidence ratepotential guard evidence rate
研究者提出 AgentSecGraph,一个以候选操作为中心的安全感知静态分析框架,为每个安全敏感操作构建 Security-Aware Agent Dependency Graph(Security-ADG),在操作身份之外加入 Agent 相关性、来源与依赖证据、信任边界上下文、护栏证据和外部效应语义。配套发布的 AgentSecBench 覆盖 11 个生态、67 个真实 LLM Agent 仓库、37,542 个源文件;当前分析器在 65 个仓库中识别出 23,866 个静态安全敏感操作候选,并为每个候选生成一份 Security-ADG 产物,全语料分析耗时 50.8 分钟,为 9,821 个候选(41.15%)恢复来源到操作的依赖证据,为 3,075 个(12.88%)恢复潜在护栏证据。
深度解读
这篇论文试图解决什么问题?
敏感操作身份不能决定安全语义,需补依赖与安全上下文证据。
操作身份不能决定智能体行为的安全含义。
- 场景:LLM智能体把模型决策接到命令执行、文件系统、网络、浏览器和外部工具。作者称用户指令、检索文档、记忆、模型计划和工具输出等不可信信息,可跨多个软件与信任边界后再影响外部可见操作。
- 现有不足:作者称现有分析常以预定义敏感操作为锚,但同一命令执行仍可能保留智能体输入依赖、被常量覆盖切断,或带有allowlist守卫(Figure 1)。装饰器、工具包装、工作流节点、动态注册和远程MCP工具还会藏起相关关系。
- 核心区分:作者把证据分成敏感操作候选、安全关键行为和漏洞。匹配到敏感操作不自动等于漏洞;后者还取决于可控性、防护、部署暴露、授权、特权、影响和可利用性。
- 本文做法:提出静态框架AgentSecGraph,为每个候选构造以候选为中心的Security-ADG;并构建冻结语料AgentSecBench。目标是可审计的依赖与安全上下文,不是自动漏洞验证。
- 分析范围:输入是冻结程序快照和故意宽松的候选集。更强的漏洞结论另由复现和安全证据作出,不由单次操作匹配给出。
有哪些相关研究?
作者将本文放在静态恢复安全上下文,区别于攻击评测、污点检测和运行时强制。
智能体安全评测
- 注入与工具风险:Greshake等(2023)、Liu等(2024)、Zhan等(2024)做间接提示注入;Debenedetti等(2024)的AgentDojo在环境中评测攻击与防御;Ruan等(2024)用沙箱识别智能体–工具风险。
- 更广基准与威胁面:Zhang等(2025)的Agent Security Bench、Andriushchenko等(2025)的AgentHarm、Lee等(2025)的SEC-bench覆盖提示/工具/记忆、多步有害滥用和真实软件安全任务。Chen等(2024)、Evtimov等(2025)、Luo等(2026)及MCP相关工作把范围扩到记忆投毒、网页智能体、资源滥用和MCP。
- 生态证据:Liu等(2026)报告第三方agent skills可携带恶意指令和辅助代码;Kim等(2026)系统化智能体系统的设计、攻击与防御。
程序分析
- 经典基础:Ferrante等(1987)的PDG、Yamaguchi等(2014)的Code Property Graph、Avgustinov等(2016)的QL、Enck等(2010)的TaintDroid、Arzt等(2014)的FlowDroid、Wang等(2026)的YASA,提供依赖、属性图、查询和source–sink/污点分析。
- LLM集成软件:Liu等(2025)的AgentFuzz动态搜索触发敏感操作的输入;He等(2026)的TaintP2X静态追踪LLM生成值到敏感sink;Zhang等(2026)的Agent Audit结合智能体数据流与凭证、配置、特权分析。
- 作者的对照:作者认为预定义source–sink关系不足以刻画安全风险,因而把敏感操作当作候选锚,再补智能体语义、来源、依赖、信任边界、守卫和外部效果。
运行时强制
- 策略执行:Wu等(2025)的IsolateGPT隔离系统资源;Debenedetti等(2026)的CaMeL分开可信控制流与不可信数据;Shi等(2025)的Progent对工具调用做可编程最小特权;Li等(2026)的ACE分开规划与执行并约束信息流和能力;He等(2026)的AttriGuard对工具调用做运行时因果归因。
- 作者的对照:作者称这些系统主要在运行时强制策略;AgentSecGraph不执行策略,只静态记录信任边界、守卫、可得特权上下文和外部效果。
依赖表示与基线
- 图表示:Wang等(2026)的AgentFlow构建覆盖智能体、提示词、模型、能力、记忆和控制策略的ADG。Li等(2026)的Agent-BOM结合静态能力与运行时状态,重建安全相关执行和攻击链。
- 基线与语料:表示对比用同一候选的sink-only、simplified ADG和full Security-ADG;语料是自建AgentSecBench。论文未把AgentFuzz、TaintP2X或Agent Audit当作实验对照运行。Table 6由作者标注设定、是否有智能体依赖、是否有超出操作身份的上下文,以及主要焦点。
- 定位:作者称本文补的是真实智能体源码上的静态依赖与安全上下文;与污点路径、AgentFlow的框架依赖和Agent-BOM的运行时重建互补,粒度是单个敏感操作。
论文如何解决这个问题?
以敏感操作为锚构造Security-ADG,分开操作、依赖和安全上下文。
AgentSecGraph把匹配到的敏感操作当作分析锚,为每个候选建以候选为中心的Security-ADG,并与漏洞判定分开。
问题设定
- 候选生成故意宽松:匹配只说明可能存在安全相关能力,不说明它受智能体控制、可从不可信来源到达、守卫不足或可利用。
- 对每个候选,静态安全上下文写成C(o)=⟨R, S, D, T, P, G, E⟩,依次为智能体相关性、来源、source-to-operation依赖证据、信任边界、静态可得特权、候选守卫、外部效果类别。
- 这些维度是证据不是裁决。依赖或信任边界不确立可利用性;出现守卫也不确立守卫完整或有效。D(o)为真只表示恢复了依赖证据。
- 目标窄于自动漏洞验证:恢复智能体相关值如何影响敏感能力,以及周围的安全上下文;更强结论另靠复现。
候选锚定与框架归一化
- 每个候选绑定冻结仓库、源码位置、操作类别、检测器来源和局部代码。
- 框架构造映射为记录N,含框架、语义角色、程序符号、暴露参数和匹配置信度。被识别为面向智能体的工具时,暴露参数可标为智能体相关来源。
- 当前实现覆盖MCP/FastMCP、LangChain、CrewAI、AutoGen、OpenAI Agents SDK、Semantic Kernel、LlamaIndex的代表性构造。归一化不赋漏洞标签。正文未给出具体选择器。
Security-ADG
- 每个候选的图写成Go=(Vo, Eo, Φo):证据节点、恢复的关系,以及图级来源和安全上下文属性。它不重建整个程序,只保留解释这一操作所需的证据(Figure 3)。
- Table 1的类型包括程序符号、敏感操作、输入来源、信任边界、守卫候选、外部效果,以及contains、may_cause、may_data_depend_on、may_cross、may_guard。
- may_表示静态证据和可能关系,不是端到端可达性、攻击者控制、可利用性或守卫充分性的证明。
- 外部效果按操作类别确定性赋抽象类别,是模式属性,不是运行时确认的效果。
依赖、信任边界与守卫
- 从候选消费的值做反向恢复,寻找智能体相关或外部影响的来源到该操作的局部链。
- Python用AST跟踪局部参数、赋值、定义和再赋值;面向智能体的参数在到达候选前被常量覆盖时,对应依赖终止。TypeScript/JavaScript做语法感知的词法反向追踪,更保守,不提供完整别名、类型或控制流推理。
- 守卫证据包括allowlist、固定参数或参数向量的命令构造、schema或语法校验、认证、路径限制、沙箱和资源限制。may_guard只表示防御证据可见。
- 特权只在支持的源码构造能恢复显式证据时记录,不推断部署身份、环境权限或运行时授权。
实现契约与三种视图
- 流水线含语言分析器、框架适配器、确定性图生成。适配器独立于图模式。
- 构造成功指恰好发出一个链接到原候选标识和源码来源的图,衡量一对一生成与链接,不是关系的语义正确或完备。
- 同一候选导出三视图:只留操作的sink-only;留结构操作与外部效果的simplified ADG;留来源/依赖、信任边界、守卫和外部效果的full Security-ADG。
- 分析在记录的Git commit上运行,且独立于人工标注、模型安全判断、复现结果和漏洞处置。作者称分析有意保持局部,反射、动态注册、元编程和部署相关暴露可能使证据不完整。
论文做了哪些实验?
9例中Security-ADG保留91.1%上下文和5/5守卫,sink-only为20.0%和0/5。
实验设置
- 语料:AgentSecBench,67个公开仓库、11个生态、37542个源文件、291.2 MB,冻结在记录的Git commit。纳入独立于分析器输出。主语言Python 51个(76.1%),TypeScript 7个(10.4%),其余9个主要为C#、Rust、Go、PHP、Shell(Table 7)。
- 三个候选总体:历史试点531个候选、5个仓库;同一5个快照用当前扫描器为508个,只记录扫描器漂移;当前全语料23866个候选,用于刻画和计时。三者都不是漏洞数。
- 环境:HP ProBook 440、i5-1340P(16逻辑处理器)、32 GB RAM、Windows 11 Home(build 26200)、CPython 3.13.12。单进程、无worker池。墙钟来自一次完整运行;论文未报告重复运行分布和正式峰值RSS。
- 对照:同一候选的sink-only、simplified ADG、full Security-ADG。差异来自表示丢掉的信息,不是候选生成不同。
- 指标:全语料比率以23866为分母。Context completeness是各例表示所保留的适用参考元素数之和,除以适用元素数之和;缺席或未知元素排除,no_guard_confirmed作为有支持的负向元素留在分母。Guard visibility只在参考和表示都暴露具体守卫证据时计数。
- 真值:参考集要求行为能绑到冻结快照,并由作者审阅的受控复现支持。五模型面板(openai/gpt-5-mini、anthropic/claude-sonnet-4.6、google/gemini-3.5-flash-lite、qwen/qwen3-max、deepseek-v4-pro)独立预标注150个任务、750条有效响应,只做分歧分诊。实现辅助使用OpenAI Codex与GPT-5.6。论文未报告与人工的一致性系数。
主结果
表示 Context Completeness Guard Visibility sink-only 20.0%(9/45) 0/5 simplified ADG 40.0%(18/45) 0/5 Security-ADG 91.1%(41/45) 5/5 据Table 5与附录Table 12。9个held-out案例,每例5个适用维度。
- 作者称从40.0%到91.1%的增加不能只归因于结构依赖;来源、安全相关依赖、信任边界和守卫提供了额外上下文。
- 作者称这些数字衡量上下文保留,不是漏洞检测准确率;5/5不意味着观察到的守卫充分。
- 附录Table 11:4个no_guard_confirmed例上Security-ADG为4/5,5个guarded例为5/5;sink-only均为1/5,simplified ADG均为2/5。作者称图不为前者发出正向守卫节点,故不计守卫保留分。
全语料覆盖与开销
- 测了什么:当前扫描器处理全部67个冻结仓库,再为每个候选构图。
- 结果:67/67完成,无跳过或失败;23866个候选来自65个仓库、7214个源文件;每个候选一个Security-ADG。依赖证据9821(41.15%),框架特定证据749(3.14%),potential guard 3075(12.88%)(Table 3)。端到端3046.6秒(50.8分钟)、7.83候选/秒;抽取1508.5秒,构图1538.2秒;仓库时间中位数9.6秒,P90/P95为203.0/236.2秒(Table 4)。
- 作者解读:成功标准是一对一生成与来源链接,不是语义正确。来源、依赖、trust-crossing的导出计数相同,故不把9821三重计数,也不把本实验当成独立信任边界准确率。本次未恢复显式特权上下文。作者称运行时间支持离线语料分析,大仓库构成延迟尾部。
复现参考集
- 测了什么:从源码检查到受控行为确认;可用隔离执行、外部效果的stub或monkeypatch,或成对的攻击–防御测试。模型判断不作标签。
- 结果:13个仓库、22个行为;漏洞真值1,待披露候选1,受守卫的非漏洞20(Table 2)。9个表示案例中,5个为本地monkeypatch证明,4个为未执行外部效果的源码构造证明(附录D)。论文未报告该确认漏洞的具体复现细节。
- 作者解读:复现敏感行为本身不确立漏洞;面向智能体的值到达强能力后,部署暴露、授权、特权、守卫和影响仍与判定有关。作者称复现案例里反复出现依赖保留与被常量移除、有守卫与无守卫、校验路径与有效果路径,以及同一低层操作的不同信任上下文;sink-only只记录操作身份。
其他消融与分析
- Table 14依赖证据:filesystem_write 84.14%(4218/5013),filesystem_read 65.28%(2730/4182),external_tool_invocation 11.28%(603/5344),browser_control 1.87%(11/588)。
- Table 14守卫证据:filesystem_delete 51.29%(299/583),dynamic_code_execution 41.82%(23/55),external_tool_invocation 1.37%(73/5344)。作者称不得解释成类别间漏洞流行率差异。
- Table 14候选数最高的类别:external_tool_invocation 5344,filesystem_write 5013,filesystem_read 4182,command_execution 2722。
- 全语料显式特权上下文证据为0(§4.3);外部效果节点覆盖是按类别赋值的模式属性。
- 扫描器漂移:同一5个试点快照,历史清单531个候选,当前扫描器508个(§4.1)。
- 344操作清单(dddabtc/winremote-mcp 148条,nexu-io/html-anything 196条)因独立裁定未覆盖全部条目,论文未报告匹配数、recall、precision或F1(附录F)。
有什么可以进一步探索的点?
作者称静态证据不完整,参考集不支持通用漏洞检测结论。
作者指出的局限与后续方向
- 构造与内部效度:作者称抽象省略部分部署相关因素;context completeness衡量被表示的证据,不是已证明的可达性或可利用性;guard visibility不确立守卫充分(§5.3)。
- 分析范围:作者称Python恢复是局部、基于AST的,不是sound的全程序、别名、points-to或符号分析;TypeScript/JavaScript用更弱的语法感知词法追踪。反射、动态注册、元编程或部署特定暴露与特权,可能产生缺失或不精确证据(§5.3)。
- 特权与计数:特权只在支持的源码构造能恢复显式证据时记录;本次全语料提取没有恢复到。来源、依赖和trust-crossing的语料计数相同,作者因此不将其视为三次独立测量,也不声称有独立验证的信任边界恢复率(§5.3)。
- 外部效度:作者称67个仓库、11个生态在统计上不能代表整个生态;可得性、选择标准和开源访问塑造构成。Python占主导,且其依赖分析强于TypeScript/JavaScript,汇总结果不是语言无关的性能估计(§5.3)。
- 结论效度:23866与历史531来自不同扫描器版本,不能直接当作规模扩展实验。证据频率不估计漏洞流行率,也不相对仓库内全部安全相关行为建立召回。计时来自一次运行,归档不含峰值内存。五模型分诊可能影响哪些案例更早被人工查看,作者因此不把复现集当作语料行为流行率的无偏估计。22个行为与9个案例支持所报告的案例级、表示级发现,但不支持穷尽召回或通用漏洞检测声明。作者不对参考集把precision、recall或F1作主指标(§5.3)。
- 清单裁定:附录F.4称独立裁定标签未覆盖全部344项,评估器因此不给出聚合或分类恢复指标;完成独立裁定仍是后续工作。
实验覆盖范围
- 全语料对象是AgentSecBench的67个冻结仓库、11个生态、37542个源文件;当前扫描得到23866个候选、65个含候选仓库、7214个含候选文件(Table 2、§4.3)。
- 框架适配器覆盖MCP/FastMCP、LangChain、CrewAI、AutoGen、OpenAI Agents SDK、Semantic Kernel、LlamaIndex的代表性构造(§3.2)。
- 复现参考集为13个仓库上的22个行为:确认漏洞1、待披露候选1、受守卫非漏洞20(Table 2)。
- 表示对比为9个held-out案例和三种同源视图;5例有参考守卫,5例为monkeypatch证明,4例为未执行外部效果的源码构造证明(§4.6、附录D)。
- 论文未报告重复运行计时分布和峰值内存(§4.1、§5.3);未报告344清单的匹配数、recall、precision或F1(附录F.4);未报告参考集与模型预标注的一致性系数(§4.1);未报告那1个确认漏洞的具体复现细节。
总结一下论文的主要内容
AgentSecGraph用Security-ADG分开操作检测与安全解释,并量化上下文保留。
AgentSecGraph对冻结的LLM智能体源码做安全感知静态分析:敏感操作只作候选锚,Security-ADG再记下它与智能体输入、依赖、信任边界、守卫和外部效果的关系。
- 问题:同一命令执行可以连着智能体输入、被常量覆盖切断,或带有守卫。作者认为只看操作身份无法解释这些差别,也不应把每次匹配直接当成漏洞。
- 做法:Python用AST做局部反向依赖,常量覆盖会终止对应依赖;TypeScript/JavaScript用更保守的词法追踪。may_边只表示静态证据。同一候选可投影成sink-only、simplified ADG和完整Security-ADG。语料AgentSecBench含67个仓库、11个生态、37542个源文件。
- 语料结果:当前分析器给出23866个候选和同样数量的图,无报告的构造失败。依赖证据41.15%(9821),potential guard 12.88%(3075),端到端50.8分钟(Table 3、Table 4)。显式特权上下文本次为0。
- 行为与表示:13个仓库复现22个行为,确认漏洞1、待披露1、受守卫非漏洞20(Table 2)。9个held-out案例上,Security-ADG的context completeness为91.1%、守卫可见性5/5;sink-only为20.0%和0/5,simplified ADG为40.0%和0/5(Table 5)。
- 作者结论:预定义敏感操作仍可作为分析锚;作者称补上依赖和安全上下文后,表面上相似的操作才能被分开解释。上述数字是证据保留和当前分析器在该语料上的分布,不是漏洞检测准确率或漏洞流行率。