Docker runC 容器逃逸漏洞 (CVE-2019-5736)

来源:scanv2019.02.13

一、漏洞概述

1、简介

      runC 是一个根据OCI(Open Container Initiative)标准创建并运行容器的 CLI tool,Docker 引擎内部也是基于 runC 构建的。2019 年 2 月 11 日,研究人员通过 oss-security 邮件列表披露了runC 容器逃逸漏洞的详情[1],该漏洞被分配CVE-2019-5736 编号。该漏洞允许恶意容器(以最少的用户交互)覆盖 host 上的runC 文件,从而在 host 上以root 权限执行代码。在下面两种情况下,通过用户交互可以在容器中以root 权限执行任意代码:

  1. 使用攻击者控制的镜像创建新容器
  2. 进入到攻击者之前具有写入权限的现有容器中(dockerexec)

      默认AppArmor 策略不会阻止此漏洞。对于Fedora 上的 moby-engine 软件包,默认 SELinux 策略也不会阻止此漏洞(因为容器进程似乎作为 container_runtime_t 运行);对于 Fedora 上的 Docker 软件包和 Podman 软件包不受此漏洞影响(它们将容器进程作为 container_t 运行)。但是可以通过正确使用用户命名空间(其中 host 的root 未映射到容器的用户命名空间)来阻止此漏洞。

      目前除了runC 之外,Apache Mesos 和 LXC 也确认受到影响。攻击只可能发生在特权容器中,因为它需要 host 上的root 权限来覆盖runC 文件。2019 年 2 月 12 日,Seebug 平台收录了该漏洞[2]。2019 年 2 月 13 日,知道创宇 404 实验室漏洞情报团队开始漏洞应急,复现了这个漏洞。

2、影响版本

  •  runC <= 1.0-rc6

二、漏洞复现

1、复现环境

  • Docker version 18.03.0-ce, build0520e24
  • Debian9 (docker pullDebian:9)

2、复现过程及结果

攻击机 ip:192.168.177.1

目标机 ip:192.168.177.144

容器 ip:172.17.0.2

容器位于目标主机上

1、构建恶意容器:

a、在容器中 clone已有的 exp[3]

b、编辑 c中的 HOST 为攻击者 ip

c、使用 make编译生成 exploit、payload

d、chmod +x exploit payloadsh

e、在容器中运行./pwn.sh

2、攻击主机上使用 nc -lvp 4455 监听

3、在目标主机上执行 dockerexec 容器名 /bin/sh:

4、容器中能看到如下结果:

5、攻击主机上能看到反弹了目标主机 shell,成功逃逸:

三、防护方案

1、漏洞修复

  • 漏洞作者 push了一个 runc 的补丁[4],可以通过重新编译 runC 修复该漏洞
  • Docker发布了 09.2 版本[5]也修复了该漏洞,可以依据自己的系统按照Docker 官方手册升级[6]
  • Linux发行版 Debian 和 Ubuntu 正在修复该漏洞,其他基于 lxC 和runC容器技术的相关厂商和开发者请关注相关厂商公告及时升级和更新

2、技术业务咨询

知道创宇技术业务咨询热线 :

400-060-9587(政府,国有企业)、028-68360638(互联网企业)

 

热门文章

关注知道创宇云安全

获取安全动态