CVE-2026-23735:Singleton Roulette:在 GraphQL 模块中争夺上下文

发布: (2026年1月17日 GMT+8 08:03)
3 min read
原文: Dev.to

Source: Dev.to

概述

漏洞编号: CVE-2026-23735
CVSS 评分: 8.7(高)
发布时间: 2026-01-16

graphql-modules 库中存在一个关键的竞争条件。当在 Singleton(单例) 范围的服务内部使用 @ExecutionContext() 装饰器时,请求上下文可能会相互污染。这会导致一个用户的请求意外继承另一个并发请求的会话、身份验证令牌或其他数据。

技术细节

  • 根本原因: @ExecutionContext() 在单例服务中创建了共享的可变状态。在并发环境下,平行请求会相互覆盖对方的上下文数据,导致身份混淆和数据泄漏。
  • CWE: CWE‑362(竞争条件)
  • 攻击向量: 网络
  • 攻击复杂度:
  • 所需权限:
  • 用户交互:

受影响的包

包名受影响版本修复版本
graphql-modules>= 2.2.1 = 3.0.0 < 3.1.13.1.1

修复措施

  • 升级到 graphql-modules 2.4.13.1.1(或更高版本)。
  • 将 Singleton 服务重构为使用 Scope.OperationScope.Request,而不是 Scope.Singleton
  • 移除 Singleton 服务中的 @ExecutionContext() 使用,改为将上下文显式作为方法参数传递。

缓解步骤

  1. 识别 所有使用 @Injectable({ scope: Scope.Singleton }) 声明的服务。
  2. 检查 这些服务是否使用了 @ExecutionContext() 装饰器。
  3. 升级 包:
    npm install graphql-modules@latest
    # 或指定特定版本
    npm install graphql-modules@2.4.1   # 适用于 2.x 系列
    npm install graphql-modules@3.1.1   # 适用于 3.x 系列
  4. 重构 任何剩余的 Singleton 服务,使其采用非 Singleton 范围,或手动传递上下文。
  5. 验证 修复效果,运行 advisory 中提供的并行请求概念验证(PoC)。

参考资料

  • GitHub Advisory: 官方 PoC,演示了带有异步解析器的竞争条件。
  • 原始问题报告
  • GraphQL Modules 文档

欲获取完整分析、交互式图表及更多细节,请参阅供应商网站上完整的 CVE‑2026‑23735 报告。

Back to Blog

相关文章

阅读更多 »

介绍 graphql-complexity-validation

✨ 特性 - 零运行时依赖 - 完全类型化的 TypeScript - 支持 fragments 与 inline fragments - 默认忽略 Introspection 适用于: - Apollo…