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


京公网安备11010802024551号