OTel Collector confighttp 和 configgrpc 中的安全漏洞 (CVE-2024-36129)

博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。

在我们迈向毕业的过程中,OpenTelemetry 项目目前正在接受由 CNCF 赞助、由 OSTIF 协助、并由 7ASecurity 进行的安全审计。在此过程中,我们收到了一些关于我们可以做得更好的建议,例如在准备 OpenTelemetry Collector 二进制文件时使用特定的编译器标志。2024 年 5 月 31 日,我们收到了一份更严重的报告:恶意用户在使用特制 HTTP 或 gRPC 请求时可能导致拒绝服务 (DoS)。该公告被分配了以下 CVE 标识符:CVE-2024-36129。

在发送带有压缩负载的 HTTP 请求时,Collector 只会验证压缩负载是否超出某个限制,而不会验证其未压缩的版本。恶意负载随后可能会发送一个“压缩炸弹”,导致 Collector 崩溃。

类似地,在使用 zstd 压缩发送 gRPC 请求时,解压缩机制将不会遵守 gRPC 施加的限制,也会导致 Collector 在解压缩恶意负载时崩溃。

报告发出后几个工作小时,即 2024 年 6 月 3 日,Collector 开发人员能够重现与 HTTP 相关的报告,并协同工作进行了修复,该修复于当天合并。考虑到此问题的严重性,我们决定推迟原定于当天进行的发布,而是于 2024 年 6 月 4 日完成发布

发布后,我们收到了确认 gRPC 和 zstd 也受到影响。在确认后几个工作小时内,我们进行了修复,该修复也于当天合并我们紧接着发布了 v0.102.1

我受到影响吗?

如果您拥有一个 OpenTelemetry Collector,并且该 Collector 在公共端口上启用了 HTTP 或 gRPC 接收器,例如启用了“HTTP”或“gRPC”协议的 OTLP 接收器(通常分别为端口 4318 和 4317),并且接收器版本低于或等于 0.102.0,那么您将受到此漏洞的影响。该漏洞仅能被能够向您的 HTTP/gRPC 端点发送负载的攻击者利用。这通常意味着该端口需要暴露给公共互联网或攻击者可访问的另一个网络段。

请注意,如果您需要身份验证,攻击者需要拥有有效的凭据才能利用 HTTP 协议的漏洞。对于 gRPC,可利用的代码在身份验证之前执行。

这对我意味着什么?

如果您管理着一个与公共互联网有接口的 Collector,您应尽快升级它,并考虑为 HTTP 接收器(如 OTLP 接收器)设置 max_request_body_size 参数,使其值适合您的工作负载。在 v0.101.0 之前,此设置仅适用于客户端发送的负载大小,而这些负载通常可以被压缩。

从 v0.102.0 开始,此设置适用于未压缩、压缩和解压缩的负载大小,我们将为此设置默认值 20 MiB。此新默认值是一个破坏性变更,因为发送超过 20 MiB 负载的客户端将开始看到错误。虽然我们认为大多数有效请求都会远低于此限制,但在更新后监控您的 Collector 以了解错误率是否增加仍然是明智的。以下是一个为该字段设置不同限制的配置示例:

receivers:
  otlp:
    protocols:
      http:
        endpoint: localhost:4318
        max_request_body_size: 10485760 # 10 MiB

对于 gRPC 接收器,升级到 v0.102.1 即可,因为消息大小已应用默认值:4 MiB。

如果您的 Collector 实例仅接收来自受信任客户端(如您自己的应用程序)的数据,我们仍然鼓励您升级到最新的 Collector 版本,但您可以按常规节奏进行。

如果您正在使用自定义分发版并使用 OpenTelemetry Collector Builder (ocb) 进行构建,您可以添加一个 “replaces” 条目,指向最新版本的 confighttpconfiggrpc Go 模块。如果您的基础 Collector 版本高于或等于 v0.96.0,我们预计仅通过更新到最新版本不会出现任何兼容性问题。

经验教训

在此过程中,我们发现 Collector 的遥测以及我们为 Collector 管理员提供的选项存在一些不足。具体来说,我们注意到我们没有好的方法来验证 Collector 收到的请求大小分布,这对于确定更改是否会破坏给定 Collector 的客户端将很有用。我们还注意到我们没有提供一种方法让管理员完全禁用压缩,这将是在不升级 Collector 的情况下缓解攻击的好方法。我们正在努力在接下来的几个版本中填补这些空白。

我们还致力于稳定 component.UseLocalHostAsDefaultHost 功能门,以默认减少所有 Collector 端点的暴露。此功能门是由之前 Go 标准库中类似的漏洞激发的,并且已经处于 alpha 状态数月。您可以关注关于稳定性的讨论,请参见 issue 8510

致谢

此问题由 7ASecurity 的 Miroslav Stampar 发现。我们要感谢 7ASecurity 对此漏洞的负责任报告。