runc容器逃逸误差清静通告

宣布时间 2019-02-13

误差编号和级别


CVE编号:CVE-2019-5736,危险级别:严重, CVSS分值:官方未评定


影响规模


受影响版本: 

runC 全版本

LXC 以及 Apache Mesos


误差概述


    runc是一个凭证OCI(Open Container Initiative)标准建设并运行容器的CLI tool。现在docker引擎内部也是基于runc构建的。2019年2月11日,研究职员通过oss-security邮件列表披露了runc容器逃逸误差的详情,误差可能影响宽大云服务厂商,危害严重。


    该误差允许恶意容器以最少的用户交互笼罩宿主机上的runC文件,从而在宿主机上以 root 权限执行恶意代码。当知足以下条件时,攻击者有可能以root权限执行恣意代码:


1. 使用攻击者控制的镜像建设新容器,或者攻击者具有某一docker容器的root权限


2. 攻击者可以使用docker exec方法进入上述容器


    默认的AppArmor战略不可阻止该误差。同样在Fedora上,默认的SELinux战略也不可阻止该误差。(由于容器历程是以container_runtime_t运行的)。可是可以通过准确使用命名空间的方法阻止此误差(不让宿主机的root映射到容器的命名空间中)。


    上述内容只泛起在 Fedora 的“moby-engine”软件包中。其他的docker软件包以及 podman不会受到此误差的影响。由于他们的容器历程是以container_t运行的。


误差细节


攻击者可以将容器中的目的文件替换成指向runc的自己的文件来诱骗runc执行自己。好比目的文件是/bin/bash,将它替换成指定诠释器路径为#!/proc/self/exe的可执行剧本,在容器中执行/bin/bash时将执行/proc/self/exe,它指向host上的runc文件。然后攻击者可以继续写入/proc/self/exe试图笼罩host上的runc文件。可是一样平常来说不会乐成,由于内核不允许在执行runc时笼罩它。为相识决这个问题,攻击者可以使用O_PATH标记翻开/proc/self/exe的文件形貌符,然后通过/proc/self/fd/<nr>使用O_WRONLY标记重新翻开文件,并实验在一个循环中从一个单独的历程写入该文件。当runc退出时笼罩会乐成,在此之后,runc可以用来攻击其它容器或host。


误差使用


误差POC已果真:https://github.com/q3k/cve-2019-5736-poc。


修复建议


更新 runC、LXC 至官方宣布的最新补丁。


参考链接


https://www.openwall.com/lists/oss-security/2019/02/11/2