docekr逃逸原理初学

Posted 玛卡巴卡巴巴亚卡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docekr逃逸原理初学相关的知识,希望对你有一定的参考价值。

一、docker原理

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

二、环境判断

判断是否是docker环境,有两种方法

1、是否存在.dockerenv文件

docker环境下存在:ls -alh /.dockerenv 文件,非docker环境没有该文件

2、查询系统进程的cgroup信息

docker环境下 cat /proc/1/cgroup有信息输出,非docker环境下没有

三、漏洞原因

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

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

  1. 由内核漏洞引起。
  2. 由Docker软件设计引起。
  3. 由特权模式与配置不当引起。

1、由于内核漏洞引起的逃逸

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

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

 ②获取当前进程的task struct

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

 ④切换当前namespace

 ⑤打开root shell,完成逃逸

2、docker软件设计引起的逃逸

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

3、由docker特权模式配置不当+目录挂载引起的逃逸

这一种逃逸方法较其他两种来说用的更多。特权模式在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逃逸。

以上是关于docekr逃逸原理初学的主要内容,如果未能解决你的问题,请参考以下文章

借安恒月赛web pop对象注入+反序列化字符逃逸深究其逃逸原理

借安恒月赛web pop对象注入+反序列化字符逃逸深究其逃逸原理

深入理解jvm原理之逃逸分析

JVM技术专题深入研究JVM内存逃逸原理分析「研究篇」

逃逸分析

逃逸分析