2. 信息保障技术重点实验室, 北京 100072;
3. 河南省人民检察院, 河南 郑州 450000
2. Science and Technology on Information Assurance Laboratory, Beijing 100072, China;
3. People's Procuratorate of Henan Province, Zhengzhou 450000, China
由于数据隐藏、数据格式转换等反取证技术[1]的普遍采用,传统的基于磁盘文件系统的取证技术难以再有效提取相关数字证据.而数据在内存中往往以解密的、脱壳的形式存在;且内存中包含密钥、进程、网络链接等许多与系统运行状态相关的关键信息[2].研究内存取证技术,可以很好地弥补传统计算机取证技术的不足,对打击网络犯罪意义重大.
早期的内存取证技术多采用after-the-fact[3]的方式,取证过程包括内存获取及内存分析2个阶段[4-5].然而许多网络攻击(如Rootkits)在攻击周期的大部分时间内都保持静默,必要时才发起攻击,而且这种攻击往往具有瞬时性.传统的内存取证技术无法及时检测到这类攻击,更无法及时确定攻击的发起者.因此,研究人员更多地着眼于在线内存取证[6].
在线内存取证的途径主要包括2种:1)调用操作系统提供的软件接口或内核对象直接访问并分析内存内容.该方法简便易行,适用性强,但取证工具位于操作系统内部,易被攻击者干扰并绕过;同时由于这种方法不能及时更新内核对象的内容,从而依然无法有效截获瞬时性攻击行为. 2)利用虚拟机监控器(virtual machine monitor,VMM). Type-ⅠVMM[7]直接运行在硬件之上,拥有比操作系统更高的特权级,可直接访问物理内存,且具有较高的安全特性.利用VMM进行内存的提取及分析,不必中断系统的正常运行,且不会干扰内存状态,由此获得的电子证据具有较高的真实性及准确性.由于VMM天然优势,许多研究依托该平台实现其取证方法.
利用VMM进行内存取证的另1个优势在于VMM可管控操作系统对硬件资源的访问,如内存的读写,特权寄存器的修改等.当某些硬件事件[7]发生时,系统会陷入VMM,此时VMM可对该事件进行处理.若某恶意程序在实施攻击行为过程中,发起的硬件事件触发了VMM,则可在此时利用VMM对内存状态进行检查分析.基于这一设想,本文提出一种实时内存取证方法(real-time memory forensics, RTMF). RTMF在VMM中设置关键内存页面的访问权限,对内存访问这一硬件事件进行监控,可实时记录内存被修改的情况,并即时对违规访问者的具体情况进行分析.实验结果表明,该方法引入的性能开销在可接受的范围内.
1 相关工作现有的在线内存取证技术可归纳为异步和同步2类.异步在线内存取证不需要时刻检查内存的状态,常见于一些周期性检测及度量的工具中. Copilot[8]便是以直接内存访问(direct memory access,DMA)方式周期性地获取内存快照,该方法基于内核控制流完整性度量规则对内存快照进行分析,目的是检测发现Rootkits攻击.由于该项技术是通过检测静态内核数据的变化来检测攻击,因而无法应用至动态内核数据的检测中.另外,这种方法依赖周期性内存快照获取,它无法捕获或阻止入侵行为的发生,只能事后对入侵进行检测. SBCFI[9]借助Xen和VMware Workstation 2类虚拟机监控器实现对内核控制流完整性的周期性检测,首先检测内核代码是否被修改,然后遍历堆栈查找所有有用的函数指针,确认其是否被修改. Osck[10]借鉴SBCFI的思想,除监控控制流转移外,还对非控制数据的属性进行验证. HookScout[11]通过动态二进制分析生成策略库,据此周期性检测攻击行为.由于基于控制流篡改的Rootkits可以在2次检测之间完成攻击行为,并消除其攻击痕迹,因此上述3种检测方法极可能出现漏报现象.
同步在线内存取证多借助虚拟化技术完成对内存状态的实时监控. KernelGuard[12]在QEMU VMM中干预客户机二进制翻译过程,实现对与内存访问相关指令的监控,从而动态阻止对于受保护内核数据所在内存区域的恶意访问,这种方法不需要对客户操作系统造成任何改变.不足之处在于该方法基于软件模拟器实现,需要对每一条相关指令进行监控,会引入较大的性能开销. HVI[13]在主机上部署嵌套hypervisor,对L1层hypercall注入#BP(break point)异常,在L0层(最底层)拦截客户机的硬件行为,包括对特定内存区域的写操作.这种方法在VMM中监控客户机内存的同时,还可检测并防御针对VMM的Rootkits攻击,但由于嵌套VMM的使用,实现较为复杂,性能开销较大. Azab等[14]提出了基于虚拟机监控器的完整性度量架构HIMA,主动监控虚拟机内部事件,包括系统调用中断和异常.缺点是这种方式对虚拟机的性能影响较大,只要虚拟机有系统调用发生,虚拟机就会陷入VMM进行相应的处理.
此外,许多同步在线内存取证技术借助扩展页表(extended page table, EPT)[15]机制实现对内存的监控.这些技术通常事先设置EPT表项的访问属性;违规的内存访问行为会触发EPT violation,并进一步产生VM Exit,由此实现对客户机的监控. HyperTap[16]借助EPT violation拦截线程切换、快速系统调用、内存映射I/O、指令执行等,在此基础上设计了一个兼具可靠性与安全性(reliability and security, RnS)的监控系统,并实现了对客户机挂起、隐藏rootkits、权限提升的检测. Zhong等[17]通过将EPT表项设置为只读来监控OS页表的更新.设置完成后,每1次页表修改都会导致页故障,VAIL由此来精准地更新其私有页表. Yu等[18]将这种方法推广至整个内存空间,设计了一个原型系统,通过将所有EPT表项设为只读来转储物理内存内容,并在之后的研究中对其进行了优化[19].
EPT violation发生后,为确保客户系统正常运行,相应EPT表项的写保护限制需被暂时取消,而上述研究的一个共性问题即未提出合理的方法在1次EPT violation后及时恢复EPT访问属性设置,这可能导致监控系统无法有效拦截下次违规访问行为.
Cheng等[7]提出的半同步式内存监控方法提出了解决该问题的方法.通过监控控制寄存器CR3的值判断进程切换,并在每次进程切换时重设相应页面的EPT访问权限.这在一定程度上提高了系统的监控准确率.但由于在不进行进程切换的情况下,同一进程可针对同一页面发起多次违规访问行为,故该方法仍未能完全解决上述问题.此外,该方法根据违规访问情况进行攻击行为及攻击载体的分析,但只针对部分内核页面进行监控,不能检测对于用户数据的窃取及篡改行为;对攻击载体的分析也不够全面.
2 RTMF总体框架蜜罐机制事先经设计者精心布置,故意暴露一些系统漏洞,以引诱攻击者进入.一旦攻击者对蜜罐系统发起攻击,其攻击信息即被记录下来.从业人员可对蜜罐系统记录的数据进行分析,从而了解攻击者的攻击行为及原理.蜜罐机制主要包括2个阶段,蜜罐环境配置与攻击信息分析.本文将RTMF设置在VMM层,并借鉴蜜罐机制的思想,将其划分为2个阶段:蜜罐配置与取证分析,如图 1所示.
![]() |
图 1 RTMF总体框架 Fig. 1 Main architecture of RTMF |
蜜罐配置阶段包含EPT设置模块以及页面跟踪模块. EPT设置模块利用Intel提供的扩展页表机制,针对内核静态页、用户数据页分别设置不同的访问权限,当访问者对上述页面进行违规访问时,会触发EPT violation,随即产生VM Exit陷入VMM.本文给出不同情况EPT violation的分析,并针对不同陷入情况给出对应的处理方法.页面跟踪模块通过在VMM中监控部分内核函数,负责识别用户进程的加载、终止,以及进程占用的物理页面的分配与释放.其目的在于实时更新用户数据页面范围.当用户数据页面范围变动时,页面跟踪模块及时通知EPT设置模块,对相应页面的访问权限进行设置.
取证分析阶段的功能由2个模块实现:1)内存行为分析模块,2)攻击载体分析模块.内存行为分析模块包含原始页面复制、修改位图生成2个子模块,在违规写访问发生时,复制故障地址所在页面的内容;访问操作完成后,比较当前页面内容与保存的原始页面内容,生成页面的修改位图,对攻击者的行为进行取证.攻击载体分析模块基于一定的准则,有针对性地提取一些内存片段,并通过语义重构对违规访问者的情况进行具体分析,判断攻击的发起者,攻击者的详细信息(名称,文件路径等),以及攻击的形式、方法.本文在第3、4这2节中对RTMF 2个阶段功能的具体实现进行描述.
3 蜜罐配置本文基于一种轻量级虚拟机监控器BitVisor[20]实现RTMF方法.本节将待配置访问权限的内存页面分为2类——内核静态页面及用户数据页面,并在3.1节中对2类页面的具体监控范围进行介绍.
3.1 内存监控范围 3.1.1 内核静态页面张贵民等[21]通过分析目前Linux系统中28种常见内核级rootkits,证明82%的攻击涉及内核控制型数据或内核代码的篡改.本文选择这部分数据所在内存页面进行监控.内核控制数据包括系统调用表(system call table,SCT)、中断描述符表(interrupt descriptor table,IDT)等.内核静态页面在内核初始化时即被分配,且在系统运行过程中保持不变. Linux将一些内核符号导出到system.map文件中,自该文件可读取待监控内核数据的虚拟地址空间范围.
3.1.2 用户数据页面用户数据通常以用户进程为载体被加载至内存中.与内核静态页面不同的是,用户数据页面自目标进程加载时被分配,随目标进程的终止而被全部释放;在进程运行期间,用户数据页面还存在正常的分配与释放.本文通过监控与进程加载、终止、调整内存空间等操作相关的内核函数,实现对用户数据页面的实时跟踪,并及时设置其EPT访问权限.待监控的内核函数及其功能如表 1所示.
![]() |
表 1 被监控的内核函数及其功能 Table 1 All of monitored kernel functions and their functionalities |
本文借鉴指令替换与仿真的思想,在VMM中监控内核函数.被调用函数入口指令通常为“0x5589e5”, 实现保存当前栈帧基址寄存器与栈顶寄存器内容的功能. RTMF将待监控内核函数的入口指令替换为VMM敏感指令VMCALL[15](0x0f01c1).当内核函数被调用时,VMCALL指令的执行会触发VM Exit[15],由此可完成对内核函数的监控.为保证内核函数的顺利执行,需在VMM中对内核函数原入口指令进行仿真.
其中,do_execve与putname同时被监控以识别进程的加载. do_execve被调用以加载进程,但当RTMF监控到do_execve时,进程内存空间刚刚开始建立,此时还无法获悉其准确的内存页面范围.为解决这一问题,在监控到do_execve后,RTMF立即监控putname函数的调用. putname在do_execve后被调用,完成进程加载后的一些环境清理工作.若do_execve、putname被连续调用,证明进程内存空间已被完整建立. RTMF根据do_execve函数的参数判断调用者是否为目标进程;若是目标进程,则记录CR3寄存器值.该值对应进程的页目录基地址,具有唯一性,可用来标识进程.进程加载时,其代码段、数据段的内容被调入内存,且在进程运行期间保持不变.因此,一旦目标进程被加载,即可计算其代码段、数据段占用的页面,并设置访问权限.
此外,进程调用sys_brk与do_exit,分别完成其用户空间的动态调整与释放.故RTMF选择这2个函数进行监控,以实时跟踪用户数据页面的变动情况.当上述2个函数被调用时,RTMF比较CR3值,若该值与记录值相同,则证明调用者为目标进程,此时可通知EPT设置模块更新待监控页面范围.
3.1.3 小结RTMF选择上述内存区域进行监控,主要是针对2类攻击进行取证分析:一类是内核级rootkits,通过劫持中断处理函数、劫持系统调用表、劫持系统调用函数体等内核函数或函数指针,来完成权限提升、隐藏内核对象、安插后门等恶意功能;另一类是针对用户数据的窃取或篡改.若某攻击者获取内核权限,可不受限地访问、修改guest OS,则可假设其采用的手段或目的符合上述2类攻击之一.
RTMF在一个安全的环境中读取system.map文件的数据并保存至VMM中;而VMM是先于系统启动的,因此系统一旦启动,上述内存区域已经被RTMF“保护”起来.如果攻击者企图修改上述内存区域的数据,RTMF便能监控到这一过程并记录下来(因为RTMF是一个取证方法,因此目前只针对攻击进行取证分析.如有必要,还可进一步将数据复原).那么既能保证从system.map中读取的数据的正确,又能保证guest OS中待监控的数据的正确,避免了两者数据不一致而导致RTMF监控失效的情况.
3.2 基于EPT的内存访问权限控制EPT(EPT是x86架构下实现内存虚拟化的一种机制,需要Intel VT支持.)是实现客户机物理地址空间隔离的一种机制,其实现原理与x86/x64体系下的分页机制类似.当客户机软件发出指令访问内存时,客户机生成客户物理地址(guest physical address,GPA);EPT页表结构定义在主机端,处理器接收到客户机传来的GPA后,通过EPT页表结构转换为主机物理地址(host physical address,HPA)从而访问平台上的物理地址.通过对EPT页表项相应位的设置,可控制HPA的实际访问权限. RTMF将待监控的内核静态页的EPT访问权限设置为可读/执行、不可写,将用户数据页的EPT访问权限设置为可执行、不可读/写.由此完成对上述页面非法访问的监控.当访问者违规对HPA进行访问时,会产生EPT violation,该故障可触发VM Exit而陷入VMM.
基于EPT的内存访问权限控制存在以下2个问题:1)每个EPT页表项对应1个完整的内存页,对某一HPA的访问权限设置会同时影响到该页面内其他HPA.而上述数据,以系统调用表为例,往往不能完全占据1页空间.这意味着当被监控的页面内的其他无关数据被访问时,也会引发EPT violation;又引发EPT violation的事件除违规访问外,还包括缺页异常.
也就是说,EPT violation故障原因可能与本文监控目的无关. 2)当EPT violation触发VM Exit后,为保证系统正常运行,需取消对应页面的访问限制.为了再次拦截非法访问操作,需要在1次访问操作完成后,及时恢复对应页面的访问权限设置.上述2个问题是内存访问权限控制的关键所在.
针对第1个问题,RTMF对EPT violation的原因进行具体分析,然后进行相应处理.虚拟机控制结构(virtual machine control structure,VMCS)[15]中的exit qualification字段记录了VM Exit的原因,根据字段相应位可判断引起故障的原因是缺页异常,还是违规操作(读/写/取指).基于EPT的页面访问权限控制流程详如图 2所示.当EPT violation发生时,首先判断故障地址是否位于目标页面,若位于目标页面,则判断触发故障的原因是否缺页异常.若为缺页异常,则为故障地址所在页面建立映射;否则判断故障地址是否位于目标页面的指定范围.若是,且触发故障的操作为写操作,则记录当前页面内容,否则直接取消页面的访问限制即可(若故障地址位于目标页面的指定范围之外时,这种情况下的EPT violation与本文监控目的无关,故在故障处理阶段只赋予访问者以相应的访问权限,不进行后续的取证分析工作.若故障地址位于目标页面指定范围,且CR3寄存器值与目标进程相同,则证明当前为目标进程正常对其内存空间进行访问或修改,这种情况也不进行后续的取证分析工作.这样避免了系统误报的可能.).
![]() |
图 2 页面访问权限控制流程图 Fig. 2 Control flow graph of page access permission |
本文利用MTF-trap[15]功能解决第2个问题. MTF-trap是VMM进行调试的一种手段,通过将VMCS中的primary processor-based VM-execution control字段的“monitor trap flag”位置1,VMM可在VM Entry[15]时在当前客户机第1条指令之后插入1个MTF VM Exit事件.当客户机指令执行完成,MTF VM Exit事件被触发,立即再次陷入VMM.在MTF VM Exit的处理函数中,可重置页面访问权限.需要注意的是,若MTF-trap机制一直处于开启状态,则客户机每执行1条指令,就会产生至少1次VM Exit,这会大大增加系统的性能开销.因此当故障地址位于目标页面时,在EPT violation的处理函数中,开启MTF-trap机制;当对应指令被执行完成,MTF VM Exit被触发时,再在对应的处理函数中关闭MTF-trap.
4 取证分析取证分析阶段主要完成对内存行为及攻击载体的分析.攻击行为始终无法避免对内存进行操作,如hook需要对函数入口及函数指针进行修改,ROP[22]需要扫描程序代码,提取指令片段,构建恶意代码等. RTMF首先在模块①中记录并分析访问者对内存的操作,同时唤醒模块②,通过语义重构等手段,分析攻击者的详细信息.
4.1 内存行为分析当针对被监控范围内的某地址发起的违规写操作触发EPT violation时,RTMF首先向VMM专用内存区域申请空闲的1页,然后将故障地址所在页面的内容复制到该空闲页中.根据程序局部性原理,可推定在一段连续时间内,对某页面进行访问操作的应是同1个访问者.在这种情况下,则无需在每次违规写操作发生时,都向空闲内存申请页并复制原始页面内容,否则会造成不必要的性能损耗.在处理EPT violation时,若当前CR3值与上次故障产生时CR3值相同,则证明触发2次故障的为同一访问者,此时不需复制当前页面内容;若CR3值发生了变化,才执行上述步骤.在向内存新申请空闲页时,将上次申请的内存页释放掉.在每次写操作对应的客户机指令执行完后,RTMF在MTF VM Exit的处理函数中将当前页面内容与被保存的原始页面内容进行逐字节对比,最终以位图的形式呈现对比结果.
若故障地址位于内核静态页面,则对应攻击应为hook攻击.以SCT所在页面为例,其对应的修改位图可指示被篡改的系统调用表项,篡改后的地址指向一片新的内存区域,该区域存放的代码可实现恶意提权,操纵内核对象等威胁系统安全的功能.
若故障地址位于用户数据空间,且访问操作为写操作时,则可断定该访问者正在篡改用户数据.若访问地址位于堆栈段及代码段,则该访问者可能通过篡改进程源码,达到使进程自动泄露隐私数据的目的.若访问操作为读操作,且访问地址位于用户进程空间的数据段,则该访问者在窃取用户数据;若访问地址位于代码段,则访问者可能在提取gadgets,为实施ROP攻击做准备.
4.2 攻击载体分析攻击载体分析模块识别违规访问者,以及访问者实施攻击的原理及方式.本文将攻击载体分为恶意进程和恶意模块2类.
恶意进程若要访问内核静态页面或其他用户的页面,需进入内核态.以获取进程信息的过程为例,简述RTMF是如何有针对性地提取内存片段,并进行语义重构的. Linux为每个进程准备了1个thread_info结构,该结构与进程的系统堆栈共用8 KB的物理内存.当违规访问内存空间时,根据栈顶寄存器(ESP)与thread_info结构的关系,可定位该结构.而thread_info结构的task指针指向其task_struct结构,因此,RTMF可直接从目标task_struct处起提取内存片段,而不需要获取整个内存镜像.上述过程如图 3所示.接下来以task_struct结构为模板,根据结构中字段的定义及偏移信息,利用虚拟机内省[15](virtual machine introspection, VMI)机制,对数据进行语义重构.
![]() |
图 3 定位进程控制块示意图 Fig. 3 Schematic diagram of locating process control block |
本文通过监控load_module函数(表 1第5项),完成对恶意模块的拦截. Load_module将模块内容从用户空间复制到内核空间.若在load_module函数被监控到的同时,内存行为分析模块发现违规访问行为,则该违规访问行为可能与正在插入的内核模块相关.为验证这一点,可根据函数相关参数,获得模块内容所在内存区域的地址,继而完整提取模块内容.提取出的模块内容中包含模块名,模块路径,以及模块代码等.根据其可执行代码,可对攻击行为进行佐证——如果模块代码中的确存在与违规内存访问行为相关的片段(例如某地址处内存数据被违规改写,经分析模块代码,发现其中存在修改上述地址处数据的指令片段),则证明该访问行为是由模块发起的;否则说明此次模块插入是合法的,与违规内存访问行为无关.同时可分析攻击的原理及方式.
本文通过监控load_module函数(表 1第5项),完成对恶意模块的拦截. load_module将模块内容从用户空间复制到内核空间.若在load_module函数被监控到的同时,内存行为分析模块发现违规访问行为,则该违规访问行为可能与正在插入的内核模块相关.为验证这一点,可根据函数相关参数,获得模块内容所在内存区域的地址,继而完整提取模块内容.提取出的模块内容中包含模块名,模块路径,以及模块代码等.根据其可执行代码,可对攻击行为进行佐证——如果模块代码中的确存在与违规内存访问行为相关的片段(例如某地址处内存数据被违规改写,经分析模块代码,发现其中存在修改上述地址处数据的指令片段),则证明该访问行为是由模块发起的;否则说明此次模块插入是合法的,与违规内存访问行为无关.同时可分析攻击的原理及方式.
5 实验评估本文的实验环境配置如下.
软件配置:Linux 3.2.0 -29-generic-pae;Ubuntu 12.04 LTS 32位;Gcc 4.4.3;GNOME 3.4.2.
硬件配置:Intel(R) Core i7-4770,八核CPU(含Intel VT支持);CPU频率3.4 GHz;内存16 G.
VMM:BitVisor 1.4.
5.1 功能测试为验证RTMF功能的有效性,本节首先利用2个攻击样例,get_root_SCT及hexedit,分别对经过EPT访问属性设置的内核静态页及用户数据页进行违规访问,根据结果判断RTMF能否成功配置蜜罐以及能否成功对攻击行为及攻击载体进行取证分析.然后,选用8个有代表性的攻击样例测试RTMF的通用性,并将RTMF对上述攻击样例的检测效果与周期性度量工具Copilot及实时rootkits检测工具HookSafe[23]进行对比.
Get_root_SCT以可插入内核模块的形式,通过修改某系统调用表项,将原系统调用处理函数替换为一段恶意代码,实现root提权的功能.在开启RTMF机制的系统中插入该内核模块,则内存行为分析模块通过比较被访问前后页面内容,得出如图 4所示的修改位图.其中,0x000代表页面起始地址(在系统调用表页面中对应0x15b0000).由图 4可知,地址0x15b0094处的内容由正常系统调用sys_kill的函数入口地址改成了另一个地址0xf8551000.推测该地址为get_root_SCT向内核安插的一段实现恶意功能的代码的首地址.可在攻击载体分析模块生成的结果中对该推测进行验证.
![]() |
图 4 被监控内核页修改位图 Fig. 4 Modified bitmap of monitored kernel page |
攻击载体分析模块监控到load_module函数的调用,即将模块内容完整地提取出来,并将其整合为1个二进制文件.实验中利用IDA Pro对该二进制文件进行反汇编操作,并将其中的关键代码提取出来,如图 5所示.
![]() |
图 5 提取的内核模块代码片段 Fig. 5 Code segments of extracted kernel module |
图 5(a)中,模块首先调用read_proc_kallsyms函数读取系统调用表的地址,并将系统调用表第148(0x94)项,即sys_kill的入口地址保存在变量orig_kill中.语句g中对应内存行为分析模块得出的结果,即模块将sys_kill对应的系统调用表项修改为另一函数的地址.图 5(b)是函数hacked_kill中的一些关键片段,hacked_kill首先对函数的2个参数进行判别,当其满足一定条件时,函数调用prepare_kernel_cred及commit_creds 2个函数,实现权限提升功能;若2个参数中任一不满足条件,则跳转至orig_kill保存的函数入口地址处,完成正常的系统调用功能.通过对攻击载体分析模块生成的结果的分析,可验证先前的推测,并得出模块实现恶意提权功能的原理.
然后利用hexedit对目标进程空间进行违规访问.目标应用程序选择1个简单的“helloworld”程序,其功能为输出1个全局变量的虚拟地址.
为达到测试目的,专门编写了1个能够映射所有内存内容的字符设备文件/dev/dram,并利用二进制编辑软件hexedit对该字符设备文件进行操作,从而实现读写内存的功能.在hexedit中修改全局变量内容,此时内存行为分析模块给出如图 6所示的修改位图.由图 6可知,除目标范围内有内容被修改外,目标页面内的其他地址处也被修改,这些地址属于其他进程的地址空间,在由hexedit的违规写操作触发EPT violation的同时,其他进程也进行了相应的写操作.
![]() |
图 6 被监控用户页修改位图 Fig. 6 Modified bitmap of monitored user page |
攻击载体分析模块对hexedit进程的主要信息进行了提取分析,分析结果如图 7所示.其中,“accessor CR3”可用于内存行为分析模块中进程切换的判别;“program position”揭示了进程加载的应用程序在磁盘上的位置,便于对进程追踪溯源;“open files”可显示进程在运行过程中打开的所有文件,根据这些文件是否异常可判别进程是否有越权行为.此外,攻击载体分析模块还可提取分析进程的网络链接,以及进程的代码段、数据段、堆栈段等,此处不再赘述.
![]() |
图 7 提取的进程基本信息 Fig. 7 Basic information of extracted process |
为进一步验证RTMF的通用有效性以及实时取证功能,本文选择8款Linux下的真实攻击样例,并对其中一些样例进行修改以使其适应Linux 3.2内核;然后将RTMF对这些rootkits的检测结果分别与周期性度量工具Copilot、实时rootkits检测工具HookSafe进行对比.测试中设置Copilot的检测周期为5 s,攻击样例在[1.5 s, 3 s]活动,在[3.5 s, 4.5 s]内停止活动并消除痕迹.
攻击样例及检测结果如表 2所示.其中,前6项攻击样例为内核级rootkits[9, 24],这些rootkits涵盖了常见的攻击手段与原理,具有广泛性和代表性. eNYeLKM 1.2直接修改内核代码,通过替换IDT的0x80处的syscall子程序的若干字节和sysenter入口函数的若干字节,使用户请求的某些系统调用转向攻击者预先设定和处理的函数;wnps与eNYeLKM类似,也是通过修改内核代码段内容而实现攻击. Kbeast通过修改内核系统调用表的若干项,实现隐藏自身、隐藏文件目录、隐藏进程、提升权限等功能. Mood-nt 2.3经由/dev/kmem接口直接修改内核内存区域,是一种融合了return-to-libc[25]策略的内核级攻击.具体来讲,它首先修改某函数指针,如某系统调用表项,使其指向内核函数vmalloc.然后invoke系统调用,该内核函数被执行而为rootkits向内存合法申请一块连续的区域;最后rootkits再通过/dev/kmem将自身的恶意代码复制到这块内存区域中,从而成功完成内核恶意代码注入.SucKIT 1.3b与mood-nt 2.3类似,通过将系统调用表某表项重定向至内核函数kmalloc,使其在用户空间即能够调用内核函数完成攻击功能. Adore-ng 0.56不对系统调用进行hook,而是hook一系列内核函数,包括proc_root_inode_operations->lookup,proc_root_operations->readdir,ext3_dir_operations->readdir等,获取必要的内核执行控制权,以隐藏特定的与rootkits相关的文件、进程以及网络链接.上述用于测试的rootkits样例攻击方式可总结为3类:修改内核代码、修改系统调用表及hook内核函数(修改函数指针),可基本涵盖当前内核级rootkits的攻击方式.
![]() |
表 2 RTMF及其他工具对多种攻击样例检测结果 Table 2 Detection results of RTMF and other detecting tools for multiple attacks |
Fileview是与hexedit类似的1款二进制编辑软件,本文利用该软件通过字符设备文件/dev/dram对进程用户空间的数据进行修改. 表 2第8项为文献[26]中的一个采用ret2user策略的攻击样例,该样例通过操作系统漏洞向内核传递一个精心准备的参数,实现对操作系统内核控制数据的篡改(不直接修改内核函数指针,而是通过传递参数,使操作系统自发选择另一条执行路径,从而间接实现内核控制流的“篡改”,并未破坏内核的完整性),而进一步以内核态执行攻击代码.本文使其篡改应用程序的隐私数据.
表 2中Copilot及HookSafe工具的检测结果出自其各自文献.检测结果“√”表示工具成功检测攻击,“×”表示工具未能拦截攻击,“-”表示该工具未对相应攻击样例进行测试.由于周期性度量工具Copilot存在TOC-TOU问题,当攻击样例在其2次度量点之间活动并消除痕迹时,其无法成功检测任何攻击.而实时取证工具RTMF与实时检测工具HookSafe检测效果与攻击样例的活动周期无关,一旦攻击被实施,该2个工具即可检测到.通过此项对比可突出RTMF的实时性. HookSafe只保护内核完整性,无法保证用户空间数据的安全,表 2中后2项攻击均针对用户空间发起,因此HookSafe无法检测.与其相比,RTMF对内存攻击的检测更为全面.
RTMF对内存页面进行监控,而攻击不论采取哪种手段,只要其无法避免要对内核页面或用户数据页面进行修改,即可被RTMF检测到.因此RTMF是能够检测发现未知的攻击的.
5.2 性能测试测试过程借鉴文献[9, 24]的做法,采用UnixBench作为微基准测试集,测试RTMF对系统整体性能造成的影响,测试结果见表 3. 表 3中第1列为测试项,其中file copy在默认时间内将1个文件的内容复制到另一个文件,记录被重复读、写、复制的字符数量. pipe throughput测试1 s内1个进程写512 bits到管道中并读回的次数,process creation测试1个进程能产生子线程并立即退出的次数,新进程的创建会造成进程阻塞及内存占用. Shell脚本测试1个进程在1 min内可以启动并停止shell脚本的次数,该脚本实现转化数据功能,是1项综合型的测试指标.表格2~4列,Linux表示未安装VMM的系统,BitVisor表示安装VMM的系统,RTMF表示安装VMM且开启RTMF机制的系统,3个系统对应的测试结果为指数值,该值是UnixBench将真实测试结果与1个基线系统测试结果比较得到的,且该数值越大,代表对应测试项性能越优.表5~6列为性能比,其中第5列以纯Linux下的测试结果为基准值,第6列以安装VMM但未开启RTMF机制的系统测试结果为基准值.
![]() |
表 3 Unixbench测试结果 Table 3 Unixbench results |
从第6列可以看出,开启RTMF后,系统性能开销相比于安装VMM但未开启RTMF机制的系统而言,只增加了0.6%(overall score),因而系统遭受的性能损耗主要来自于BitVisor的正常运转.其中,I/O密集型测试项如file copy,pipe throughput,shell scripts,以及特权型操作process creation,都涉及对内存的操作,因而难免产生page fault.这些page fault会触发许多EPT violation,从而使得系统在测试期间不断陷入VMM.大量的VM Exit使得上述测试项遭受35.5%~67.3%的性能损耗. Overall score是总体性能指标,由表 3可知,BitVisor为系统引入的整体性能开销为40.9%,开启RTMF机制后系统的性能损耗为41.2%.相比HVI的97.9%,HIMI的75%,RTMF在性能上有一定优势.
RTMF主要在2方面对客户机的性能带来影响.一是由内存页面监控导致的VM Exit,主要体现在由EPT violation引起的陷入,由MTF-trap引起的陷入以及当被监控内核函数执行时,其头部的VMCALL指令触发的陷入.二是在内存行为分析阶段,RTMF涉及大量的读写内存操作.本文从LMBench测试集中选择如图 8所示的4个测试项对RTMF在上述2方面对系统造成的性能影响进行测试.其中,fork项重复执行fork与exit 2个系统调用,即重复创建、销毁进程;execve项重复执行execve系统调用,即重复加载进程. fork与execve测试项包含了RTMF监控的主要的内核函数,同时由于其创建、加载、销毁进程时涉及内存空间的分配与释放,因此上述2个测试项也涵盖了对EPT violation、MTF-trap性能影响的测试. Read bandwidth、write bandwidth代表内存读写带宽,可用来度量RTMF读写内存的操作对内存带宽造成的影响.
![]() |
图 8 LMBench测试结果 Fig. 8 LMBench results |
本文选择一个较为复杂的程序gedit作为目标应用程序.经多次计算并取平均值,该应用程序在不进行文本编辑的状态下占据的内存页面维持在3 500页左右;当使用该应用程序进行文本编辑时,其占用的内存页面数量还会持续增长.另外,待监控的内核静态页面数量为1 455页.用于测试的内核静态页面及用户数据页面的被监控总量可达5 000页左右. 图 8以未开启RTMF机制下的VMM对应测试结果为基准1,fork、execve代表执行对应系统调用耗费的时间,其值越小越好;read bandwidth、write bandwidth代表内存读写带宽,其值越大越好.由图 8可知,即使在大量监控内存页面并进行内存读写操作的情况下,RTMF为BitVisor带来的性能开销也仅在0.3%~3.41%之间.这是因为针对内存发起的攻击往往是短暂的、瞬时性的;而且在正常监控下,RTMF通过对EPT violation的原因进行分析,排除了系统误报的情况.这2个因素使得RTMF即使在大量监控内存页面的情况下也不会引入大的性能开销.由图 8的结果可知,系统在系统调用及内存带宽两方面遭受的影响主要来自BitVisor的正常运转,而这部分影响也控制在40%左右.
6 结语随着网络犯罪的隐遁化及网络攻击的内存化,内存取证在获取关键数字证据方面发挥着与日俱增的重要作用.然而传统的基于“镜像-分析”模式的内存取证技术面临以下几个考验:一是当前计算机内存容量逐渐增大,使得提取1次内存快照的时间过长,在极端情况下甚至难以完全提取;二是目前针对内核以及用户隐私数据的攻击多为瞬时性攻击,且攻击完成后会消除攻击痕迹,导致传统技术难以对攻击进行取证.针对以上2个挑战,借鉴“蜜罐”思想,提出1种类蜜罐的实时内存取证方法. RTMF利用VMM直接提取与攻击行为相关的内存片段,而不必获取完整的内存镜像;利用EPT设置一些攻击常着眼的内存页面的访问权限,并实时监控访问者对这些页面的修改情况,可及时捕获攻击并完成取证过程.经实验证明,该方法能实时拦截内存攻击,并对攻击者关键信息进行取证分析,且引入的整体性能开销在40%左右,位于可接受的范围.这部分性能开销主要来自于VMM的正常运转,若想进一步降低开销,可在未来的工作中选用一款更加轻量级的,VM Exit条件更为精准的虚拟机监控器.目前RTMF仍存在一些不足,包括对可执行代码的分析不够系统,以及未考虑Linux内核在线更新可能导致的误报情况等,未来将在该方面进行进一步的完善.
[1] |
TTGEN J, COHEN M. Anti-forensic resilient memory acquisition[J]. Digital Investigation the International Journal of Digital Forensics & Incident Response, 2013, 10: S105-S115. |
[2] |
张瑜, 刘庆中, 李涛, 等. 内存取证研究与进展[J]. 软件学报, 2015, 26(5): 1151-1172. ZHANG Yu, LIU Qing-zhong, LI Tao, et al. Research and development of memory forensics[J]. Ruan Jian Xue Bao/Journal of Software, 2015, 26(5): 1151-1172. |
[3] |
ADELSTEIN F. Live forensics:diagnosing your system without killing it first[J]. Communications of the Acm, 2006, 49(2): 63-66. DOI:10.1145/1113034 |
[4] |
VÖMEL S, FREILING F C. A survey of main memory acquisition and analysis techniques for the windows operating system[J]. Digital Investigation, 2011, 8(1): 3-22. DOI:10.1016/j.diin.2011.06.002 |
[5] |
OSBORNE G. Memory forensics: review of acquisition and analysis techniques[EB/OL]. [2016-12-10]. http://dspace.dsto.defence.gov.au/dspace/handle/dsto/10393. http://www.dtic.mil/docs/citations/ADA594490
|
[6] |
钟贤明. 基于虚拟化技术的在线取证系统[D]. 上海: 上海交通大学, 2014. ZHONG Xian-ming. A live forensics system based on virtualization technology[D]. Shanghai: Shanghai Jiao Tong University, 2014. |
[7] |
CHENG Y X, FU X, LUO B, et al. Investigating the hooking behavior: a page-level memory monitoring method for live forensics[M]//Information Security. Cham: Springer International Publishing. 2014: 255-272. https://link.springer.com/chapter/10.1007/978-3-319-13257-0_15
|
[8] |
PETRONI N L, FRASER T, MOLINA J, et al. Copilot-a coprocessor-based kernel runtime integrity monitor[J]. In Proceedings of the 13th USENIX Security Symposium, 2010, 13: 179-194. |
[9] |
PETRONI N L, HICKS M. Automated detection of persistent kernel control-flow attacks[C]//ACM Conference on Computer and Communications Security, CCS 2007. Alexandria, Virginia, USA: ACM, 2007: 103-115. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.130.4713
|
[10] |
HOFMANN O S, DUNN A M, KIM S, et al. Ensuring operating system kernel integrity with OSck[J]. Computer Architecture News, 2011, 46(3): 279-290. |
[11] |
YIN H, POOSANKAM P, HANNA S, et al. HookScout: proactive binary-centric hook detection[C]//Detection of Intrusions and Malware, and Vulnerability Assessment, International Conference, DIMVA 2010. Bonn, Germany: Springer, 2010: 1-20 https://link.springer.com/chapter/10.1007/978-3-642-14215-4_1
|
[12] |
RHEE J, RILEY R, XU D, et al. Defeating dynamic data kernel rootkit attacks via vmm-based guest-transparent monitoring[C]//International Conference on Availability, Reliability and Security. Fukuoka, Japan: IEEE, 2009: 74-81. http://ieeexplore.ieee.org/document/5066457/
|
[13] |
SHI J, YANG Y, TANG C. Hardware assisted hypervisor introspection[J]. SpringerPlus, 2016, 5(1): 1-23. DOI:10.1186/s40064-015-1659-2 |
[14] |
AZAB A M, NING P, SEZER E C, et al. HIMA: a hypervisor-based integrity measurement agent[C]//Computer Security Applications Conference. Honolulu, USA: IEEE Computer Society, 2009: 461-470. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=5380699
|
[15] |
GUIDE P. Intel 64 and IA-32 architectures software developer's manual[J]. Volume 3B:System programming Guide, 2011. |
[16] |
PHAM C, ESTRADA Z, CAO P, et al. Reliability and security monitoring of virtual machines using hardware architectural invariants[C]//IEEE/ifip International Conference on Dependable Systems and Networks. Atlanta, Georgia, USA: IEEE, 2014: 13-24. https://experts.illinois.edu/en/publications/reliability-and-security-monitoring-of-virtual-machines-using-har
|
[17] |
ZHONG X, XIANG C, YU M, et al. A virtualization based monitoring system for mini-intrusive live forensics[J]. International Journal of Parallel Programming, 2015, 43(3): 455-471. DOI:10.1007/s10766-013-0285-2 |
[18] |
YU M, LIN Q, LI B, et al. Vis: virtualization enhanced live acquisition for native system[C]//Asia-Pacific Workshop on Systems. Shanghai, China: ACM, 2011: 13. https://www.researchgate.net/publication/254003781_Vis_Virtualization_enhanced_live_acquisition_for_native_system
|
[19] |
YU M, QI Z, LIN Q, et al. Vis:Virtualization enhanced live forensics acquisition for native system[J]. Digital Investigation, 2012, 9(1): 22-33. DOI:10.1016/j.diin.2012.04.002 |
[20] |
SHINAGAWA T, EIRAKU H, TANIMOTO K, et al. BitVisor: a thin hypervisor for enforcing I/O device security[C]//International Conference on Virtual Execution Environments, VEE 2009. Washington, Dc, USA: ACM 2009: 121-130. https://dl.acm.org/citation.cfm?doid=1508293.1508311
|
[21] |
张贵民. 基于Intel VT的内核完整性监控技术研究[D]. 郑州: 解放军信息工程大学, 2014. ZHANG Gui-min. Research on kernel integrity monitoring technology based on Intel VT[D]. Zhengzhou: PLA Information Engineering University, 2014. |
[22] |
BUCHANAN E, ROEMER R, SHACHAM H, et al. When good instructions go bad: generalizing return-oriented programming to RISC[C]//ACM Conference on Computer and Communications Security. Alexandria, Virginia, USA: ACM, 2008: 27-38. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.178.9430
|
[23] |
WANG Z, JIANG X, CUI W, et al. Countering kernel rootkits with lightweight hook protection[C]//ACM Conference on Computer and Communications Security. Chicago, Illinois, USA: ACM, 2009: 545-554. https://www.microsoft.com/en-us/research/publication/countering-kernel-rootkits-with-lightweight-hook-protection/
|
[24] |
BALIGA A, GANAPATHY V, IFTODE L. Detecting kernel-level rootkits using data structure invariants[J]. IEEE Transactions on Dependable & Secure Computing, 2011, 8(5): 670-684. |
[25] |
SHACHAM H. The geometry of innocent flesh on the bone: return-into-libc without function calls (on the x86)[C]//ACM Conference on Computer and Communications Security. Alexandria, Virginia, USA: DBLP, 2007: 552-561. https://blog.acolyer.org/2015/12/01/rop/
|
[26] |
任建宝, 齐勇, 戴月华, 等. 基于虚拟机监控器的隐私透明保护[J]. 软件学报, 2015, 26(8): 2124-2137. REN Jian-bao, QI Yong, DAI Yue-hua, et al. Transparent privacy protection based on virtual machine monitor[J]. Ruan Jian Xue Bao/Journal of Software, 2015, 26(8): 2124-2137. |