0x1 逃逸检测
0x1.1 基础理论
目前主流的虚拟化技术按照其运行状态可以分为以下三种:
- lxc/lxd:基于linux内核原生虚拟化技术
- docker/chroot:基于文件系统的半虚拟化
- vmware/virtualbox/kvm:依赖驱动的虚拟化
虚拟机逃逸检测理论基础:
- 虚拟机中运行的三环程序不可能也不会触及vmware/vb等虚拟化技术提供的虚拟化驱动接口
- 虚拟机逃逸大都利用虚拟机驱动,由于aslr等机制必定会导致宿主机内核中出现内存崩溃日志
- 稳定态虚拟机不可能通过外部介质(usb/http/ftp/...)热加载驱动代码
逃逸成功过后必定会产生文件系统变动
- 稳定态下宿主机的文件系统应该是固定的
- 即使是进程后门也会产生非法的pid文件
- 基于以上理论基础产生出主动检测以及被动检测两种基本的检测方向
0x1.2 主动检测
主动检测指的是宿主机通过现有资源环境主动分析可疑代码,有一定程度上的0day捕获能力,主要分为以下几种检测方式:
虚拟机流量监测:
- 首先将vm/vb/等虚拟化技术提供的api接口制作成关键字词典
- 接着在宿主机全局流量匹配,匹配到词典就说明有逃逸的嫌疑
- 最后如果关键词api的上下文构成一定语法,可以判定为逃逸.
虚拟机文件嗅探:
- 宿主机可以通过驱动/检查点等技术直接扫描虚拟机中的文件
- 利用关键字/已公开exp等特征匹配文件
内存检测:
- 利用shellcode等技术加载的二进制代码在内存中是明文并且是强特征的
- 宿主机实时/定期扫描虚拟任务的内存区间以匹配强特征
- 必要时检索所有内存区间
0x1.3 被动监控
被动监控主要分为以下几种方式:
检测虚拟化内核崩溃日志
- 首先监听宿主机的内核以及虚拟化服务崩溃日志
- 当某个虚拟化任务特别是某个虚拟机反复触发崩溃时可以判定为逃逸行为
检测宿主机文件系统变化
- 逃逸成功后有时会通过文件的形式来实现永久后门
- 实时监听/定期扫描宿主机文件的变动就可以捕获到逃逸行为
检测宿主机异常外链
- 稳定态宿主机的外链地址应该是固定的
- 每一个白名单外的外链都可以判定为异常
检测宿主机非法进程
- 稳定态下宿主机的进程树应该是固定的
- 出现非法进程树可以判定为逃逸行为
0x2 检测算法
io监听:
- 在宿主机上监听文件读写记录
- 但凡有docker进程读取
/root,/etc/,/home
等非公开目录就认为是逃逸成功 - 注意:需要事先采集docker原本会读取哪些目录
文件扫描:
- 扫描宿主机上的所有文件,检查是否出现反弹shell之类的关键字
- 出现就可以认为已经被逃逸了
二进制文件监听:
- 定期对所有二进制文件进行hash比对
- 系统更新后需要自动刷新hash
- 二进制文件hash发生异常改变可以认为是逃逸成功
mount监听:
- docker逃逸后可能会挂载系统磁盘来窃取数据
- 监听mount表是否发生异变