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

Runc是一个CLI工具,可以根据OCI(Open Container Initiative)标准创建和运行容器。目前,docker引擎也是基于runc内部构建的。在2019年2月11日,研究人员通过oss-security邮件列表揭示了runc容器逃逸漏洞的详细信息。为此问题分配的CVE是CVE-2019-5736。据OpenWall称,漏洞利用细节将在2019年2月18日七天后公布。该漏洞可能会影响大多数云服务提供商,并且损害严重。

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

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

*将(docker exec)附加到攻击者之前具有写入权限的现有容器中。

默认AppArmor策略或Fedora[++]上的默认SELinux策略不会阻止此漏洞(因为容器进程似乎作为container_runtime_t运行)。但是,*被*阻止了

通过正确使用用户命名空间(主机根未映射到容器的用户命名空间)。

攻击者可以通过使用指向runc的文件替换容器中的目标文件来欺骗runc来执行自身。例如,目标文件是/bin/bash,用可执行脚本替换为指定的解释器路径#!/proc/self/exe,并在容器中执行/bin/bash时执行 /proc/self/exe。指向主机上的runc文件。然后,攻击者可以继续写入 /proc/self/exe以尝试覆盖主机上的runc文件。但一般来说,它不会成功,因为内核不允许在运行runc时覆盖它。要解决这个问题,攻击者可以使用O_PATH标志打开/ proc / self / exe的文件描述符,然后使用O_WRONLY标志用/proc/self/fd/<nr>重新打开文件并尝试从一个在一个循环中。一个单独的进程写入此文件。当runc退出时,覆盖将成功,之后runc可用于攻击其他容器或主机。

安全研究人员已经附上修复此问题的相关补丁。这个补丁基于HEAD,但是libcontainer/nsenter/中的代码很少变化,它应该干净地应用于你正在处理的任何旧版本的runc代码库。

相关推荐