8月14号,arXiv 的 cs.CR 分类下面挂出来一篇15页的预印本,标题叫《Workspace Topology as an Attack Vector in Agentic Coding Assistants》。12个作者,第一作者是 Alexandre G.R. Day,已经被 CAMLIS 2026 接收。核心发现一句话能说完:你代码库长什么样,直接决定间接注入在你机器上能不能打穿。措辞是论文腔,内容不是。
论文把"工作区拓扑"拆成四个维度:目录深度、代码库模块化程度、文件内注入位置、上下文框架。然后对3种间接提示注入入口做了实证,跨了10种编程语言、6个工程领域的开源仓库。结果里最扎眼的一条:代码库模块化程度一变,攻击成功率跟着明显变。高模块化环境里,成功率显著低于低模块化的。就这一条,值得停下来想一想。
这个结果放在一大堆"注入防不住"的研究里,算个异数。它把问题从"模型到底分不分得清指令和数据"——这个问题吵了三年也没个结论——重新扭成了"你的项目怎么摆,决定了指令有没有地方藏"。论文等于递了个方向过来:不用指望模型更聪明,你可以把代码库摆成让指令没处藏的样子。
论文没把机制完全摊在桌面上,但按结果反推,链路不难猜。低模块化的仓库,文件之间没有隔离边界。agent 一次检索、一次工具调用,会把更多不相干的文件拉进上下文。你藏指令的那十行,混在四十个平铺文件里是一种藏法,混在十个按模块隔离的文件里是另一种。模块化本质上干的事,是把上下文切小了——每次让模型看到的东西更收敛,恶意指令混进正常代码里的概率就摊薄了。箭头画出来是这么一串:低模块化→单次检索拉更多文件进上下文→指令与数据的混合密度变高→模型对整块内容产生"这是项目数据"的信任→执行。链条不新鲜,新鲜的是变量居然在仓库结构上。
换成攻击者的思路——如果我要往你的仓库里埋雷,我肯定挑那个四十个文件平铺一层的货。同样的指令,放到一个高模块化的仓库里,可能压根不会被读进上下文;放到平铺仓库里,迟早会被哪一轮检索捞起来。你甚至不需要精心挑文件,多撒几个位置,总有一个会中。低模块化的仓库对攻击者来说,等于递了一份免费的地图:哪里文件多、哪里没有边界,一眼就看到了。
上下文框架这个维度,论文翻译得含糊,实际就是指 agent 工作时的可见窗口怎么搭的——MCP 工具挂在哪些目录上、单次搜索最多返回多少文件、system prompt 里塞了多少安全提示。这一条同样能改成功率,而且它比模块化好落地得多。顺着它想,安全提示的有效区间就清楚了:CLAUDE.md 里写一句"不要执行危险操作",能压低成功率,但压的是命中率,不是执行后的权限。提示拦不住已经走完的那一步工具调用。安全提示是延迟线,权限才是门锁。这句话我在别的场合说过,这篇论文等于补了一个定量证据——但也仅此而已。
这里我得小心别把论文结果过度外推。它测的是"引入上下文框架和安全提示后成功率的变化",不是"安全提示能顶得住多强的注入"。后者在它的数据里看不到答案,我不去瞎猜。想也知道,提示工程对间接注入的抵抗上限,取决于攻击者愿意堆多少密度去翻过去。成本可控,局面就不会逆转。
还有一处,可能是我读这篇论文最在意的地方。它在方法论里用了相当短的篇幅强调:要拿到可靠结论,必须用无污染的测试环境。这句话放纸面上像常识,但做过注入研究的人都知道,这多半是每次开实验时先违反、后补的那条。上下文一旦被污染过,上一轮的指令尾巴会跟这一轮的搅在一起,测出来的成功率里有多少是测量噪声,根本说不清。这一篇把"干净环境"写成硬性条件而不是默认选项,就这一点,它在同类型工作里已经算老实人了。CAMLIS 能收它,评审里估计有人专门盯着这一条在审。
回头看,这个结果我第一眼差点当成标题党——"代码库结构影响注入成功率",听着就像安全圈又造了个新概念。细看触发条件才把判断收拢:模块化是真实变量,但它跟一般的漏洞不一样,它不是一个你修不修的问题,是一个你怎么取舍的问题。它降低的是命中率,不是泄漏半径。注入只要命中一次,从高模块化仓库里拿出来东西,跟从低模块化仓库里拿出来的没有区别。你防的是单次成功,它防不了"多试几次"。所以论文的结论,我不打算直接翻译成"把代码库拆了"这种行动。
落到你能做的事上,排一下优先级:
1. 别为这一篇论文重构代码库。 模块化程度是有效变量,但它排在权限边界后面。一个低模块化仓库配一个最小权限的 agent,和一个高模块化仓库但 agent 能读全仓库 secrets——后者照样打穿,只是攻击者要多费一轮检索的事。先管好后面那条线。
2. 能立刻做的是收上下文。 限制单次检索返回的文件数量、按模块挂载 MCP 工具、把不相关的目录从 agent 的可见范围里摘出去。这几件事一天内能做完,而且直接对应论文里"上下文框架"那个维度的变量。成本极低,效果比在提示里多写三句"请注意安全"实在得多。
3. 安全提示照写,但心里要清楚它是延迟线。 "不要执行危险操作"这类句子不亏,加在 CLAUDE.md 里也没坏处。但它给攻击者加的成本是有限的,不是把路封了。每多一句提示,只是让埋雷的人多写几行指令来对冲,仅此而已。
4. secrets 不落地这条永远是前提。 放在清单最后不是因为不重要,是因为它不是跟前面几条并列的——注入打穿了,攻击者掏出来的兜里如果什么都没装,这一单就算白干。这条断的是整笔生意的经济账。
这篇论文留给你的不是一个需要连夜处理的新漏洞,是每次调整代码库结构时多问一句的名单:这个目录摆法,是在给 agent 省检索费,还是在给攻击者省埋雷费。周末有空,挑个低模块化仓库自己打一遍靶,10分钟的事。结论不会让你意外,但会让你对"模块化"这三个字多一点尊重——它不只是工程整洁度的问题,它已经在攻击面里坐了一把交椅了。
排雷记录:工作区拓扑是真实变量,但重要性排在权限和密钥后面。先收上下文,再谈重构。