【漏洞预警】runc容器逃逸漏洞 (CVE-2019-5736)

  • 来源:深信服安全中心
  • 发布时间:2019-02-14
#

事件描述

2019年2月11日,研究人员通过oss-security邮件列表披露了runc容器逃逸漏洞的详情,根据OpenWall的规定EXP会在7天后也就是2019年2月18日公开,CVE编号CVE-2019-5736。 

千里百科

根据官方的定义:runC是一个根据OCI标准创建并运行容器的CLI tool,runC是Docker中最为核心的部分,容器的创建,运行,销毁等等操作最终都将通过调用runC完成。

漏洞描述

该漏洞允许恶意容器(用户最少的交互方式)覆盖主机runc二进制文件。

使用条件:

1.使用攻击者控制的image创建新container。

2.攻击者之前有写入权限,将(docker exec)附加到已经存在的container中。

当连接到正在运行的容器或启动时,可以进行攻击容器运行定制image。例如,当runC附加时,对于容器,攻击者可以欺骗它自己执行。这可能是通过使用自定义二进制文件替换容器内的目标二进制文件来完成指回runC二进制文件本身。例如,如果是目标二进制文件是/bin/bash,这可以用指定的可执行脚本替换解释器路径#!/proc/self/exe的可执行脚本,当容器执行/bin/bash的时候将执行/proc/self/exe,尝试覆盖主机上的runC二进制文件。然而一般来说不会成功,因为内核不会允许它runC正在执行时被覆盖。为了突破这个问题,攻击者选择使用O_PATH标志打开文件描述符到/proc/self/exe,然后继续通过/proc/self/fd/重新打开二进制文件为O_WRONLY并尝试在一个单独的进程中循环写入它。当runC二进制文件退出时。在此之后,runC二进制文件被泄露并且最终可以用于攻击其他容器或主机本身。

默认的AppArmor策略也不会阻止此漏洞,也不会通过Fedora 上的默认SELinux策略阻止(因为容器进程似乎作为container_runtime_t运行)。但是,可以通过正确使用用户命名空间阻止此漏洞。

此漏洞也会以类似的方式影响LXC,但是LXC项目认为特权容器不安全,并没有为LXC此问题分配CVE。(参考链接:https://linuxcontainers.org/lxc/security/project

漏洞复现

上面描述的可能过于专业化,我们准备了一个案例让各位小伙伴们直观的了解一下。

我们准备一台存在漏洞的环境(Linux kali 4.15.0-kali2-amd64 #1 SMP Debian 4.15.11-1kali1 (2018-03-21) x86_64 GNU/Linux)

Docker版本:Docker version 17.05.0-ce, build 89658be

使用已经披露的带有攻击脚本的Dcokerfile构建一个image

图片1.png 攻击载荷部分源码

图片2.png 

在通过image启动一个带有攻击载荷的container,发现成功执行了攻击载荷并成功覆盖runC文件。

图片3.png

时间轴

 2019-02-11 研究人员通过oss-security邮件列表披露漏洞的详情

2019-02-13 深信服千里目安全实验室复现漏洞并发布漏洞预警

参考链接

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

 


解决方案

修复建议

Runc官方已经针对该漏洞发布了修复CVE-2019-5736的安全补丁:

https://github.com/opencontainers/runc/commit/0a8e4117e7f715d5fbeef398405813ce8e88558b