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.1 | 3.1.1 |
修复措施
- 升级到 graphql-modules 2.4.1 或 3.1.1(或更高版本)。
- 将 Singleton 服务重构为使用
Scope.Operation或Scope.Request,而不是Scope.Singleton。 - 移除 Singleton 服务中的
@ExecutionContext()使用,改为将上下文显式作为方法参数传递。
缓解步骤
- 识别 所有使用
@Injectable({ scope: Scope.Singleton })声明的服务。 - 检查 这些服务是否使用了
@ExecutionContext()装饰器。 - 升级 包:
npm install graphql-modules@latest # 或指定特定版本 npm install graphql-modules@2.4.1 # 适用于 2.x 系列 npm install graphql-modules@3.1.1 # 适用于 3.x 系列 - 重构 任何剩余的 Singleton 服务,使其采用非 Singleton 范围,或手动传递上下文。
- 验证 修复效果,运行 advisory 中提供的并行请求概念验证(PoC)。
参考资料
- GitHub Advisory: 官方 PoC,演示了带有异步解析器的竞争条件。
- 原始问题报告
- GraphQL Modules 文档
欲获取完整分析、交互式图表及更多细节,请参阅供应商网站上完整的 CVE‑2026‑23735 报告。