#3834·zipkin

Zipkin HTTP 收集器经过 gzip 压缩的跨度可能耗尽 JVM 堆内存

作者: skadiscarlet创建于 2026年7月1日更新于 2026年7月1日
标签bug

技术细节

  • 触发形状: 通过 POST 一个有效的 Zipkin v2 JSON 扩展列表到 /api/v2/spans, 并设置 Content-Encoding: gzip 来扩展解压大小。
  • 根本原因摘要: 收集器解压并解析完整的扩展列表, 但没有有效的默认限制, 以控制解压大小、扩展数量或 gzip 比率。
  • 利用条件: HTTP 收集器可以匿名访问, gzip 允许, 且在 Zipkin 解码体之前, 解压大小/扩展数量不受限制。
  • 静态源: External POST /api/v2/spans 或 /api/v1/spans 体, 可选 Content-Encoding: gzip
  • 静态汇聚: ZipkinHttpCollector.validateAndStoreSpans 聚合请求, UnzippingBytesRequestConverter 解码 gzip, Collector.acceptSpans 解码 List<Span>

建议的补救措施

  • 在易受攻击的入口处添加请求体大小、对象数量、主题/作业/关键字数量、队列长度、活动线程数或聚合保留字节的硬限制。
  • 在执行昂贵的体读取、解压、JSON/Protobuf 解析、图像渲染、任务创建或状态保留之前, 强制验证身份和配额检查。
  • 为匿名或低权限的入口添加每个 IP、每个用户、每个令牌或每个客户端的速率和资源配额。
  • 尽可能早地返回 400/413/429, 并在拒绝后避免保留完整的请求体、负载或不完整的协议状态。

内容来源: openzipkin/zipkin