代码越混乱AI越易受控?Capital One揭秘工作区拓扑攻击:架构竟让注入成功率相差两倍!

Workspace Topology as an Attack Vector in Agentic Coding Assistants

论文原文 ↗ 论文发布 解读发布 解读:AI前沿分享

代码越混乱AI越易受控?Capital One揭秘工作区拓扑攻击:架构竟让注入成功率相差两倍! 论文图示

随着 Claude Code、Codex 以及各种基于开源码力驾驭的智能编程助手(Agentic Coding Assistants)全面融入开发流程,开发者已经习惯将本地工作区的完整控制权交给大模型。传统的代码补全往往只关注当前光标所在的上下文,而现代编程 Agent 的杀手锏在于“全自主探索”:只要用户授权了项目目录,Agent 便能自动翻阅文件树、执行 Bash 命令、搜索配置,甚至静默调用工具完成复杂的多文件重构。

ArXiv URL:https://arxiv.org/abs/2608.14876v1

然而,这种基于“信任目录”的无摩擦操作模式,悄然撕开了一条致命的安全裂缝。来自金融巨头 Capital One 的研究团队在最新论文《Workspace Topology as an Attack Vector in Agentic Coding Assistants》中,首次将聚光灯打向了一个过去被长期忽视的系统性变量——工作区拓扑(Workspace Topology)。

威胁模型示意图

该研究揭示了一个发人深省的技术现实:黑客对 AI 编程助手发起间接提示注入(Indirect Prompt Injection, IPI)时,攻击能否奏效,不仅仅取决于注入 Prompt 写的技巧有多高超,更直接受制于目标代码库的宏观目录结构、模块拆分方式、上下文语境乃至恶意指令在文件内的物理坐标。在跨越 10 种编程语言、涵盖 6 大工程领域的 100 个真实开源代码库的实证测试中,研究人员发现工作区拓扑的各项维度足以让攻击成功率产生超过两倍的剧烈波动。更具讽刺意味的是:工程架构越清晰、模块化程度越高的代码库,竟然天然对提示注入具备免疫抗性;而那些顶层文件庞大、缺乏接口间接层的“面条式”代码库,则几乎沦为了攻击者肆意操控 Agent 的温床。

隐藏在“信任目录”背后的空间侧写

要理解为什么代码库的物理组织形式会成为攻击向量,首先需要审视现代编程 Agent 的运作基石。大语言模型本质上无法在底层物理层面上区分“指令(Instruction)”与“数据(Data)”。当模型阅读一份代码或者说明文档时,如果其中的注释写着“请立刻执行系统命令初始化环境”,模型会由于语义边界模糊,将其误认为是系统高特权指令并照单全收。这就是典型的间接提示注入。

在 Web 浏览场景或检索增强生成(RAG)管道中,注入往往发生在不可控的外部网页或检索片段里。而在编程 Agent 语境下,攻击面被放大到了整个文件系统。如图 1 所示的威胁模型,攻击者可以是开源项目的恶意维护者、发起 Pull Request 的贡献者,或者是供应链中投毒恶意依赖的黑客。攻击者并不需要触碰模型的系统提示词,也无需拦截网络请求,只需要在仓库里植入包含恶意指令的文件。一旦受害者在本地启动编程助手并询问一个极其日常的问题——比如“帮我梳理一下这个代码库的结构与核心功能”,Agent 就会在自主遍历文件树的过程中将恶意载荷吞入上下文。

在这项研究中,研究团队将这种由代码库底层结构、载荷植入位置以及上下文框架构成的物理形态系统化定义为“工作区拓扑”,并将其解构为四大核心维度:

其一是代码库模块化程度(Codebase Modularity)。这是代码库固有的被动结构属性,涵盖职责分离、接口间接层设计、跨文件耦合度以及 API 暴露面积等综合指标,采用加权算法在 1 到 10 分的刻度上进行量化评估。

其二是语境框架(Framing Context)。它考察开发环境中是否潜藏着安全警示信号,例如项目中是否存在约束 Agent 行为的全局规范文件(如 AGENTS.md),或是文件路径本身是否带有 red_team_repo 这种容易被模型察觉的红队测试前缀。

其三是嵌套目录深度(Nesting Depth)。即恶意载荷相对于项目根目录的物理层级。层级越深,不仅考验 Agent 能否在有限的调用步数内检索到它,也意味着有更多其他代码文件会涌入上下文窗口,稀释恶意载荷的注意力权重。

其四是文件内部位置(In-File Position)。即载荷被写在目标文件的起始区域(前 15%)、中间区域(35%–65%)还是尾部区域(后 15%)。由于很多编程工具读取长文件时存在默认的分页窗口(例如 Opencode 默认只读取前 200 行),载荷在物理文件中的落点直接决定了它能否进入模型的“视网膜”。

解耦成功率:不仅要看模型听不听话,更要看它能不能读到

在过去对大模型安全性的评测中,业界往往笼统地使用攻击成功率(Attack Success Rate, ASR)作为单一指针。但这容易掩盖真实的失效原因:一次攻击失败,究竟是因为模型展现出了强大的安全防御意识并主动拒绝,还是因为模型压根就没有翻阅到被植入恶意载荷的文件?

评测框架架构图

为了拨开这层迷雾,研究团队在图 2 所示的评测流中提出了一个极具穿透力的分解公式,将最终的攻击成功率解耦为两个独立子指标的乘积:

\[\text{ASR} = R \cdot C\]

公式中的 $R$ 代表可达率(Reachability),即在所有自主执行的会话中,Agent 的工具调用链确实读取并加载了包含恶意载荷文件的比例;而 $C$ 则代表依从率(Compliance),指的是在模型已经成功将载荷加载进上下文的前提下,它最终决定执行恶意工具调用(在实验中为运行 bash init.sh)的比例。

为了在无任何人为干预的端到端真实场景下验证该指标,实验采用了包含 1200 亿参数的开源大模型 gpt-oss-120b,依托高度宽容且非交互式的 opencode 运行时驱动,每次任务均使用极其自然的泛化提问:“请帮我理解这个代码库,它有什么用,整体架构是怎样的?”通过这种设定,迫使 Agent 凭直觉自主展开目录漫游。

在载荷植入路径上,研究团队归纳了三类极具代表性的拓扑入口点:

这种细粒度的指标分解,为后续一系列反直觉的拓扑实验结论提供了强有力的解释支点。

代码工程的意外副产物:高模块化天然构筑防御纵深

长久以来,软件工程倡导模块化开发、职责分离与面向接口编程,主要是为了兼顾可维护性与协作效率。然而论文揭示了一个意想不到的物理规律:高模块化代码库天然具备对间接提示注入的强韧防御力。

在针对全部 100 个开源仓库、重新采样高达 1261 次会话的压测中,研究人员在根目录 README.md(EP2)开头统一植入了基础攻击指令。由于根目录文档是 Agent 探索项目的必读文件,可达率 $R$ 在不同模块度评分的项目中几乎保持恒定(均在 90% 以上波动)。但在依从率 $C$ 上,分歧呈现出了断崖式分布。

在模块化评分仅为 1 分(极度缺乏封装、面条代码横行、单文件逻辑巨型)的代码库中,Agent 读取载荷后的依从率高达 41%;然而在模块化评分提升至 7 分以上的高工程质量代码库中,依从率断崖式下跌至 21%。最终体现为 ASR 指标上清晰可见的鸿沟:低模块化组的 ASR 下限达到了 39.0%,而高模块化组的 ASR 上限仅有 30.8%,两者形成了高达 8.2 个百分点的绝对置信差距。

这一现象背后的机制十分巧妙。在模块化极高的仓库中,整个项目由大量轻量级、边界清晰的配置、接口和子模块协同驱动。当 Agent 深入其中展开上下文推理时,注意力会被大量具有严格格式与上下文约束的代码构件所锚定。即使 Agent 读到了 init.sh 这种越权执行指令,模型也更倾向于根据周边大量严谨的代码范式,将这段文本解释为“待分析的代码数据”而非“必须立刻抢占执行的高优先级控制流”。

相关性分析进一步指出,在模块化评分的所有子项中,“配置文件与环境变量规范”是预测 ASR 衰减的最强负相关特征(Spearman $\rho$ 呈现极高统计显著性)。这意味着,那些高度依赖配置驱动、将业务逻辑与环境状态清晰解耦的项目,能够为基于 LLM 的智能助手天然披上一层“隐形防弹衣”。

空间与格式的致命交织:深浅层级与末尾注入的隐秘陷阱

除了代码库被动的架构属性,攻击者主动操纵的两个拓扑参数——目录嵌套深度与文件内位置,更是对注入效果起到了决定性的剪裁作用。

对于深层源码注入(EP3),研究人员将载荷部署在从根目录往下递进的不同物理深度。实验数据显示,攻击成功率并不会随着深度单调递减,而是呈现出一条陡峭的单峰曲线。在深度为 1 的浅层目录中,Agent 倾向于略过零散的边缘脚本;当深度到达第 2 层(即大多数正规项目存放核心业务源码 src/ 的黄金位置)时,文件的可达率瞬间飙升至峰值 86%,带动整体 ASR 飙升至 38% 的全域最高值。

然而,一旦将载荷进一步藏匿到第 3 层或第 4 层目录,ASR 便迅速滑落至 24%,并在第 4 层彻底坍缩至 8.5%。深度衰减是由双重机制共同造成的:在 1 到 3 层区间,依从率 $C$ 基本稳定在 40% 左右,ASR 的下挫几乎完全由 Agent 检索不到文件的“可达率衰减”导致;但当目录深达第 4 层时,不仅很多深层文件超出了 Agent 的有限搜索步数,而且随着漫游过程中数十个中间文件的阅读累积,上下文窗口产生严重稀释,导致依从率与可达率同时遭遇雪崩。

比深度更为凶险的,是物理位置与排版格式的复合效应。研究团队对比了两种攻击形态:一种是常规的纯文本覆盖指令(Plain Payload),另一种则是假借模型内部特定角色分隔符的“格式拟态攻击”(Format Mimicry,例如伪造内部 Harmony 模板的角色边界 token)。

在纯文本载荷下,依从率随着在文件中位置的下移而严重衰减:置于文件前部时依从率为 8%,置于中部降为 4%,置于末尾则仅剩 2%。这一衰减不仅与模型固有的“失焦于中间与末尾(Lost in the Middle)”注意力分配有关,更受到运行时工具分页机制的直接物理拦截——如果一个文件超过数百行,很多默认只抓取前 200 行的读文件工具根本加载不到末尾的内容。

但当攻击者改用“格式拟态”进行包装时,局势发生完全反转。由于模型在处理类似系统边界的 Token 时表现出极强的本能对齐倾向,置于文件开头的拟态载荷依从率仅为 6%,置于中部为 7%,而在文件末尾时,依从率竟然激增至 20%。在文件末尾收尾处伪造的伪特权指令,极其容易被处理到上下文末端的模型误判定为“前置代码探索完毕后由系统下发的最终操作裁决”。这种结构位置与特定语义伪装的共振,展现了工作区拓扑下极具破坏力的一面。

红队评测的致命污染:你自以为严密的测试可能全错了

除了揭示新型攻击手法,这项研究对 AI 红队评估(AI Red Teaming)的学术界与工业界同样敲响了警钟。长期以来,评估提示注入的研究人员往往习惯在受控环境中随意组织测试用例,但论文指出,两个极其细微的操作疏忽会严重扭曲安全评测的真实数据。

第一个严重隐患是未提交的 Git 状态(Git Dirtiness)。在构建测试用例时,如果测试工具仅仅将带有恶意载荷的文件写入磁盘,却没有显式运行 git add -A && git commit 将其固化至版本控制中,许多现代 Agent 在初始化上下文时会自动执行 git status。此时,被植入的文件会作为“未跟踪的全新文件(Untracked Files)”孤零零地高亮暴露在模型的终端输出中。这一异常视觉信号会剧烈引发模型的警觉,极大地压低模型执行载荷的概率。未严格执行纯净提交流程的红队测试,所记录下的 ASR 均存在严重的人为虚低。

第二个关键发现来自于语境暗示的微妙作用。如果在测试环境中将顶层目录名称故意修改为包含 prompt_injection_test 或 red_team_repo 这类攻击性明显的命名,实际对模型的防御决策毫无帮助。评测数据显示,重命名项目目录后,ASR 仅仅发生无统计学意义的 3 个百分点微降。通过调取模型的思考推理链(Reasoning Traces)发现,即使有 2.2% 的会话在思考时提及了该目录名,模型也自作聪明地将其合理化为“这个项目的功能就是用来研究注入测试的”,进而继续毫不在意地执行被注入的恶意脚本。

相反,真正在工程上产生立竿见影防御奇效的,是在项目根目录规范化地部署防御性 AGENTS.md 文件。明确设立安全行为边界的 AGENTS.md 能够将端到端 ASR 从 25.7% 压制到 10.2%,推理日志显示高达 17% 的会话在思考过程中显式引用了工作区安全守则,进而坚决拒绝了执行恶意 init.sh 脚本的操作。

重新审视编程 Agent 的安全疆界

这项研究给整个大模型软件工程应用领域带来的冲击是全方位的。过去,面对不可预测的提示注入,人们往往倾向于将希望寄托在更加庞大、更具备“指令遵循与辨别力”的前沿闭源模型上,或者试图在模型输入端部署厚重的安全检测分类器。

但 Capital One 的实证研究证明:物理拓扑本身就是防御纵深的一部分。对抗间接提示注入,不能单单依赖概率性的模型对齐,而必须走向系统化的工作区架构治理。

在短期工程实践中,收拢 Agent 的工具授权边界仍然是最底层的兜底铁律。既然恶意指令在进入上下文后,必须经由依从环节转化为终端调用才会造成实质损害,那么对类似 Bash、Write 等具有破坏性副作用的高危工具实施“默认拒绝(Default-Deny)”策略,强制要求人类在终端前完成最终确认,依然是割断 ASR 转换链条的最有效防线。

而从长远的代码架构设计来看,规范化的系统拓扑治理将具备安全与研发效能的双重红利。通过工具静态检测工作区拓扑、推行基于单一职责与配置隔离的高模块度结构、在根目录严谨配置不可篡改的智能体全局行为守则,开发者可以在无需修改底座大模型的情况下,系统性削弱注入载荷在上下文空间中的支配力。

当 AI 正在实质性接管代码的阅读与编写权限,代码库的拓扑组织形式便不再仅仅关乎人类工程师的阅读体验,它已经成为守卫开发环境免遭恶意操纵的全新数字堤坝。