CVE-2026-0621:MCP TypeScript SDK 中的事件循环拒绝服务

发布: (2026年1月15日 GMT+8 14:34)
4 min read
原文: Dev.to

Source: Dev.to

TL;DR

立即修补:升级到 @modelcontextprotocol/sdkv1.25.2

Identifier

CVE-2026-0621 (GHSA-8r9q-7v3j-jr4g)

Severity

8.7 – 高危

Affected Component

@modelcontextprotocol/sdk

Impact

  • 完全阻塞 Node.js 事件循环(拒绝服务)
  • 单线程 CPU 占用率 100 %
  • MCP 服务器整体宕机,导致工具调用失败并严重违反 SLO

Affected / Unaffected Versions

  • 受影响版本: = 1.25.2

Deployments at Risk

任何使用 TypeScript SDK 的 MCP 服务器(自托管或云端)。

Exploitation Prerequisites

  • 至少有一个使用展开变量(*,RFC 6570)的已注册资源模板
  • 公开可访问的 MCP 端点(无需身份验证)

Technical Details

Root Cause

UriTemplate 类中的灾难性回溯,具体表现为 partToRegExp() 函数。
在展开基于数组的 URI 模式时,SDK 会生成带有嵌套量词的正则表达式(例如,一个重复内部还有另一个重复)。如果输入几乎匹配但在最后一个字符失败,V8 正则引擎会遍历所有可能的排列,导致指数级时间复杂度。

Vulnerable Pattern

资源模板中的展开变量,例如:

{/ids*}

Attacker‑Controlled Input

包含大量分隔符(逗号)且最后一个字符不匹配的 URI,例如:

/resource/1,2,3,4,5,6,7,8,9,10X

Runtime Behavior

  • 每增加一个逗号,执行路径数量翻倍(2^n 复杂度)。
  • Node.js 单线程事件循环被完全阻塞。
  • 健康检查失败,服务器一直无响应直至进程被终止。

Indirect Prompt‑Injection Vector (2026 context)

  1. 攻击者在文档或网站中嵌入恶意指令。
  2. 大语言模型(LLM)读取该数据。
  3. 代理生成恶意的 ReDoS URI。
  4. MCP 服务器执行该 URI,绕过传统网络层防御。

Fix

  • 版本: @modelcontextprotocol/sdk@1.25.2
  • 提交: b392f02 – 正则生成硬化。
  • 变更: 否定字符集与分隔符互斥(例如 [^\ /]+[^\ /,]+),消除模糊回溯路径并强制线性时间评估。

Compatibility

向后兼容;无破坏性更改。

Upgrade Command

npm update @modelcontextprotocol/sdk

Mitigation & Best Practices

  • 审计模板: 搜索使用 * 修饰符的资源模板(例如 {?list*})。
  • WAF 控制: 对 MCP 端点进行速率限制,并标记包含过多重复分隔符的 URI。
  • 超时设置: 强制请求/工作线程超时(例如执行超过 500 ms 则中止)。
  • 资源隔离: 为 MCP 服务器设置严格的 CPU 配额,以防止宿主机层面的资源枯竭。
  • 对抗性测试: 在 CI/CD 流水线中为 URI 模板和代理生成的输入添加模糊测试。
  • 通用指南:
    • “可用性即安全性”:系统不可用即不安全。
    • 对待 LLM 生成的字符串应与原始用户输入同等审慎。
    • 任何将模板转换为可执行逻辑(正则、AST、查询计划器)的组件都是高风险入口点。

References

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...