0x00前言
Docker在各领域的应用越来越广泛,最近在分析Docker安全的相关内容,分享一个由于Inode导致的Docker拒绝服务攻击。
0x01Inode简介及Docker安全
1.Inode负责Linux文件系统中存储文件的信息,包括文件名、创建日期等,更加详细的介绍参考理解inode,这里我们只关注在Linux文件系统中,每个文件需要有对应的Inode,而且Inode是一种有限的资源(类比:端口号只有65535个),如果Inode被使用完毕,即使磁盘还有剩余空间也无法建立新的文件,导致需要新建文件的服务无法正常运行。
2.众所周知,Docker利用Linux内核的Namespace、Capability、CGroup以及SELinux等提供系统层面的虚拟化服务,提供相比于传统的虚拟机(VM)技术更加轻量级的隔离容器(Container)服务。然而正由于多个容器共用一个底层操作系统,有些隔离措施的缺陷会导致Docker存在一定的安全风险。如果在一个容器内不断创建新的文件,就会把宿主机(真实主机)的文件系统的Inode消耗完毕,导致其他容器无法新建文件,导致服务异常,而且宿主机也不能新建其他容器,导致拒绝服务攻击。
0x02实践过程
测试环境:
- Docker version 17.03.1-ce
- Ubuntu 16.04
- 20G SSD腾讯云主机
利用Docker run -it tutum/lamp /bin/bash
启动容器,并获取bash命令shell
新建bash文件,实现循环新建空文件,消耗Inode资源,详细内容如下:1
2
3
4
5
6
7
i=1
while true
do
i=$(($i+1));
touch $i;
done
运行脚本等待一段时间,提示No space left on device
此时在宿主机上用df -i
命令查看Inode使用100%,于是所有的Inode资源被消耗完
如果尝试新建容器的失败,提示no space left on device
0x03小结
Docker的不同容器共享同一个宿主机,虽然Docker有很多的安全隔离机制,但是有些资源的隔离存在缺陷。如果其中一个容器消耗完Inode资源会导致其他容器需要新建文件的所有功能异常,也会导致宿主机的功能异常,达到针对其他容器和宿主机的拒绝服务攻击。