CVE-2026-0621:MCP TypeScript SDK 中的事件循环拒绝服务
发布: (2026年1月15日 GMT+8 14:34)
4 min read
原文: Dev.to
Source: Dev.to
TL;DR
立即修补:升级到 @modelcontextprotocol/sdk 的 v1.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)
- 攻击者在文档或网站中嵌入恶意指令。
- 大语言模型(LLM)读取该数据。
- 代理生成恶意的 ReDoS URI。
- 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
- NVD Advisory: CVE‑2026‑0621
- Upstream Issue: GitHub Issue #965
- Fix Pull Request: GitHub PR #1365
- Disclosure Date: January 6 2026
- Patch Release Date: January 6 2026