APP下载

恶意代码动态分析中的反虚拟化问题研究①

2019-01-07莫建平应凌云苏璞睿王嘉捷

计算机系统应用 2018年12期
关键词:进程虚拟化样本

莫建平,应凌云,苏璞睿,王嘉捷

1(中国科学院 软件研究所,北京 100190)

2(中国科学院大学,北京 100049)

3(中国信息安全测评中心,北京 100085)

动态分析具有不受加壳、混淆等代码保护技术影响的优点,是分析新恶意代码的首选方法.动态分析通常在虚拟环境中运行样本,利用监控模块提取样本的进程、内存、文件、注册表、网络等行为数据,通过对这些行为数据的汇总分析来推断样本的功能和恶意性.反虚拟化是造成动态分析系统无法获取样本全部行为数据的重要因素.样本在检测到运行在虚拟环境后,隐藏恶意行为或直接退出,导致动态分析系统只能获取样本的部分行为数据,影响动态分析的准确性.本文将对现有的针对恶意代码动态分析的反虚拟化技术进行调研,并提出系统的反虚拟化对抗方案,接着将反虚拟化对抗应用到已有的基于QEMU的动态分析系统上,通过实验验证了反虚拟化对抗有效性.

本文的组织结构如下,第一节介绍现有的反虚拟化对抗方法并指出其存在的不足,第二节对目前的反虚拟化方法进行分类阐述,接着第三节介绍如何对抗这些反虚拟化方法,第四节将反虚拟化对抗应用到已有的恶意代码动态分析系统,并通过实验验证对抗的有效性,最后第五节是全文的总结和展望.

1 反虚拟化对抗现状

针对样本的反虚拟化问题,目前提出的解决思路主要有两种.一是构建更难被检测,更透明的分析系统.如基于硬件虚拟化技术实现的动态分析系统Ether[1],V2E[2],基于真实硬件(bare-metal)的BareBox[3],BareCloud[4]和LO-PHIL[5]都试图通过增加分析系统的透明性对抗反虚拟化检测.但是Thomas Raffetseder[6]等人指出硬件虚拟化技术能被检测出来,基于baremetal的方法则代价高昂,难以大规模应用,并且由于缺乏对样本执行的细粒度监控,容易受到样本的拖延技术(样本通过睡眠,空操作等方式使动态分析超时的技术)的影响.

二是识别样本对虚拟环境的检测手段并绕过检测.如Cobra[7]使用二进制翻译来监控每个基本块的执行,通过替换掉所有可能的针对Cobra的检测指令来绕过样本反虚拟化检查,但是Cobra使用细粒度的二进制插桩,性能下降明显.而Balzarotti[8]等人在虚拟分析环境上重放参考主机(物理主机)上的执行记录,通过比较样本在两次执行中的差异来发现样本对虚拟环境的检测方法.

动态分析环境包括主机环境,网络环境和用户交互环境三个方面,仅仅考虑主机环境的反虚拟化对抗是不够的,样本可以通过对网络环境或用户交互的探测进行反虚拟化.

2 反虚拟化方法概述

样本的反虚拟化基于模拟分析环境和真实环境的差异进行,这样的差异可以分为主机环境差异,网络环境差异和用户交互环境差异三个方面.

2.1 基于主机环境差异的反虚拟化方法

动态分析系统主机环境的构建主要有基于硬件模拟器 (如 Bochs,QEMU),基于硬件虚拟化 (如VirtualBox,VMware),基于虚拟机监视器 (又称hypervisor,如 Xen,VMware ESXi)和基于真实硬件四类.现有针对主机环境差异的虚拟化检测方法主要包括基于硬件特征的检测方法和基于系统特征的检测方法两类.

硬件特征主要包括CPU、内存、硬盘驱动器、CD/DVD驱动器、BIOS、ACPI、显卡和网卡几类.表1对这些检测方法进行了总结.表中列出了针对每类特征的各个检测项并举例说明,注释部分对检测项或例子做出了说明.比如针对内存大小的检测项,动态分析系统由于考虑到资源的消耗和分析的并行度,一般会分配给虚拟机较小的内存,如1 GB.

表1 基于硬件特征的反虚拟化方法

CPU个数和核数,内存大小,硬盘大小等特征为通用的反虚拟化特征,对所有类型的虚拟化平台都适用.其它硬件特征则是虚拟化平台相关的,不同的虚拟化平台含有不同的特征值,同一虚拟化平台的不同版本的特征值可能也不一样.基于真实硬件的主机环境由于使用真实的硬件,并且一般CPU为多个或为多核,内存和硬盘空间比较大,因而不包含用于反虚拟化的硬件特征.

基于系统特征的检测方法可以分为两类:一是查找系统进程列表,文件,注册表,服务列表等是否含有模拟器相关的特征字符串.二是基于时间的检测方法,包括检测系统启动时间,通过比较在真实系统和虚拟机上执行特定代码或任务的绝对或相对时间差来探测虚拟机的存在.

虚拟化平台为了实现虚拟化的功能或增加平台的易用性,需要向guest引入必要的组件,如设备驱动,DLL文件,EXE文件等,可能还会注册随系统启动的服务或程序,这些组件的信息会在系统安装或运行过程中保存到注册表或日志文件中.虚拟化平台额外引入的这些文件成为反虚拟化利用的特征.这些特征是虚拟化平台相关的.表2总结了基于系统特征的反虚拟方法.其中进程和服务特征可以通过遍历进程列表和服务列表进行检查.

表2 基于系统特征的反虚拟化方法

硬件模拟器需要模拟所有的硬件操作,还需要将guest CPU的代码动态翻译成宿主机CPU的代码,基于硬件虚拟化或hypervisor的虚拟化平台虽然减轻了在硬件操作上的模拟压力,但在性能上还是比相同配置的物理主机要低,这样的性能差异通过可以测量虚拟机和物理主机运行特定代码或任务耗时绝对时间差或相对时间差体现出来.绝对时间差是指运行同一代码或任务,虚拟机和物理机耗时的差值或比值,而相对时间差是指两段不同代码或两个不同任务在虚拟机和物理机上耗时的差值或比值之间的差异.为了增加测量的稳定性,通常会循环执行特定代码或任务多次,取平均值作为测量结果.时间的测定使用rdtsc指令,GetLocalTime,GetTickCount,QueryPerformance-Counter和 QueryPerformanceFrequency 等 API.特定代码包括cpuid指令,GetProcessHeap和CloseHandle及其它在虚拟机和物理机上执行时间有显著差异的代码或任务.基于时间的检测方法为通用的反虚拟化方法,适用于所有虚拟化平台.

2.2 基于网络环境差异的反虚拟化方法

真实网络的站点和服务程序数量巨大,而模拟网络在实现上往往只模拟一个程序和一个站点,这样的矛盾性导致了基于网络环境差异的反虚拟化方法.模拟网络和真实网络的差异可以归纳为如下两个方面:1)性能差异,模拟网络通常与分析主机处于同一局域网,对请求响应迅速,延时比真实网络小,2)服务细节差异,模拟服务往往响应固定模式的消息,和真实服务在细节方面存在差异,如DNS查询总是响应相同的IP,HTTP对不同动态参数的url响应相同页面,不同HTTPS站点使用相同的证书等.表3总结了针对常见协议的反虚拟化方法.其中性能差异的数据表示模拟网络服务的响应速度,括号中数据为真实服务的响应速度,测量的是服务成功连接后,一次请求的响应时间.选用国内常见站点作为测试目标.

2.3 基于用户交互环境差异的反虚拟方法

恶意代码动态分析系统为了提高分析效率,往往采用自动化分析,没有用户使用系统,因而与有用户使用的系统存在明显差异.基于用户交互环境差异的检测方法可以分为用户使用记录和用户交互动作两类.

表3 常见协议的反虚拟化方法

用户使用记录是指用户在使用操作系统时留下的用户痕迹,包括如下几点:剪切板是否有临时数据;常见的软件是否安装;是否有一定量的个人数据,图片,文档,音视频等;是否有近期的浏览器历史记录;是否具有一定量的用户登录记录,系统日志等.

用户交互动作主要指鼠标的移动点击和键盘的击键.键盘和鼠标是PC机的主要输入设备,用户使用系统时会经常进行鼠标和键盘的操作,而动态分析系统由于是自动化分析,故缺乏相关的用户交互动作.鼠标的位置可以使用 GetCursorPos API获取,键盘击键的可以通过安装全局hook进行监视.表4总结了基于用户交互环境差异的反虚拟化方法.

表4 基于用户交互环境差异的反虚拟化方法

3 反虚拟化对抗

3.1 对抗基于主机环境差异的反虚拟化方法

虽然部分特征可以通过定制镜像或inbox的API hook应对,但是并不彻底.比如注册表中硬盘相关的字符串,可以通过修改注册表键值移除,但是系统重启之后,原有的键值由于备份的原因仍然会出现,而通过inbox的hook注册表键值打开,查询等API的方式隐藏相关字符串方式,难免对操作系统做出修改,使得隐藏本身引入了新的检测虚拟环境的特征.由于QEMU在恶意代码动态分析中被广泛使用,并且是开源的硬件模拟器,便于从源码移除字符串类型的特征,实现outbox的API hook隐藏系统信息,因此本文选取在QEMU实现对抗基于主机环境的反虚拟化方法.

从源码移除硬件特征需要熟悉QEMU启动流程,通过搜索得到所有可能的硬件特征字符串,然后利用静态数据流分析,判断可疑字符串是否为模拟硬件使用,并评估是否可移除或替换,最后重新编译,测试修改是否有效及是否对系统运行产生负面影响.

对于不便从源码移除的特征,如内存大小,hypervisor bit及基于性能差异的反虚拟化方法,采用outbox的 API hook 进行对抗.Outbox 的 API hook 框架如图1所示.首先获取被监控目标,每当遇到一个新的进程时,通过进程的环境控制块TEB获取进程名,与样本名比较,若一致则表明该进程为被监控目标,提取进程控制块ETHREAD地址和当前CR3为进程标志.然后利用得到的CR3和ETHREAD对轮转的进程/线程进行过滤,当命中目标进程且当前IP地址为需要监控的API地址时,接管当前进程控制流,进行 hook 处理.最后重置相关参数,进行清理工作,为下一轮hook做准备.

API hook 的实现需要注意如下问题:(1)需要对被监控进程/线程及其子进程/子线程进行;(2)避免对虚拟机运行产生负面影响;(3)尽量减少hook带来的性能损耗.为了监控目标进程派生的线程树和进程树,对进程/线程的创建和销毁的API进行监控,使用列表维护目标进程派生的后代,在进程过滤时查找该列表.为了避免对虚拟机运行产生负面影响,API监控只针对目标进程及其后代进程和线程.而为了降低hook带来的性能消耗,在过滤进程时,若当前IP处在用户空间,则认为进程没有切换,不再查找当前进程的ETHREAD地址进行进程过滤.在首次寻找目标进程时,可以维持一个列表用于缓存已经检视过的进程ETHREAD和CR3,以加速目标进程的匹配.目前的实现没有对目标进程的子进程树和子线程树进行监控.

表5中总结了基于硬件特征的反虚拟化对抗方法.根据表2,针对基于系统特征的反虚拟化方法主要包括6类.其中进程列表和服务列表不包含QEMU相关特征字符串,无需对抗.而注册表键值和特殊文件所包含的特征字符串全部是硬件相关的,经过测试,在从源码移除硬件特征字符串后,注册表和特殊文件(使用新的系统镜像)不再包含QEMU相关特征字符串.

图1 Outbox 的 API hook 流程图

表5 基于硬件特征的反虚拟化对抗方法

针对基于时间的检测方法,没有通用有效的对抗方案.虽然随着版本的更新迭代,硬件模拟器的性能在不断提升,但目前仍然存在某些特殊任务能在宏观或微观上区分模拟硬件和真实硬件.如使用GPU渲染高帧率的游戏画面,在模拟硬件上耗时远超过真实硬件.Windows XP 上 GetProcessHeap 与 CloseHandle API调用耗时的比值在模拟硬件上超过10倍,而在真实硬件上两者耗时相近.对于特征明显,并且使用特定指令或API进行时间测量的任务,可以通过hook相关API,修改时间测量结果的方法对抗.但是对于样本运行某些在真实硬件耗时很少,而虚拟硬件耗时较多的”正常”的任务,从而使动态分析超时的拖延战术,在耗时任务不易识别的情况下,很难实施有效的对抗方法.

时间测量计算的是代码执行前后时间的差值,因此hook API时关注的不是函数当前的返回值,而是前后两次返回值的差值.简单的将前后两次的差值置为定值或定值加上一个小范围的随机数,不能满足对抗的需要.差值为定值容易被检测出来,且不符合现实情况,因为操作系统任务调度和外部事件的不确定性,即使相同代码,执行时间也可能不一致.加上随机值模拟了执行时间的不确定性,但仍可以通过测量Sleep的执行时间进行检测.如果测量得到的差值远小于Sleep指定的时间,则说明Sleep函数或时间测量函数被patch,这都指示了样本运行在虚拟机中.因此本文提出了如图2所示的差值修改方法.

图2 时间测量函数返回值曲线

图中虚线为未调整的返回值曲线,斜率为1,实线为调整后的返回值曲线.实线形状类似向上的台阶,台阶平面波动向上,即差值随机化.台阶向上跃迁即不做修改,直接返回函数调用结果.跃迁的条件是自上次测量函数的调用经过了超过阈值的时间,或者这期间调用了Sleep,SleepEx和NtDelayExecution等延时函数,跃迁可以对抗通过测量Sleep执行时间检测虚拟机的方法,减小对两次差值测量之间的代码执行时间产生的影响.阈值的大小决定了隐藏性能差异的大小.样本第一次调用时间测量函数时,不对返回值进行修改.返回值修改只针对被监控进程进行,不影响系统中其它进程对时间测量函数的调用.差值修改方法虽然在QEMU上实现,但对其它虚拟化平台也适用.表6总结了针对QEMU的基于系统特征的反虚拟化对抗方法.

表6 基于系统特征的反虚拟化对抗方法

3.2 对抗基于网络环境差异的反虚拟化方法

INetSim[9](Internet Service Simulation Suite)是一款由Perl编写的开源网络服务模拟软件.其提供DNS,HTTP,SMTP,IRC 等多种常见的网络服务模拟,以支持恶意软件的动态分析,同时支持使用配置文件对模拟服务进行个性化配置.因此本文在INetSim上实现基于网络环境差异的反虚拟化方法的对抗.

基于网络环境差异的反虚拟化方法包括性能差异和服务细节差异.针对性能差异,在服务响应请求时延时一定时间,如 20 ms 至 40 ms,以与正常网络的延时相近.由于INetSim采取Fork模式,每个请求都Fork一个子进程进行处理,因此使用进程睡眠延时的方式虽然降低了服务的吞吐率,但是不会对后续同类型和和其它类型请求造成影响.

针对服务细节差异,主要采用随机化的方法改变原来服务返回的固定信息进行对抗,如DNS服务在解析不同域名时,从指定IP池中随机返回一个,在服务初始化时,从指定的程序版本中随机返回一个等.由于网络服务独立于主机环境,实现在INetSim的对抗方法适用于所有虚拟化平台.表7总结了针对常用协议的反虚拟化对抗方法.

表7 常用协议的反虚拟化对抗方法

3.3 对抗基于用户交互环境差异的反虚拟化方法

根据表4,基于用户交互环境差异的反虚拟化方法主要包括用户使用记录和用户交互动作两类.针对用户交互记录,主要通过定制镜像的方法进行对抗.由于组内恶意代码动态分析系统已有的系统镜像经过了几年的定制更新,常见的软件,用户数据,浏览器记录,系统登录日志等用户使用记录都具备,满足对抗要求.考虑到从新的系统镜像重新进行一轮定制的时间代价和最终效果,本文直接使用这个系统镜像对抗基于用户使用记录的反虚拟化方法.

使用脚本模拟鼠标的移动点击和键盘的击键,属于inbox的方式,在对抗的同时也引入了新的反虚拟化特征.因此本文提出通过发送硬件事件的outbox方式提供用户鼠标和键盘动作的模拟.真实用户操作在基于QEMU的虚拟机上,都是以发送事件的方式改变鼠标和键盘的状态.本文实现了3种发送硬件事件的方式,分别是基于QEMU主循环的,基于线程的和基于QEMU定时器的.QEMU使用一个大循环处理外部事件和中断,基于主循环的方式即在主循环中插入发送事件的代码,但由于主循环执行的频率较高,而正常用户的操作速度较慢,因此需要一个计数器指定主循环执行若干次后触发硬件发送事件,但是使用循环次数不好估计时间,难以精确事件发送的间隔.基于线程的方式则在QEMU启动时单独创建一个线程,线程在随机睡眠一段时间后发送硬件事件,为了便于控制,模拟鼠标和键盘的操作至少需要两个线程.QEMU时钟支持定时器以定期完成某些任务,每次主循环都会检测是否有到期的定时器,如果有,则执行定时器预设的函数.基于定时器的方式在QEMU时钟上安装定时器,定时器注册的函数发送硬件事件并重置定时器,该函数的执行时间不能过长,否则影响对其它外部事件的响应.考虑到三种实现方式的侵入性和性能损耗,采用基于定时器的实现鼠标随机移动和点击,采用基于线程的方式实现键盘的随机击键.表7总结了基于用户交互环境差异的反虚拟化对抗方法.

表8 基于用户交互环境差异的反虚拟化对抗方法

4 实验与分析

4.1 实验方案

实验使用的样本包括两个部分,来源为网络收集,组内已有样本和作者编写的样本.样本集一的分布如表9示,总计113个.其中包括2个开源反虚拟化软件pafish[10]和al-khaser[11],它们包含了多项针对主机环境差异和用户交互环境差异的反虚拟检测技术.除了针对QEMU,VMware,VBOX等常见虚拟化平的的反虚拟化样本外,还包括31个自编写样本,根据第2节总结的反虚拟方法,为每个检测项编写对应的反虚拟化样本作为补充,同时为了使样本具有”恶意功能”,样本在相应的反虚拟检测通过后,会表现出若干敏感行为,包括设置自身为开机自启动,访问baidu.com获取当前时间,启动记事本进程并在5秒后将其关闭及在系统目录创建名为invasion.txt的空文件.样本集二为随机选择的1274个样本,用于测试改进在真实样本上的效果.

表9 反虚拟化对抗实验样本分布

如果改进后的动态分析系统观察到更多的样本行为,则认为改进是有效的.样本行为数目统计样本的进程操作,网络访问,文件操作和注册表操作的数量.针对样本可能在不同的运行过程中访问不同站点,创建不同的文件名的临时文件等影响样本行为条目的随机性问题,在统计相同类型行为数量时,只关注行为操作对象的相异性,而不关注操作对象的具体值,如样本在一次运行过程中访问 A,B,C 3 个站点,在另一次运行过程中访问了 A,B,D 3 个站点,则认为样本两次运行产生的网络行为数目相同,都访问了3个不同的站点.

本文将反虚拟化对抗应用到组内已有的基于QEMU的恶意代码动态分析系统上,并进行改进前后对比实验.实验中每个样本的分析时间为默认的2分钟,虚拟机镜像为 Windows XP 32 位.

4.2 实验结果

将样本集上传到改进前和改进后的动态分析系统,然后下载XML格式的分析报告和网络数据包cap文件,统计样本的行为数目,进行对比分析.表10汇总了开源反虚拟化工具pafish和al-khaser在改进前后针对QEMU的检测项的通过情况,其中”X”表示未通过,“√”表示通过.可以看到,经过反虚拟化对抗,动态分析系统通过了pafish和al-khaser所有针对QEMU的反虚拟化检测项.

表10 pafish 和 al-khaser实验结果

表11展示了所有反虚拟化样本的实验结果(不计pafish和al-khaser).可见,改进后的动态分析系统在所有针对QEMU的作者编写样本和收集样本中都观察到了更多行为.而针对VMware和VBOX的反虚拟化样本则和改进前的分析系统表现相同,这是因为改进前后的动态分析系统都是基于QEMU的,针对VMware和VBOX的反虚拟化方法自然不起作用,因此改进后的动态分析系统并没有观察到这些样本的更多行为.

在样本集二中,378个样本观察到更多行为数据,为总样本数的29.7%..说明反虚拟化对抗使动态分析系统更全面的了解样本行为,同时也说明反虚拟化在实际样本中使用广泛.综合样本集一和样本集二的实验结果,反虚拟化对抗显著增强了动态分析系统获取样本行为数据的能力.

表11 反虚拟化对抗实验结果 (不计 pafish 和 al-khaser)

5 结论和展望

本文对当前针对恶意代码动态分析系统的反虚拟化方法进行了分类总结,提出从恶意代码动态分析系统的主机环境,网络环境和用户交互环境三个方面进行系统的反虚拟对抗的方法,并将反虚拟化对抗应用到已有的基于QEMU的动态分析系统上,实验结果表明反虚拟化对抗有效地帮助了动态分析系统对样本行为的全面了解.现代CPU功能强大,硬件逻辑复杂,又缺乏公开的指令设计文档,模拟CPU的指令执行效果难免会有与真实CPU出入的地方,从而成为恶意代码检测虚拟CPU的特征.本文目前没有对基于CPU语义差异的反虚拟方法进行对抗,这是未来工作方向之一.

猜你喜欢

进程虚拟化样本
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
基于OpenStack虚拟化网络管理平台的设计与实现
规划·样本
随机微分方程的样本Lyapunov二次型估计
社会进程中的新闻学探寻
俄罗斯现代化进程的阻碍
“官员写作”的四个样本
浅谈虚拟化工作原理
用户怎样选择虚拟化解决方案