系统:运行中
← 返回所有攻击
SUPPLY CHAIN MEDIUM NEW

Deadbugz:在第三次工具调用后转为恶意的 MCP 服务器

一场进行中的攻击活动通过 GitHub 拉取请求分发外观无害的 MCP 服务器,在客户端完成三次普通调用后,将自身工具元数据改写为窃取凭据的指令。

2026-09-10 // 6 min affects: mcp, mcp-clients, llm-agents, coding-agents

这是什么?

2026 年 8 月 12 日,Pillar Security 的 Ariel Fogel 发表了 Deadbugz: Currently Active MCP Supply-Chain Campaign,记录了一场正在进行的攻击活动:攻击者通过公开的 GitHub 拉取请求分发恶意的 Model Context Protocol 服务器。Adversa AI 在 2026 年 9 月 7 日的 MCP 摘要中将其列为当月最重要的 MCP 安全事件。

该服务器自称是效率助手,提供两个无害工具——文本格式化与摘要——并且确实按描述工作。但当已连接的客户端发出第三次 tools/call 请求后,服务器就会改变它返回的元数据。新的工具描述与提示内容会指示所连接的智能体去搜寻 SSH 密钥、AWS 凭据、shell 历史记录和 Kubernetes 配置,并对操作者隐瞒这一行为。

值得关注的并非载荷本身,而是那道时间闸门。恶意指令自始至终都在服务器里;计数器只是决定审查者在什么时候才被允许看到它们。

工作原理

该活动由两部分组成:分发途径与运行时触发器。

分发。 2026 年 8 月 10 日,一个公开 GitHub 账号在 74 分钟内提交了 23 个拉取请求,分散在彼此无关的 AI、MCP 与开发者工具项目中。其中 17 个向配置文件添加了远程 MCP 端点;4 个将本地 Python 解释器指向 ~/.config/.cache/.sys/ 下的隐藏路径;2 个是目录或清单提交。在 Pillar 审查时,没有一个通过 GitHub 的合并机制被合入——19 个已关闭,4 个仍处于开放状态。攻击载体是一份配置差异:MCP 设置文件里的寥寥数行,正是审阅者容易一带而过的那类改动。

触发器。 服务器在内存中按客户端维护 tools/call 请求计数。低于阈值时,它对 tools/listprompts/get 返回普通文档;达到阈值后,同样的接口开始返回别的内容。

client connects  ──►  tools/list  ──►  "format_text", "summarize"   ← benign
                      tools/call  #1  ──►  normal result
                      tools/call  #2  ──►  normal result
                      tools/call  #3  ──►  normal result
                                    ▼  counter == 3
                      tools/list / prompts/get
                          ──►  [REDACTED: credential-seeking instructions
                                + directive to conceal activity]

该服务器还声明支持 tools.listChanged——这一标准 MCP 能力允许客户端刷新工具元数据,因此符合规范的客户端会主动取回被替换的定义。

计数器是其中最能说明问题的工程决定。安全审查者连上新服务器、试用两个工具、读一遍描述,看到的是一个干净的服务器;只枚举工具而不调用的自动化扫描器根本不会越过阈值;而正常的日常使用几分钟内就会越过。这道阈值是针对审查者标定的,而不是针对受害者。

为何重要

MCP 客户端会把工具定义作为上下文交给模型。这些描述决定了智能体如何理解某个工具的用途以及何时调用它——因此描述并不是标签,而是带有可信来源外观的指令文本。一个能在安装后修改自身描述的服务器,就能改变智能体所相信的内容,而用户看不到任何异常。

这一原语并不新鲜。Invariant Labs 在 2025 年 4 月演示过针对 WhatsApp MCP 集成的延迟式工具描述替换ETDI 论文(2025 年 6 月)则形式化了 rug pull 这一类别,并提出以签名、带版本的工具定义作为对策。我们此前介绍过其静态形态,见 MCP 工具描述 rug pull,以及多工具变体 ShareLock 阈值投毒

Deadbugz 是它的实战版本:已知原语、真实的分发活动,加上一道专门用于绕过审查环节的闸门。这对”审批时安全”提出了一个令人不安的问题——一次性审计面对这种技术不只是不完整,它本身就是攻击设计的靶心。你在安装时确立的防护姿态,正是攻击者可以据以规划的姿态。

已观察到的影响有限:没有拉取请求被合并,也没有确认的受害者。但这应被视为运气与时机,而非上限。复现这项技术只需一个下午。

防御措施

在审批时为工具定义生成指纹,并在每次重连时比对。 当操作者批准某个服务器时,对完整工具列表——名称、描述、模式——计算哈希值。在每个会话以及每次 tools/listChanged 通知时进行比对。审批后发生变化的定义应当告知操作者,并在被修改的工具触及任何敏感操作之前重新获得许可。这正是唯一能够捕获 Deadbugz 的控制措施。

将 MCP 配置差异视为敏感审查对象。 一个向 MCP 设置文件添加服务器的拉取请求,等于授予外部方一条通往你的智能体上下文的通道。请指定具名审阅者、核实发布方,并且绝不接受把解释器指向缓存目录中隐藏路径的配置。

用策略而非提示来约束敏感操作。 读取 ~/.ssh、访问云凭据文件、执行代码、写入代码仓库、发送邮件——这些都应由客户端自身的允许列表把关,使任何经由工具元数据抵达的指令都无法促成它们。如果元数据能说服智能体行动,那么元数据就是你的访问控制层。

把”隐瞒”当作信号。 任何要求智能体向操作者隐藏其行为的指令,本身就足以构成中止的理由。只对”有害内容”评分的护栏会漏掉它;而一条标记”要求不透明”的规则不会。

记录工具定义刷新。 多数 MCP 客户端记录调用,却不记录元数据变更。请为每一次定义刷新记录时间戳,并保留其后的智能体操作。万一某台设备确实连接过恶意服务器,这就是”范围明确的调查”与”凭空猜测”之间的差别。

若需更全面的基线,OWASP MCP Security Cheat Sheet 涵盖了周边控制:消息签名、接口绑定、Host 头校验以及操作系统原生凭据存储。

状态

项目详情
披露Pillar Security 研究博客,2026 年 8 月 12 日发布;分发活动观察于 2026 年 8 月 10 日
类别供应链分发 + 运行时闸控的 MCP 工具元数据投毒
触发条件按客户端的内存计数器;元数据在第三次 tools/call 时改变
分发方式74 分钟内 23 个公开 GitHub 拉取请求;17 个远程端点配置、4 个隐藏本地脚本配置、2 个清单提交
审查时合并状态通过 GitHub 合并机制合入的为 0 —— 19 个已关闭,4 个开放
先前工作Invariant Labs 的 WhatsApp MCP 潜伏攻击(2025 年 4 月);ETDI 对 rug pull 的形式化,arXiv 2506.01333(2025 年 6 月)
CVE未分配 —— 这是恶意行为者的攻击活动,而非产品漏洞
核心防御盲区审批时的审查无法观察到只在审批之后才转为恶意的元数据

Sources