CVE-2024-21626 Docker容器逃逸漏洞

CVE-2024-21626 Docker容器逃逸漏洞

CVE-2024-21626

Snyk 在 Docker 引擎以及其他容器化技术(例如 Kubernetes)使用的 runc <=1.1.11 的所有版本中发现了一个漏洞。利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM

CVE-2024-21626原理

演示 1:通过docker build.您在这里看到的是docker build利用突破容器并通过任意读取(在本例中为主机的/etc/shadow文件)和写入(在本例中为创建文件DOCKER_BUILD_BREAKOUT)来访问主机文件系统。

CVE-2024-21626 Docker容器逃逸漏洞

演示 2:通过docker run.您在这里看到的内容展示了运行基于相同漏洞的恶意 Docker 映像如何同样导致 Docker 容器突破主机操作系统。

WORKDIR该漏洞是由于应用Dockerfile 中定义的指令时的操作顺序而发生的。WORKDIR定义 Dockerfile 创建的所有进程的初始工作目录,例如使用 指令在构建时执行的进程和使用或指令RUN在运行时执行的进程。在关闭特定特权主机目录文件描述符之前输入提供的目录。可以通过目录指定这些特权文件描述符之一作为 的参数,这会导致特权文件描述符即使在正常操作期间关闭文件描述符本身之后(在切换到 Dockerfile 定义的命令之前)仍然可以访问在构建或运行时。CMDENTRYPOINTchdir/proc/self/fd/chdir

在成功的攻击中,当前执行的进程确保当前目录是主机目录,并遍历主机目录结构以访问完整的主机根文件系统。默认情况下,访问权限与正在使用的容器化解决方案(例如 Docker Engine 或 Kubernetes)的访问权限相同。通常,这是 root 用户,因此可以从磁盘访问升级到实现完整的主机 root 命令执行。

CVE-2024-21626 Docker容器逃逸漏洞

docker公告

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

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

 名称受影响的版本
runc<= 1.1.11
BuildKit<= 0.12.4
Moby(Docker 引擎)<= 25.0.1 且 <= 24.0.8
Docker 桌面<= 4.27.0

仅当用户通过将恶意内容合并到构建过程中或从可疑映像运行容器(特别与 CVE-2024-21626 容器逃逸漏洞相关)来主动处理恶意内容时,这些漏洞才会被利用。潜在影响包括未经授权访问主机文件系统、损害构建缓存的完整性,以及在 CVE-2024-21626 的情况下,可能导致容器完全逃逸的情况。 

我们强烈敦促所有客户在可用更新发布后立即应用更新,从而优先考虑安全性。及时应用这些更新是保护您的系统免受这些漏洞影响并维护安全可靠的 Docker 环境的最有效措施。

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

如果您使用的是 runc、BuildKit、Moby 或 Docker Desktop 的受影响版本,请确保在修补版本可用后立即更新到最新版本(所有版本均不迟于 2 月 1 日发布,并在下表中链接):

 已修复版本
runc>= 1.1.12
BuildKit>= 0.12.5
Moby(Docker 引擎)>= 25.0.2 和 >= 24.0.9
Docker 桌面>= 4.27.1

缓解措施


如果您无法在发布后立即更新到不受影响的版本,请遵循以下最佳实践来降低风险: 

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

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

Docker 构建云

修复发布后,任何新的 Docker Build Cloud 构建器实例都将配备最新的 Docker Engine 和 BuildKit 版本,因此不会受到这些 CVE 的影响。 Docker 还将对任何现有的构建器实例进行逐步更新。

Docker 的安全性

在 Docker,我们知道为开发人员提供安全软件是痴迷于开发人员的一部分。我们感谢负责任地披露这些漏洞。如果您发现任何 Docker 产品中存在潜在的安全漏洞,请将其报告给[email protected]。有关 Docker 安全实践的更多信息,请参阅我们的网站

咨询链接

检测工具

Snyk 的新Helios 团队针对此漏洞构建了一个基于 eBPF 的运行时检测工具,可以在leaky-vessels-runtime- detector中找到该工具,该工具是在 Apache-2.0 许可证下发布的。 eBPF 是许多现代 Linux 内核中内置的常用检测机制。

该工具可以识别正在运行的容器,试图在底层基础设施上利用此漏洞,从而使底层主机面临风险。请注意,该工具无法阻止该漏洞的利用,只能警告该漏洞的暴露。

  1. 在https://github.com/snyk/leaky-vessels-dynamic- detector 克隆存储库
  2. 使用 构建 Go 二进制文件go build
  3. 使用以下命令在 CI 环境中运行检测器:sudo ./ebpf-detector

有关更多详细信息,请查看README.md文件。

cve-2024-21626-runc-process-cwd-container-breakout

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注