0x00 前言
本周发布了 Linux 内核中的新 CVE。CVE-2022-0847,又名“脏管道”,是一个漏洞,允许 Linux 系统上的用户覆盖他们可以读取但不应写入的文件内容。从使用 Docker 等容器化软件的主机的角度来看这个漏洞,可以从主机上的容器镜像、从容器内部修改文件——这通常是不可能的。
这可能使攻击者能够有效地修改针对共享映像运行的容器,或者毒害主机上的映像,以便新容器接收修改后的文件。
为缓解此问题,受影响的系统(运行 Linux 内核 5.8 或更高版本的系统)应立即进行修复。
0x01 漏洞细节
披露该漏洞的页面具有详细信息和丰富的背景,因此我们将在这里从容器的角度关注其影响。
现代容器化的一个重要部分是使用覆盖文件系统,其中使用共享的只读映像来创建正在运行的容器。当容器内的用户从底层图像修改文件时,应将原始文件复制到特定于该容器的新位置,并在那里应用修改。原始文件应保持不变。
使用 Max Kellermann 在他的博客中提供的漏洞利用,我们可以尝试修改底层系统上的文件,看看会发生什么。
运行 Docker 20.10.10 的 Ubuntu 21.04 系统,目前本地没有下载容器镜像

首先,我们基于ubuntu:21.04镜像启动一个容器,它将从Docker Hub拉取镜像的新副本。该漏洞应该适用于任何图像,但这是一个干净的基础。
然后,我们将复制我们的漏洞利用代码——只是原始漏洞披露博客中代码的编译版本——并尝试从底层图像修改文件。作为演示,我们将使用 /etc/shells。
最初,我们可以看到我们的文件包含预期的内容:

然后,我们运行我们的漏洞利用程序,尝试在文件顶部添加一个字符串“Hello World”。我们可以看到它更改了该容器中的文件,但这是意料之中的,因为我们是该容器中的 root 用户。

现在我们回到主机并基于相同的图像启动一个新容器。新容器应该不有修改过的文件:

我们可以清楚地看到我们修改过的文件,所以漏洞利用工作正常。
此漏洞利用也可能影响现有容器。例如,如果您的主机具有 10 个使用共享映像的 nginx 容器,并且攻击者将nginx.conf文件修改为一个,它也会立即更改其他文件中的文件,只要它们仍在使用该文件。
此漏洞的另一种情况是卷从主机安装为只读,因为攻击者可以使用此漏洞来覆盖该限制。
0x02 漏洞影响与修复
这个问题的严重程度取决于您的环境架构。要利用此问题,攻击者必须能够访问主机上的单个容器。如果他们具有该访问权限并且内核版本易受攻击,则他们可以修改用于创建他们有权访问的容器的映像中的任何文件,或者从底层主机只读挂载的任何文件。
当有许多容器使用共享映像文件运行并且不受信任的用户可以访问单个容器但不应该能够修改底层主机上的文件时,该问题可能会产生最大的影响。
与任何 Linux 内核漏洞一样,最好的建议是定期升级并在升级后重新启动主机,以确保补丁已生效。
原文链接:https://blog.aquasec.com/cve-2022-0847-dirty-pipe-linux-vulnerability