Docker cp容器逃逸漏洞 -CVE-2019-14271

由 mayoterry 发布

1、 漏洞背景

我们使用docker cp命令,可以将文件从host主机拷贝至容器,或者从容器拷贝至host主机,对应具体操作为:docker cp {container_id}:/path /path

在将文件从host主机拷贝至容器时,Docker使用了一个辅助进程:docker-tar ,如下图所示,我们可以使用audit抓取到对应的进程信息。

image-20200805120724086.png

docker-tar的原理是chroot到容器中,归档其中请求的文件及目录,然后将生成的tar文件传回Docker守护进程,该进程负责将文件提取到宿主机上的目标目录中。

在之前旧版本的docker中,docker-tar是不会chroot到容器的根目录中的,但是此时产生了一个符号链接(symlink)造成的安全问题-CVE-2018-15664 ,并且同样的安全问题在Kubernetes,Podman也出现了。当宿主机进程尝试访问容器中的文件时就可能发生这种攻击,如果其中某个文件为符号链接,那么就可能被解析到宿主机的根目录,这样攻击者控制的容器就有可能通过容器的cp命令在宿主机上读取并写入文件。通过将docker-tar进程chroot到容器根目录,docker-tar就可以确保所有的符号链接已被正确解析。

image-20200805121949791.png

不幸是的,新的安全问题伴随而来,当docker-tar进程chroot到容器中时,造成了另外的一个dokcer cp命令导致的容器逃逸漏洞。

2、 漏洞概述

有意思的是,这个漏洞是安全人员从github moby的一个issus发现的,有人反馈使用docker 19.03.0版本,执行docker cp命令的时候,报错如下:

Error response from daemon: error processing tar file: docker-tar: relocation error: /lib/arm-linux-gnueabihf/libnss_files.so.2: symbol __libc_readline_unlocked, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference : exit status 127

根据报错结果判断,显然是docker-tar进程调用了容器里的libnss_files.so.2文件,需要注意的是,docker-tar进程所属的namespaces是在宿主机的,当攻击者将恶意代码注入到docker-tar进程时,就可以通过包含恶意镜像的容器获取到host主机的权限,此时也就完成了Docker容器逃逸攻击。

Docker采用Golang编写,存在漏洞的Docker版本采用Go v1.11编译。在这个版本中,包含嵌入式C代码(cgo)的某些package会在运行时动态加载共享库。这些package包括netos/userdocker-tar都用到了这两个package,会在运行时动态加载一些libnss_*.so库。正常情况下,程序库会从宿主机的文件系统中加载,然而由于docker-tarchroot到容器中,因此会从容器的文件系统中加载这些库。

3、 漏洞利用

为了利用该漏洞,我们可以修改libnss_files.so源码,在其中插入实现容器逃逸的恶意代码 ,并制作对应的恶意镜像。具体利用过程参考:https://unit42.paloaltonetworks.com/docker-patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/

在此就不重复说明。

4、 漏洞修复

漏洞补丁修复了docker-tarinit函数,避免存在问题的Go package调用任意函数。补丁强制docker-tarchroot到容器前,先从宿主机系统中加载libnss库。

image-20200805142458225.png

5、 漏洞思考

docker开源社区在修复CVE-2018-15664漏洞时,为了避免符号链接(symlink)攻击,将docker-tar进程chroot到了容器根目录,似乎切底的解决了使用Docker cp命令的该类攻击,但是随后出现了“so劫持”类型的CVE-2019-14271漏洞,官方的修复方式是强制docker-tar进程在chroot到容器前,先从宿主机系统中加载libnss库。此时我们不得不思考一个问题,除了libnss库外,Docker cp是否还潜在的调用了容器内的其他so链接库文件?或者随着Docker版本的不断迭代,未来是否会出现和CVE-2019-14271类似的漏洞?让我们拭目以待吧。

参考:

https://unit42.paloaltonetworks.com/docker-patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/

https://www.anquanke.com/post/id/193218

https://github.com/moby/moby/issues/39449

https://github.com/moby/moby/pull/39612


暂无评论

发表评论