来源:Docker容器安全监控系统设计与实现_简智强
远程端口访问
Swarm是Docker公司发布的一套用来管理Docker集群的工具,它将一群宿主机简化成一个单一的虚拟机,在用Swarm来管理Docker容器集群时默认开启了2375端口,通过远程访问命令“docker -H tcp://$ip:2375 $command”获取容器操作权限,可任意执行Docker命令。这个用户在配置上的疏忽在2016年被恶意攻击者广泛利用后,在一段时间的影响比较严重。通过这个远程访问接口,攻击者可以获得远程容器操作权限,在启动容器时通过挂载根目录到容器内的目录,写攻击者自己生成的SSH公钥到挂载的根文件里,进而无密码SSH远程访问连接宿主机,获得宿主机超级用户访问权限。如图所示,为远程访问容器并写入SSH私钥的攻击过程,可以看到最终获取了一台服务器的远程控制权限。
Linux 内核漏洞对Docker的影响
容器与宿主机共享内核,当在容器内运行一些针对内核的漏洞利用代码可能会导致整个宿主机崩溃,甚至提升用户特权获得root权限从而逃逸获得宿主机控制权限。新发现的内核漏洞细节和其利用程序被公开,如果利用的相关系统调用在Seccomp默认过滤的范围之外,所有Docker容器将受到安全威胁。2014年Docker的第一个逃逸案例被披露,该案例通过open_by_handle_at调用暴力搜索宿主机文件系统获取宿主机敏感文件,虽然不是完全控制权限的逃逸,但也足以构成威胁。
目前,在默认Seccomp过滤范围外的系统调用漏洞包括CVE-2015-3290,CVE-2015-5157(内核屏蔽中断处理中的漏洞,可利用modify_ldt系统调用提升权限),CVE-2016-3134,CVE-2016-4997,CVE-2016-4998(当setsocket函数的参数为IPT_SO_SET_REPLACE,ARPT_SO_SET_REPLACE或ARPT_SO_SET_REPLACE时可能导致内存溢出,甚至权限提升,可利用逃逸出容器)。Linux内核3.16以前的版本存在一个内存溢出漏洞(CVE-2014-7822),由于splice系统调用在两个文件间拷贝数据时未检查拷贝大小,可溢出覆写内核数据,本地未授权用户可利用此漏洞越界写内存,导致系统崩溃。然而不少Docker环境部署在基于这些版本的Ubuntu和Centos系统。通过在Ubuntu下的Docker容器环境内运行该漏洞的利用代码会使宿主机崩溃,造成拒绝服务。