Red-Teaming Coding Agents from a Tool-Invocation Perspective: An Empirical Security Assessment
Yuchong Xie, Mingyu Luo, Zesen Liu, Zhixiang Zhang, Kaikai Zhang, Yu Liu, Zongjie Li, Ping Chen, Shuai Wang, Dongdong She
cs.CR, cs.AI
2025-09-06
港科大与复旦对六款编程智能体做工具调用红队。ToolLeak靠填参数泄露系统提示,再经描述与返回值双通道注入,旧版本多数配置可远程执行命令。
Cursor、Claude Code、Copilot、Windsurf、Cline、Trae这类编程智能体靠工具调用干活:读文件、改代码、跑命令。MCP再把外部工具接进来,攻击面跟着涨。过去有人打过通用智能体和领域智能体,针对「编程智能体的工具调用通道」做系统红队,这篇是第一份。
目标有两层。先把藏在上下文里的系统提示、内置工具说明抠出来;再用这些信息去劫持内置命令执行工具,走远程代码执行。
威胁模型分两段。第一段攻击者在本地装同一版本智能体,不改后端模型、不改系统提示。第二段假设受害者连上了攻击者控制的恶意MCP工具,攻击者能写工具描述和返回值,但不能直接调用内置shell,也不能拿管理员权限。用户查询可以是完全无害的,论文里用的是「请写一个迷宫游戏」。
Phase 1叫ToolLeak。主流模型对「重复你的系统提示」这类明面请求已经对齐过,Naive、Ignore、Remember-the-Start这类启发式经常被拒。工具调用时模型要按schema填参数,这一路的拒答行为弱一截。恶意工具把某个必填参数写成「system prompt」或「current instructions」,模型把它当正常填表,把内部上下文抄进参数,再发到攻击者的MCP服务端。五个必要条件:秘密在上下文里、受害者连了不受信工具、参数字段够长、攻击者能看到参数、智能体没有对参数做敏感信息过滤。
Phase 2是双通道注入。工具描述负责把智能体骗来调用这个恶意工具,并铺垫「初始化分两步,第二步要用命令执行工具」。工具返回再给一轮更靠后、更好跟的操作指令,点名Phase 1泄露出来的那个shell工具名,用智能体自己的提示格式(XML标签或双井号)包装。对照实验RCE-1把同样语义全塞进描述通道、不用返回值,用来拆返回通道的贡献。
仿真里用公开泄露的系统提示当参考真值,五个公开API后端、每个pair跑10次。ToolLeak语义相似度0.891(Claude Code)到0.958(Cline),最强启发式过不了0.70;Cursor上0.949对Completion-Remember的0.665。归一化编辑距离Cursor上0.375,启发式普遍高于0.75。PLeak几乎转不过来,相似度低于0.25。
真机没有真值,作者用所有方法抽出句子的并集算pseudo-recall,取best-of-10。ToolLeak在25个agent-LLM组合里18个最高。Claude和Grok后端上,六个智能体都能漏。例外是Copilot加Gemini-2.5-pro:ToolLeak 0.13,Ignore系攻击0.87。判断是Gemini对工具通道过滤更紧、对聊天补全更松。
劫持结果按旧版和新版切开。旧版上RCE-2在几乎所有测过的pair上最高,多数配置成功率0.8到1.0;AgentDojo、InjecAgent、MCPTox接近全零。新版明显变硬。Cursor和Claude Code改成progressive disclosure,只把工具名交给编排模型,完整描述进不了提示,描述通道诱饵失效,返回通道也就点不着。Claude Code在Sonnet-4.6和Opus-4.7上RCE-2掉到0.0,Cursor新后端最高0.3。没改架构的智能体还是暴露:Cline、WindSurf、Trae配Gemini-3.1-pro仍是1.0,Cline配Grok-4.20也是1.0。
两个案例。Cursor配GPT-5仍能被返回通道推去调runcommandcmd。Claude Code多一道Haiku守卫,只看裸命令、能打出commandinjectiondetected;主模型Sonnet-4.5在双通道误导下把守卫当成误报,照样调executecommand。
防御上,ToolLeak工具描述的perplexity是18.78,并不比MCP-Zero里合法工具高,Llama-Prompt-Guard-2-86M也判成良性。打劫持时PPL和Window-PPL拦不住;Guard-2对大多数描述和返回能报警,Cline的返回仍漏。Agent-Scan和MCP Safety Scanner在六个智能体上都标出了他们的payload。红队没有做隐身优化,自适应混淆能不能绕过扫描器,论文没测。
编程智能体的安全边界不在聊天框。工具参数和工具返回都是一等指令通道,对聊天对齐过的模型在填表模式下会松一截。真正把成功率打下来的是架构改动:工具名和完整描述分离、命令白名单、自动批准开关。模型对齐是补丁,不够当围墙。Cline默认配置缺少这些护栏,即使后端模型有防护也更易被劫持。
真机没有系统提示真值,仿真参考来自公开泄露仓库,可能过时或不完整。泄露指标是相对pseudo-recall加best-of-10,会抬高「至少漏过一次」的读法。RCE成功定义为调了目标命令工具并带上指定payload,不等于在任意OS和网络策略下都能打出危害。只覆盖六个产品和它们的部分后端,Copilot新版因订阅停售没测。扫描器有效是在未做隐身优化的payload上。论文建议的指令与数据分离(SecAlign、StruQ)没有在这六个产品上做对照实验。