Docker 安全公告

Docker 安全预警:runc、BuildKit 和 Moby 中的多个漏洞

最后更新时间:2024 年 2 月 2 日

Docker 优先考虑软件的安全性和完整性以及用户的信任。 Snyk Labs 的安全研究人员发现并报告了容器生态系统中的四个安全漏洞。其中一个漏洞 CVE-2024-21626涉及 runc 容器运行时,其他三个漏洞影响 BuildKit( CVE-2024-23651CVE-2024-23652CVE-2024-23653)。我们希望向社区保证,我们的团队与记者和开源维护者合作,一直在努力协调和实施必要的补救措施。

我们致力于维持最高的安全标准。我们已于 1 月 31 日发布了 runc、BuildKit 和 Moby 的修补版本,并于 2 月 1 日发布了 Docker Desktop 的更新来解决这些漏洞。此外,我们最新的 BuildKit 和 Moby 版本还包括对 CVE-2024-23650CVE-2024-24557的修复,这些修复分别由独立研究人员和 Docker 的内部研究计划发现。

受影响的版本
runc<= 1.1.11
BuildKit<= 0.12.4
Moby (Docker Engine)<= 25.0.1 且 <= 24.0.8
Docker Desktop<= 4.27.0

如果我使用的是受影响的版本,我该怎么办?

如果您使用的是 runc、BuildKit、Moby 或 Docker Desktop 的受影响版本,请确保更新到下表中链接的最新版本:

修补版本
runc>= 1.1.12
BuildKit>= 0.12.5
Moby (Docker Engine)>= 25.0.2和 >= 24.0.9
Docker Desktop>= 4.27.1

如果您无法及时更新到不受影响的版本,请遵循以下最佳实践来降低风险:

  • 仅使用受信任的 Docker 镜像(例如 Docker 官方镜像)。
  • 不要从不受信任的来源或不受信任的 Dockerfile 构建 Docker 映像。
  • 如果您是使用 Docker Desktop 的 Docker Business 客户并且无法更新到 v4.27.1,请确保启用 Hardened Docker Desktop功能,例如:
  • 对于 CVE-2024-23650、CVE-2024-23651、CVE-2024-23652 和 CVE-2024-23653,请避免使用来自不受信任来源的 BuildKit 前端。前端镜像通常被指定为 Dockerfile 上的 #syntax 行,或者--frontend在使用buildctl build命令时带有标志。
  • 要缓解 CVE-2024-24557 的影响,请确保在构建映像时使用 BuildKit 或禁用缓存。在 CLI 中,这可以通过DOCKER_BUILDKIT=1环境变量(如果安装了 buildx 插件,则默认为 Moby >= v23.0)或--no-cache flag.如果您直接或通过客户端使用 HTTP API,则可以通过将/build API 端点设置 nocachetrueversionto 来完成相同的操作。2

技术细节和影响

CVE-2024-21626(高)

在 runc v1.1.11 及更早版本中,由于某些泄漏的文件描述符,攻击者可以通过导致新生成的容器进程(来自runc exec)在主机文件系统命名空间中拥有工作目录,或者通过欺骗用户运行恶意映像并允许容器进程通过runc run.这些攻击还可以覆盖半任意主机二进制文件,从而实现容器的完全逃逸。请注意,当使用更高级别的运行时(例如 Docker 或 Kubernetes)时,可以通过运行恶意容器映像而无需额外配置或在启动容器时传递特定的 workdir 选项来利用此漏洞。对于 Docker,还可以从 Dockerfile 中利用该漏洞。

该问题已在 runc v1.1.12 中修复。

CVE-2024-23651(高)

在 BuildKit <= v0.12.4 中,并行运行的两个恶意构建步骤与子路径共享相同的缓存挂载可能会导致竞争条件,导致构建容器可以访问主机系统中的文件。仅当用户尝试构建恶意项目的 Dockerfile 时才会发生这种情况。

该问题已在 BuildKit v0.12.5 中修复。

CVE-2024-23652(高)

在 BuildKit <= v0.12.4 中,恶意的 BuildKit 前端或 Dockerfile 使用RUN --mount可能会欺骗删除为挂载点创建的空文件的功能,从而从主机系统中删除容器外部的文件。仅当用户使用恶意 Dockerfile 时才会发生这种情况。

该问题已在 BuildKit v0.12.5 中修复。

CVE-2024-23653(高)

除了作为构建步骤运行容器之外,BuildKit 还提供用于运行基于构建镜像的交互式容器的 API。在 BuildKit <= v0.12.4 中,可以使用这些 API 来要求 BuildKit 以提升的权限运行容器。通常,只有security.insecure在 buildkitd 配置启用特殊权利并且初始化构建请求的用户允许的情况下,才允许运行此类容器。

该问题已在 BuildKit v0.12.5 中修复。

CVE-2024-23650(中)

在 BuildKit <= v0.12.4 中,恶意 BuildKit 客户端或前端可能会生成一个请求,导致 BuildKit 守护进程因恐慌而崩溃。

该问题已在 BuildKit v0.12.5 中修复。

CVE-2024-24557(中)

在 Moby <= v25.0.1 和 <= v24.0.8 中,如果镜像是从头构建的,经典的构建器缓存系统很容易出现缓存中毒。此外,对某些指令(最重要的是HEALTHCHECKONBUILD)的更改不会导致缓存未命中。了解某人正在使用的 Dockerfile 的攻击者可能会通过拉取特制的映像来毒害他们的缓存,该映像将被视为某些构建步骤的有效缓存候选者。

该问题已在 Moby >= v25.0.2 和 >= v24.0.9 中修复。

Docker 产品受到什么影响?

Docker 桌面

Docker Desktop v4.27.0 及更早版本受到影响。 Docker Desktop v4.27.1 于 2 月 1 日发布,包含 runc、BuildKit 和 dockerd 二进制补丁。除了更新到这个新版本之外,我们还鼓励所有 Docker 用户勤奋使用 Docker 映像和 Dockerfile,并确保在构建中仅使用可信内容。

与往常一样,您应该在更新之前检查您的操作系统( WindowsLinuxMac)的 Docker Desktop 系统要求,以确保完全兼容性。

Docker 构建云

任何新的 Docker Build Cloud 构建器实例都将配备最新的 Docker Engine 和 BuildKit 版本,因此不会受到这些 CVE 的影响。现有的 Docker Build Cloud 构建器也已推出更新。

没有其他 Docker 产品受到这些漏洞的影响。

Text4Shell CVE-2022-42889

最后更新时间:2022 年 10 月

CVE-2022-42889已在流行的 Apache Commons Text 库中发现。该库的 1.10.0 及以下版本均受此漏洞影响。

我们强烈建议您更新到 Apache Commons Text的最新版本。

扫描 Docker Hub 上的镜像

2021 年 10 月 21 日 1200 UTC 后触发的 Docker Hub 安全扫描现在可以正确识别 Text4Shell CVE。在此日期之前的扫描当前不反映此漏洞的状态。因此,我们建议您通过推送新镜像到Docker Hub来触发扫描,以查看漏洞报告中Text4Shell CVE的状态。有关详细说明,请参阅 扫描 Docker Hub 上的映像

受 CVE-2022-42889 影响的 Docker 官方镜像

许多 Docker 官方镜像包含 Apache Commons Text 的易受攻击版本。以下列出了可能包含存在漏洞的 Apache Commons Text 版本的 Docker 官方镜像:

我们已将这些图像中的 Apache Commons Text 更新到最新版本。其中一些图像可能由于其他原因而不易受到攻击。我们建议您还查看上游网站上发布的指南。

Log4j 2 CVE-2021-44228

最后更新时间:2021 年 12 月

Log4j 2(一种非常常见的 Java 日志记录库)中的Log4j 2 CVE-2021-44228漏洞允许远程执行代码,通常是从攻击者易于访问的上下文中执行。例如,它在《我的世界》服务器中被发现,允许将命令输入到聊天日志中,然后将这些命令发送到记录器。这使得它成为一个非常严重的漏洞,因为日志库被广泛使用并且很容易被利用。许多开源维护者正在努力修复和更新软件生态系统。

Log4j 2 的易受攻击版本是版本 2.0 到版本 2.14.1(含)。第一个修复版本是2.15.0。如果可以的话,我们强烈建议您更新到 最新版本。如果你使用的是2.0之前的版本,你也不容易受到攻击。

如果您使用这些版本,您可能不会受到攻击,因为您的配置可能已经缓解了这一问题,或者您记录的内容可能不包含任何用户输入。然而,如果不了解可能详细记录的所有代码路径以及它们可能从哪里获取输入,这可能很难验证。因此,您可能希望使用易受攻击的版本升级所有代码。

CVE-2021-45046

作为CVE-2021-44228的更新 ,版本 2.15.0 中所做的修复不完整。已发现其他问题并通过 CVE-2021-45046CVE-2021-45105进行跟踪。为了更完整地修复此漏洞,我们建议您尽可能更新到 2.17.0。

扫描 Docker Hub 上的镜像

2021 年 12 月 13 日 1700 UTC 后触发的 Docker Hub 安全扫描现在可以正确识别 Log4j 2 CVE。在此日期之前的扫描当前不反映此漏洞的状态。因此,我们建议您通过推送新镜像到Docker Hub来触发扫描,以查看漏洞报告中Log4j 2 CVE的状态。有关详细说明,请参阅 扫描 Docker Hub 上的映像

受 Log4j 2 CVE 影响的 Docker 官方镜像

最后更新时间:2021 年 12 月

许多 Docker 官方镜像包含 Log4j 2 CVE-2021-44228 的易受攻击版本。下表列出了可能包含存在漏洞的 Log4j 2 版本的 Docker 官方镜像。我们将这些镜像中的 Log4j 2 更新到了最新版本。其中一些图像可能由于其他原因而不易受到攻击。我们建议您还查看上游网站上发布的指南。

存储库补丁版本附加文档
沙发底座7.0.3沙发基地博客
弹性搜索6.8.22、7.16.2Elasticsearch公告
弗林克1.11.6、1.12.7、1.13.5、1.14.2Flink 关于 Log4j CVE 的建议
地理网络2010年3月10日地理网络 GitHub 讨论
光流者等待信息等待信息
日志存储6.8.22、7.16.2Elasticsearch公告
新4j4.4.2Neo4j 公告
索尔8.11.1Solr 安全新闻
声纳库8.9.5、9.2.2SonarQube 公告
风暴等待信息等待信息

笔记

尽管 xwiki图像可能被某些扫描仪检测为易受攻击,但作者认为这些图像不会受到 Log4j 2 CVE 的攻击,因为 API jar 不包含该漏洞。Nuxeo映像 已弃用并且不会更新。