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


修复建议


更新 runCLXC 至官方发布的最新补丁。


参考链接


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