hkt1998

hkt1998

容器安全之Docker逃逸

2024-03-15

一、危险配置

1. Privileged特权模式

利用条件:容器以特权模式运行

docker run --privileged

以特权模式运行的容器可以访问宿主机上的所有设备。

可以在容器中挂载宿主机的磁盘,然后将根目录切换过去。

2. SYS_ADMIN

利用条件:

  1. root身份运行容器。

  2. 使用--cap-add=SYS_ADMIN给容器增加权限。

  3. 没有被AppArmor限制运行mount syscall,比如使用了启动参数--security-opt apparmor=unconfined

二、危险挂载

1. 挂载socket

利用条件:将/var/run/docker.sock文件挂载到了容器中。

Docker是通过docker.sock文件与容器进行通信的,所以当docker.sock挂载到容器中时,容器内也可以通过这个文件与其它容器通信,在容器内安装Docker客户端,执行Docker命令就相当于在宿主机执行Docker命令了。

比如可以创建一个特权模式运行的容器,然后进行上面类似的操作。

2. 挂载proc目录

利用条件:将/proc/sys/kernel/core_pattern文件挂载到了容器中。

漏洞原理是/proc/sys/kernel/core_pattern负责配置进程崩溃时内存转储数据的导出方式,如果进程崩溃了,系统内核会捕获到进程崩溃信息,并将信息传递给core_pattern中的程序或者脚本。

从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern 中使用新语法。如果该文件中的首个字符是管道符'|',那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。

后面只需往文件中写入payload,引发某个程序崩溃即可运行恶意代码。

payload

echo -e "|/tmp/.payload.py \rcore               " > /proc/sys/kernel/core_pattern

这个payload有两个细节,一个是.payload.py是隐藏文件,只用ls看不到,二是使用了\r和很多个空格,这样cat就看不到前面的恶意代码。

\r在Linux系统中表示将光标移动至行首,相当于将“core ”盖在“|/tmp/.payload.py”的上面,这就是为什么后面需要加很多个空格,太短盖不住。

三、程序漏洞

1. CVE-2019-5736

CVE-2019-5736是一个严重的容器逃逸漏洞,影响Docker默认设置下的容器安全。攻击者可利用此漏洞获得宿主机root权限,威胁整个系统的安全。漏洞源于Docker 18.09.2之前版本使用的runc组件,允许篡改宿主机上的runc二进制文件。

四、内核漏洞

1. CVE-2016-5195 Dirty-CoW 脏牛漏洞

CVE-2016-5195是一个Linux内核级的本地提权漏洞,存在于Linux内核2.6.22及以后的版本中。该漏洞源于Linux内核内存子系统在处理私有只读存储映射时的写时拷贝机制存在条件竞争问题。攻击者可利用此漏洞获取对其他只读内存映射的写权限,进而可能提升权限,对系统安全构成威胁。

2. CVE-2017-1000405 大脏牛漏洞

CVE-2017-1000405是一个Linux内核的本地竞争条件漏洞,影响范围包括Linux kernel 2.6.38至4.14版本。攻击者可利用此漏洞在受影响系统上下文中修改任意文件,可能导致拒绝服务或执行任意代码。这个漏洞是由于Linux Kernel在实现上存在本地竞争条件而引发的。

五、总结防御手段

  1. 更新Docker

  2. 更新runc

  3. 更新k8s

  4. 升级Linux内核

  5. 不以root运行容器

  6. 谨慎使用特权模式

  7. 谨慎挂载敏感目录

  8. 注意权限参数的使用