基于虚拟机管理器层次的客户机行为监测系统

2018-06-19 12:57杨春雷周红建
计算机工程与设计 2018年6期
关键词:客户机断点管理器

银 伟,杨春雷,周红建

(95899部队,北京 100085)

0 引 言

传统的主机数据捕获方法主要基于Sebek实现[1]。Sebek运行在客户机层次[2],采用新的read()函数取代旧的read()函数实现击键记录和传送。它具有明显的指纹特征。一是新的read()函数与其它系统调用在内存中相距较远。二是Sebek是运行在内核中的模块,一旦攻击者攻陷了诱捕系统,就具有客户机操作系统管理权限,能够通过查找对内核中的Sebek模块或定位read()函数在内存的位置进行识别。一旦识别蜜罐,蜜罐就有可能失去它的价值[3]。因此,隐蔽的进行安全威胁数据捕获是蜜罐维护人员不懈的追求,而在虚拟机管理器层次对运行其上的客户机行为实现监测能解决被识别的问题[4]。

目前,Cuckoo[5]在虚拟机管理器上勾住客户机Windows的应用程序接口,通过截获系统调用对客户机行为进行监测,但是它们需要在客户机上安装代理,这种方式仍然不够隐蔽。Ether[6]利用客户机页访问错误会触发VMEXITs信号让虚拟机管理器接管进行处理的事实来有效地跟踪系统调用,但是这种方法在实现上存在着缺陷,在客户机层次能检测到Ether的存在[7]。CXPInspector[8]使用扩展页表访问错误来实现监测。扩展页表将客户物理内存地址映射到宿主机物理内存地址,任何对扩展页表的访问错误也会触发VMEXITs,由于扩展页表比Ether使用的客户机页访问低一个层次,这对于客户机来说不可见,可以实现主机行为的隐蔽捕获,但是,这种方法开销比较大。SPIDER[9]使用#BP断点注入技术对客户机进行了隐蔽调试,这种方法对于客户机来说不可见[10]。在本文中,我们将#BP断点注入运用到客户机行为监测中,设计了基于虚拟机管理器层次的客户机行为监测系统并进行了实现,能够跟踪客户机操作系统的执行路线,提取内核函数调用过程,捕获内核数据结构篡改,跟踪内核级文件访问,恢复内存中删除的文件以及跟踪网络流。

1 威胁模型

要详尽、全面地捕获客户机行为实现监测是一大难题,因为攻击者会使用各种技术手段来隐藏自己在主机上的行为和痕迹。在这节中,我们建立主机行为监测的安全威胁模型,并对攻击者主要的对抗技术手段进行讨论。

1.1 进程隐藏

系统管理员通常通过检测未知进程发现操作系统上的可疑行为。进程隐藏是防止使用工具对未知进程进行识别的一种方法,防止合法用户发现系统上的可疑行为。

在Linux操作系统上,一个进程是由进程控制块(PCB)、代码段和数据段组成,PCB是操作系统对每个进程的代码描述,操作系统用task_struct结构来描述PCB,多个进程则用双链表来组织,如运行状态的进程组成可运行队列。在操作系统上,用户可以通过操作系统提供的接口操作进程双链表结构来枚举操作系统上的进程,恶意软件可以通过将进程从链表中解除来隐藏进程。在Windows系统上,在用户级枚举进程通过调用NtQuerySystemInformation系统函数实现,恶意软件可以通过截获NtQuerySystemInformation系统调用来隐藏进程。系统函数调用机制涉及内核中多个重要的数据结构,如图1所示。其中中断描述字表寄存器(IDTR)是CPU中的寄存器,存有中断描述字表(IDT)的基地址。顺着基地址找到中断描述字表IDT,从IDT表中找到系统调用分发器(system call dispatcher)地址,再由系统调用分发器找到系统调用表(system call table),系统调用表存放的是系统调用的句柄,系统调用句柄指向系统调用代码段地址。攻击者主要有4种方法来实现系统调用的截获和篡改。①修改IDTR寄存器或者IDT表,使其指向一个恶意的系统调用分发器。②修改系统调用分发器,使其指向一个恶意的系统调用表。③修改系统调用表,使得指向一个恶意的系统调用句柄。④修改系统调用本身,实现隐藏进程的恶意行为。

图1 系统调用机制重要数据结构

1.2 内核模块及系统驱动隐藏

内核模块及系统驱动隐藏与进程隐藏相似,但是,这些组件是被加载到内核所占的内存空间中,并不占有独立的地址空间。而且即使在内核内存中将组件的句柄移除,这些组件仍然能够正常运行,而内核是完全感知不到这些组件的存在。举个例子,Linux某个内核模块被加载到内存,其代码段占据了某段内核地址空间。然后恶意攻击者从内核模块列表中将该模块的句柄移除,这将导致该模块对于内核不可见。

1.3 网络行为隐藏

攻击者可能会在系统上安装工具设置后门,在某个端口进行监听,再从外部连接到该端口对操作系统进行远程控制。为避免此类网络可疑行为被检测到,攻击者会将网络行为进行隐藏。当用户在操作系统上运行netstat命令查看网络连接时,攻击者通过修改和截获相关系统调用,隐藏系统上开放的连接和服务。

1.4 在内存中释放和删除临时文件

恶意软件的一个特征是在感染进程中快速创建和删除临时文件。这些临时文件可能包括解压的恶意软件二进制文件或者其它相关可供取证的文件。但是,恶意软件制作者为避免在操作系统上留下痕迹,不在磁盘上创建和删除文件,整个步骤都在内存中完成,使得安全人员事后很难进行取证分析。

2 设计目标

在虚拟机管理器层次构建一个平台,对运行于其上的客户机行为进行数据捕获和自动分析,实现透明性、有效性和安全性。

(1)透明性。客户机不能检测到虚拟机管理器监测系统的存在,即该监测系统对客户机上的攻击者和恶意代码来说是不可见的。

(2)有效性。平台能对客户机的行为进行深度观测,应该尽可能捕获详尽的不同纬度的运行信息,同时能够防止被恶意代码篡改,从而获取客户机精确的状态信息。

(3)安全性。客户机与虚拟机管理器监测系统完全隔离,防止恶意代码对分析环境进行篡改。

3 监测系统设计

虚拟机管理器层次客户机行为监测系统体系结构如图2所示。它运行在控制域(dom0),通过LibVMI库直接访问虚拟机的内存。该系统主要具备5个功能,对客户机5个维度的行为进行监测:①对内核函数调用进行跟踪。传统的系统调用监测只能监测到用户级的系统调用,不能监测到内核级的函数调用,因此不能监测内核级恶意代码的行为;②内核数据结构篡改跟踪,监测恶意代码对重要数据结构篡改行为;③在内核级对文件访问进行跟踪,避免用户级文件访问跟踪被恶意代码篡改问题;④对在内存中删除的文件进行恢复,应对恶意代码在内存中释放和删除中间文件;⑤在虚拟机管理器层次对网络流实施跟踪,防止攻击者在客户机层次对网络行为进行隐藏。

图2 虚拟机管理器层次客户机行为监测系统体系结构

为了能访问客户机中发生的事件,该系统通过断点注入(breakpoint injection)技术将虚拟机的控制(VMEXIT)传递给虚拟机管理器。断点注入是将一条“#BP”指令(INT3,指令码为0xCC)写入到虚拟机内存中感兴趣的代码处。当执行到断点时,配置CPU产生一个VMEXIT信号,并由Xen虚拟机管理器将该事件转发到控制域(dom0),因此该系统能够捕获虚拟机中执行的任何指令。目前“#BP”指令注入技术主要用在隐蔽调试技术中,被调试代码感觉不到它的存在。在我们的监测系统上,我们将其用来自动跟踪整个操作系统的执行,并发现它能很隐秘的进行虚拟机监测。通过这种手段,系统能洞察操作系统内核级和用户级的指令执行情况,实现透明性、有效性和隐蔽性。

4 实 现

由于黑客和恶意软件通常使用各种技术手段隐藏自己在客户操作系统上的行为,通过断点注入技术能够真实捕获到客户操作系统关键行为,从多维度反映客户操作系统正在发生什么,实现监测。在这节中,我们将讨论在32位和64位Windows7 SP1操作系统上实现的数据收集和监测技术。虽然目前原型系统主要基于Windows操作系统实现,但可以很方便地应用到Linux以及其它类型操作系统。

4.1 内核函数调用跟踪

已有的客户机监测系统是通过监测系统调用来跟踪进程的行为。但是,仅跟踪系统调用只能监测到用户级和系统级的交互,而监测不到内核级恶意代码的执行情况。为解决这个问题,我们的系统使用#BP断点注入的方法直接陷入内核内部函数。通过这种方法恶意驱动程序的行为也能被捕获到,而仅监测系统调用的方法不具备此项功能。

内核函数的定位是通过从内核调试数据中提取相关信息进行确定。使用调试信息是在取证分析中常用的一种手段,通过这种方法可以很方便的获取操作系统状态信息。在该系统中,我们使用Rekall取证分析工具处理Windows的调试信息,并建立了一个内核内部函数图谱。

为了确定内核在内存中的位置,我们发现Windows7使用FS和GS寄存器来存储内核虚拟地址。内核虚拟地址指向_KPCR数据结构。_KPCR数据结构通常被加载到内核中一个固定相对地址(RVA)。_KPCR数据结构由KiInitialPCR符号标识。由于我们能够在内核中获取KiInitialPCR的位置,然后减去该RVA值,就能够得到内核基地址。一旦找到内核基地址,该平台可以通过#BP断点注入技术捕获到所有的内核函数执行,当恶意代码被运行后,通过日志记录,能够将操作系统整个执行过程记录下来。

4.2 内核数据结构篡改跟踪

恶意代码经常修改内核重要数据结构来隐藏行为,称为DKOM攻击。DKOM攻击通常将一些重要的结构体实例从内核链表(如运行进程列表)中解除来避免用户通过枚举方法识别恶意的数据结构。通过取证分析工具,研究人员发现Windows内核堆中创建的对象通常被赋予一个头部_POOL_HEADER。该头部用4个字母对创建的对象进行描述。在物理内存中对这些字母进行穷举搜索能检测到从内核链表中被恶意代码解除的对象。

但是,恶意软件能够对头部中的字母进行改写,防止扫描工具发现[1]。也可通过为对象向操作系统请求大于4096字节的空间,实现隐藏。这是因为在应对大内存空间请求时,操作系统将对象放入大页池,而在大页池中不需要将头部附加到被分配的对象上。通过这个方法能防止在基础池中对头部进行扫描发现。

针对这些问题,我们提出一个方法来应对。DKOM攻击之所以难被检测,是因为隐藏对象在内核堆中的位置不可知。如果我们能精确定位隐藏对象的位置,就很容易检测到DKOM攻击[4]。攻击者虽然能隐藏恶意对象,但是这些对象在早期被分配内存的事实无法被掩盖。Windows内核中负责为数据结构分配内存的方法有AllocatePoolWithTag以及OnCreateObject,我们的系统对这些函数使用#BP断点注入,从而记录内核堆分配。在函数执行到入口时,该系统从调用线程的栈中提取返回地址,当内存分配函数返回时捕获到该事件并进行陷入。观察堆分配允许我们确定所有内核分配对象的位置,而恶意代码不能篡改对象分配的事实,因此通过该系统能实现对内核数据结构的全面掌握。

4.3 根据内存事件监测文件系统访问

已有的虚拟机监测机制主要通过修改磁盘仿真器并截获事件来实现对文件系统访问的监测。但在磁盘仿真器这个层级重构文件系统访问事件信息(文件路径和权限)需要预先知晓文件系统运行原理相关信息。我们的平台跟踪内核数据结构,能够为描述系统执行情况提供有用信息,例如运行的进程、内核模块,线程以及访问文件系统时系统分配的对象。

我们捕获了某个进程对文件系统进行访问的事件,如图3所示。当操作系统或者用户进程访问文件系统时,在内核堆中分配了一个_FILE_OBJECT对象,该对象被打上“Filxe5”的标签。当捕获到分配地址时,我们在扩展页表(EPT)中将对象所在的页标记为不可写。由于在内存中_FILE_OBJECT对象之前是一系列可选的对象头部(以黑色背景标出),我们可以从分配的内存末尾减去_FILE_OBJECT对象的大小得到访问权限标志(access flags)和文件名(FileName)的地址。这允许我们在不需要对底层文件系统做深入了解的情况下确定文件的路径以及访问权限(读、写、删除等)。

图3 通过监测_FILE_OBJECT对象内存分配实现文件访问监测

4.4 从内存中恢复已删除文件

恶意软件的一个特征是在感染进程中快速创建和删除临时文件。这些临时文件可能包括解压后的恶意软件二进制文件或者其它可供取证的文件,安装后恶意软件后会删除这些临时文件,避免被取证分析。由于文件并未写入磁盘。在控制域挂载虚拟机磁盘的方法不能访问到这些文件,唯一可行的方法是从内存中提取中间文件。

在系统中,恢复已删除文件主要通过截获内核删除文件的函数来实现,包括NtSetInformationFile以及ZwSetInformationFile函数。一旦函数被截获,就可以通过检查函数参数来获取文件和文件句柄。文件句柄不直接指向文件对象,它只是所属进程句柄表中的某条记录的编号。通过处理进程的句柄表,我们能够定位到相应的_FILE_OBJECT对象,并从内存中将其恢复。

4.5 跟踪网络流

客户机依托虚拟机管理器进行输入输出操作,这是因为虚拟机管理器给客户机提供虚拟输入输出设备。而真实的物理设备由虚拟机管理器和多个客户机共享,故虚拟机管理器可以利用这一点实现网络流量和击键的记录。

对输入输出进行监测其实就是在虚拟机管理器上窃听虚拟输入输出设备,并截获经过的数据。对网络流实施数据捕获,就是对虚拟机管理器的虚拟网卡实施窃听,并将监听到网络流写入文件。同时,监听CPU的CR3寄存器。这样,能够为每个独立的进程建立网络流量概览。将网络流与特定进程关联能实现细粒度的网络流监测。

5 实 验

5.1 客户机恶意代码执行监测

我们从ShadowServer[7]获取了1000个最近的恶意代码,在客户机上将每个恶意代码运行60 s,对操作系统内核函数进行断点注入。大约有162 123断点被击中,其中有68 865个是堆分配请求。图4列出了被调用次数最多的10个内核函数,其中堆分配函数占据了前三。因此这些函数可以被用来作为恶意软件识别的特征。特别的ExAllocatePoolWithTag被调用次数最多,如果能对该函数的断点注入进行优化,能显著提升我们系统的性能。

图4 调用的内核函数

该系统总共从内存中恢复了9875个被删除文件。在图5 中我们将这些文件进行分类,发现ASCII文件和PE32执行文件大约占到50%。我们将1543个PE文件提交给VirusTotal[8]。其中643个是未被发现的新文件,这些新文件都用反病毒软件进行查杀,其中20.5%被发现是恶意的软件。

图5 从内存中恢复的文件数

5.2 监测系统性能评估

根据Windows7 SP1调试信息,我们对x86版本的10 853 个函数进行断点注入,对x86_64版本的11 011个函数进行断点注入。此外,还对扩展页表EPT设置了只执行标志,将系统运行了60 s,不运行其它应用软件,观察有多少个VMEXITs事件被触发。根据实验发现,在x86系统上有727个页面发生了陷入,而在x86_64系统上有915个页面发生了陷入。如图6所示,对于x86和x86_64系统来说断点是触发VMEXITs的主要原因,而读EPT触发的VMEXITs仅仅是少数。

图6 VMEXITS事件的原因

为了测量断点触发VMEXITs带来的时间开销,我们根据SPIDER[6]使用的方法。在客户机上运行一个程序,这个程序循环调用一个函数,该函数每执行一次增加一个计数器的值。在启动循环之前和循环结束之后,程序读取TSC寄存器获取CPU周期值,得到函数执行时间,对该函数进行陷入和非陷入分别进行测量函数执行时间,将这两个值相减得到差值便是开销,通过测量发现VMEXITs开销大概为10 523个CPU周期。

6 结束语

位于客户机层次的监测系统容易被攻击者识别,本文提出基于虚拟机管理器层次的客户机监测系统,并对系统进行设计、实现和实验验证。该监测系统能跟踪内核函数调用、内核数据结构篡改,根据内存事件捕获文件系统访问、从内存中恢复已删除文件以及跟踪网络流,从而从多维度分析、刻画系统行为。该监测系统对客户机来说是透明的,客户机与监测环境完全隔离,能保证监测数据的完整性和安全性。

参考文献:

[1]WANG Li,WAN Yuanchun,QIU Weidong.Android malware dynamic analysis based on honeypots[J].Application of Micro-Computer,2016,32(11):50-53(in Chinese).[王力,万园春,邱卫东.基于蜜罐的Android恶意代码动态分析[J].微型电脑应用,2016,32(11):50-53.]

[2]CHEN Cuiyun,LIANG Huaqing.Enhance snort detection capability based on honeypots[J].Electronic Design Enginee-ring,2016,24(4):48-51(in Chinese).[陈翠云,梁华庆.基于蜜罐提升snort检测能力的设计[J].电子设计工程,2016,24(4):48-51.]

[3]GUO Junquan,ZHUGE Jianwei,SUN Donghong,et al.Spampot:A spam capture system based on distributed honeypots[J].Computer Research and Development,2014,51(5):1071-1080(in Chinese).[郭军权,诸葛建伟,孙东红,等.Spampot:基于分布式蜜罐的垃圾邮件捕获系统[J].计算机研究与发展,2014,51(5):1071-1080.]

[4]WANG Jie,YANG Liu.Design and implementation of a intrusion detection system based on honeypots[J].Computer Application Research,2012,29(2):12-15(in Chinese).[汪洁,杨柳.基于蜜罐的入侵检测系统的设计与实现[J].计算机应用研究,2012,29(2):12-15.]

[5]Bremer J.Blackhat 2013 workshop:Cuckoo sandbox-open source automated malware analysis[EB/OL].[2013-05-17].http://cuckoosandbox.org/2013-07-27-blackhat-las-vegas-2013.html.

[6]Dinaburg A,Royal P,Sharif M,et al.Ether:Malware analysis via hardware virtualization extensions[C]//Proceedings of the 15th ACM Conference on Computer and Communication Security.New York:ACM,2013.

[7]WANG Chaojie,HUANG Yuda,ZHAO Hongzhuan.A smart traffic defense methodbased on two layer dynamic honeypots[J].Computer Application Research,2015,32(7):23-26(in Chinese).[王超杰,黄宇达,赵红专.基于双层动态蜜罐技术的智能交通主动防御方案[J].计算机应用研究,2015,32(7):23-26.]

[8]Willems C,Hund R,Holz T.Cxpinspector:Hypervisor-based,hardware-assisted system monitoring[C]//Proceeding of Technical Report.England:IEEE,2013.

[9]Deng Z,Zhang X,Xu D.Spider:Stealthy binary program instrumentation and debugging via hardware virtualization[C]//Proceedings of the 29th Annual Computer Security Applications Conference.Singapore:ACM,2013.

[10]Dolan-Gavitt B,Srivastava A,Traynor P,et al.Robust signatures for kernel data structures[C]//Proceedings of the 16th ACM Conference on Computer and Communications Security.Toyama:ACM,2015.

猜你喜欢
客户机断点管理器
应急状态启动磁盘管理器
一类无限可能问题的解法
Windows文件缓冲处理技术概述
主导电回路发生断点故障判断方法探讨
高集成度2.5A备份电源管理器简化锂离子电池备份系统
TKScope仿真调试Cortex-M3内核的高级手段
基于属性重要性的贪心算法的改进算法
瘦客户机:安全与便捷的选择
升腾瘦客户机借神码翱翔“云端”
基于Web数据提高访问速度的方法