一个用于检查容器环境是否容易受到 CVE-2022-0492 影响的 容器逃逸 漏洞检查脚本。
2月4日,Linux 宣布了 CVE-2022-0492,一个内核中的新权限提升漏洞。
CVE-2022-0492 标志着控制组 (cgroups) 中的一个逻辑缺陷,而 cgroups 是 Linux 容器的基础构建块。此漏洞是近年来发现的最简单的 Linux 权限提升漏洞之一:Linux 内核错误地将一个特权操作暴露给了非特权用户。
幸运的是,大多数容器环境中的默认安全加固足以防止容器逃逸。运行了 AppArmor 或 SELinux 的容器受到保护。也就是说,如果你在没有按照最佳实践进行加固的情况下运行容器,或者授予了额外权限,你可能面临风险。“我是否受影响?”部分列出了易受攻击的容器配置,并提供了测试容器环境是否易受攻击的说明。
除了容器之外,该漏洞还允许没有 capabilities 的 root 主机进程,或拥有 CAP_DAC_OVERRIDE capabilities 的非 root 主机进程提升权限并获得所有 capabilities。这可能会使攻击者绕过某些服务使用的加固措施,这些服务通常会丢弃 capabilities 以尝试在发生入侵时限制影响。
CVE-2022-0492 是近几个月内第三个允许恶意容器逃逸的内核漏洞。在这三个漏洞中,使用 Seccomp 以及 AppArmor 或 SELinux 来保护容器就足以防止容器逃逸。
挂载 cgroupfs 需要当前 cgroup 命名空间所在用户命名空间中拥有 CAP_SYS_ADMIN 能力。默认情况下,容器运行时不具备 CAP_SYS_ADMIN,因此无法在初始用户命名空间中挂载 cgroupfs。但是,通过 unshare() 系统调用,容器可以创建新的用户和 cgroup 命名空间,在这些命名空间中它们拥有 CAP_SYS_ADMIN 能力,并且可以挂载 cgroupfs。

图 1 - 一个容器创建新的用户命名空间,在其中它将拥有 CAP_SYS_ADMIN 能力。
并非每个容器都能创建新的用户命名空间——底层主机必须启用非特权用户命名空间。例如,这在最近的 Ubuntu 发行版中是默认启用的。由于 Seccomp 会阻止 unshare() 系统调用,只有未运行 Seccomp 的容器才能创建新的用户命名空间。截图中的容器在未启用 Seccomp、AppArmor 或 SELinux 的情况下运行。

图 2 - 容器在新的用户和 cgroup 命名空间中挂载了 memory cgroup。
在上面的截图中,容器成功挂载了一个 memory cgroup,但您可能会注意到 release_agent 文件并不在挂载的目录中!
如前所述,release_agent 文件仅在根 cgroup 中可见。在 cgroup 命名空间中挂载 cgroupfs 的一个限制是,您挂载的是自己所属的 cgroup,而不是根 cgroup。

图 3 - 容器在新的用户和 cgroup 命名空间中挂载了根 RDMA cgroup。
为了利用该漏洞,我们需要将一个恶意的 release agent 写入 release_agent 文件。如上图 图 3 所示,该文件属于 root,因此只有 root 容器进程才能设置 release agent。图 4 显示了容器设置 release agent,而 图 5 显示非 root 容器无法执行此操作。

图 4 - root 容器设置 release agent。

图 5 - 非 root 容器无法设置 release agent。
逃逸的最后一步是调用配置好的 release_agent,这一步不需要任何权限。由于这一步总是可行的,因此它不影响环境是否容易受到 CVE-2022-0492 的攻击,我们决定将其省略。您仍然可以在下面的截图中看到完整的漏洞利用方式。

图 6 - 通过用户命名空间利用 CVE-2022-0492 进行容器逃逸。
除了创建新的用户和 cgroup 命名空间之外,如果容器被授予了 CAP_SYS_ADMIN 能力,还可以使用更简单的漏洞利用方式。拥有 CAP_SYS_ADMIN 能力的容器被允许挂载 cgroupfs,无需任何额外检查。另外,如今大多数容器运行时不使用 cgroup 命名空间,这意味着挂载的 cgroup 将是根 cgroup,其中包含 release_agent 文件。

图 7 - 在初始 cgroup 命名空间中,无论容器的 cgroup 是什么,挂载 cgroupfs 总是会挂载根 cgroup。
即使拥有 CAP_SYS_ADMIN 能力,AppArmor 和 SELinux 仍然会阻止挂载,因此运行了其中任何一种的容器都无法利用 CVE-2022-0492。图 8 显示了一个没有运行 AppArmor 和 SELinux、但拥有 CAP_SYS_ADMIN 能力的容器,利用 CVE-2022-0492 成功逃逸。

图 8 - 通过 CAP_SYS_ADMIN 能力利用 CVE-2022-0492 进行容器逃逸。
CVE-2022-0492 是另一个可被用于容器逃逸的 Linux 漏洞。幸运的是,遵循最佳实践的环境可以免受此漏洞的影响。安全控制松懈的环境如果托管的容器不受信任或公开暴露,则面临高风险。与以往一样,最好将主机升级到已修复的内核版本。
我们强烈建议运行容器时启用 Seccomp 以及 AppArmor 或 SELinux,以防范此漏洞以及未来的 Linux 零日漏洞。Linux 内核中的许多权限提升漏洞只有在容器被允许创建新的用户命名空间(换句话说,容器在未启用 Seccomp 的情况下运行时)才能被用于容器逃逸。
© 2022 - 不是 Sofiane Hamlaooui - 让世界变得更美好 🌎