CVE-2019-5736:runc容器逃逸漏洞预警

2019-02-13 09:11:10

漏洞背景

runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时。此次爆出的严重安全漏洞可使攻击者以 root 身份在主机上执行任何命令。

2 月 11 日,安全研究员 Adam Iwaniuk 和 BorysPopławski 发现了容器运行时 runC 的一个安全漏洞,这个漏洞可以让上述情况发生。Aleksa Sarai,SUSE 的容器高级软件工程师同时也是 runC 的维护者,纰漏了这个漏洞(CVE-2019-5736)。

 

漏洞详情

此次爆出的漏洞允许恶意容器覆盖主机上的 RunC 二进制文件,以在主机上获取 root 级别的代码执行,让攻击者能够以 root 身份运行任何命令。攻击方式是将容器中的目标二进制文件替换为返回的 runC 二进制文件,攻击者可以通过附加特权容器(将其连接到终端)或使用恶意镜像启动并使其自行执行。

但是 Linux 内核通常不允许在 runC 执行过程中主机上的 runC 二进制文件被覆盖。这时候攻击者可以使用 O_PATH 标志打开/ proc / self / exe的文件描述符,然后继续通过/ proc / self / fd / <nr>重新打开二进制文件O_WRONLY并在一个单独进程中的繁忙 loop 里尝试写入。Sarai 解释说,最终,当 runC 二进制文件退出时攻击就成功了。

 

漏洞影响

     该漏洞允许恶意容器(以最少的用户交互)覆盖host上的runc文件,从而在host上以root权限执行代码。在下面两种情况下,通过用户交互可以在容器中以root权限执行任意代码:

1.使用攻击者控制的镜像创建新容器。

2.进入到攻击者之前具有写入权限的现有容器中(docker exec)。

默认AppArmor策略不会阻止此漏洞。对于Fedora上的moby-engine软件包,默认SELinux策略也不会阻止此漏洞(因为容器进程似乎作为container_runtime_t运行);对于Fedora上的docker软件包和podman软件包不受此漏洞影响(它们将容器进程作为container_t运行)。但是可以通过正确使用用户命名空间(其中host的root未映射到容器的用户命名空间)来阻止此漏洞。

目前除了runc之外,Apache Mesos和LXC也确认受到影响。攻击只可能发生在特权容器中,因为它需要host上的root权限来覆盖runc文件。LXC认为特权容器是不安全的,所以没有分配CVE来处理此问题,但是也已经发布了补丁。

 

安全建议

    建议受影响的用户尽快打补丁。Docker 刚刚发布的 18.09.2 版本(https://github.com/docker/docker-ce/tree/v18.09.2)修复了该漏洞。Linux 发行版 Debian 和 Ubuntu 正在修复该漏洞。AWS 和 Google Cloud 已发布安全通知,建议客户更新各种受影响服务的容器。