Docker容器环境检测方法【代码】

参考资料:

Determining if a process runs inside lxc/Docker

http://stackoverflow.com/questions/20010199/determining-if-a-process-runs-inside-lxc-docker

第1章 背景

现在有研究表明,人们目前有使用Docker进行恶意代码重现工作的倾向。Docker的反检测可分为三部分:CPU反检测,内存反检测和存储数据反检测。该技术利用了AUFS的层叠镜像技术,使得我们的Docker反检测技术可以很容易地实现在镜像的一层中——反检测层。这样,只需要将反检测层动态地部署到Docker容器中,即可实现对Container环境的CPU、内存和存储的封装,从而遮蔽掉Container特征。这样的话,该容器中的恶意代码也就无法检测其自身是否在Container中运行了。

第2章 cgroup方法

在Host和Container中执行cat /proc/1/cgroup命令的结果是不同的,可以利用这一点进行判断。(或者cat /proc/self/cgroup命令也行)

在Host中执行cat /proc/1/cgroup命令的结果:

如何检查容器的cuda环境 对容器的检查方法_文件系统

在Container中执行cat /proc/1/cgroup命令的结果:

如何检查容器的cuda环境 对容器的检查方法_docker_02

第3章 find docker方法(原创)

在Host和Container中的文件系统中,有关于docker的文件、目录有很大差别。因此可以通过枚举文件系统中关于docker的文件,进行判断。

在Host中执行find / -name docker命令的结果:

如何检查容器的cuda环境 对容器的检查方法_docker_03

在Container中执行find / -name docker命令的结果:

如何检查容器的cuda环境 对容器的检查方法_docker_04

第4章 环境变量方法(原创)

在Host和Container中执行env命令查看环境变量的结果是不同的,可以利用这一点进行判断。(或者cat /proc/1/environ命令也可)

在Host中执行env命令的结果:

如何检查容器的cuda环境 对容器的检查方法_文件系统_05

如何检查容器的cuda环境 对容器的检查方法_如何检查容器的cuda环境_06

如何检查容器的cuda环境 对容器的检查方法_文件系统_07

在Container中执行env命令的结果:

如何检查容器的cuda环境 对容器的检查方法_文件系统_08

第5章 Dropped capabilities方法

帖子上提到了:”Otherwise, if you are root, you can try to perform mknod or mount operation, if it fails, you are most likely in a container with dropped capabilities.”

第6章 Mount方法(原创)

在Host和Container中执行mount命令的结果是不同的,可以利用这一点进行判断。

在Host中执行mount命令的结果:

如何检查容器的cuda环境 对容器的检查方法_如何检查容器的cuda环境_09

如何检查容器的cuda环境 对容器的检查方法_如何检查容器的cuda环境_10

在Container中执行mount命令的结果:

如何检查容器的cuda环境 对容器的检查方法_Docker_11

第7章 设备文件方法(不成功)

在Host和Container中执行ls /dev命令的结果是不同的,可以利用这一点进行判断。

但是目前还没发现本质的不同点。

第8章 文件系统方法(原创)

在Host和Container中执行df -h命令的结果是不同的,可以利用这一点进行判断。

在Host中执行df -h命令的结果:

如何检查容器的cuda环境 对容器的检查方法_Docker_12

其中,cgmanager是cgroup的管理器daemon,运行于root下。

在Container中执行df -h命令的结果:

如何检查容器的cuda环境 对容器的检查方法_文件系统_13