本发明涉及一种基于指令监控的APT高级威胁检测方法。
背景技术:
APT攻击破坏性大、隐蔽性强、技术复杂精密:近年来APT攻击层出不穷,增长趋势呈指数级发展,并逐渐演变成各种社会工程学攻击及各类0day漏洞利用的综合体,成为最具威胁的网络攻击方式。利用各种系统漏洞或软件漏洞进行渗透的恶意代码已成为目前APT攻击的主要手段,而利用或盗用合法的认证签名,利用浏览器漏洞和水坑攻击替代邮件攻击将成为APT攻击发展的趋势,与此同时,攻击者也更注重对虚拟环境的反检测技术,从而躲避安全厂商的动态检测。以APT攻击为代表的未知威胁非常容易击穿传统技术手段组成的网络安全防御体系,其威胁远远大于普通的木马病毒。
传统安全防御技术手段基本失效:目前对APT攻击的防御现状来看,传统的安全软件多以防范病毒和木马为主,无法有效防范漏洞攻击。只有当漏洞被黑客大规模攻击时,安全厂商才有机会监测到漏洞。而传统的防火墙、入侵检测、安全网关、杀毒软件和反垃圾邮件系统等检测技术也主要是在网络边界和主机边界进行检测,它们均缺乏对未知攻击的检测能力和对流量的深度分析能力。这种滞后响应的方式已经无法适应新的安全形势。
技术实现要素:
为了克服现有技术的缺点,本发明提供了一种基于指令监控的APT高级威胁检测方法,针对APT攻击中的恶意代码检测,主要解决以下技术问题:
(1)漏洞利用检测:传统杀毒软件等安防技术手段大多通过特征或是启发式方法对恶意样本进行特征匹配检测,恶意代码通过加壳、加密以及其他一些免杀手段很难被传统安防手段检测。此外现有沙箱技术大多使用API Hook和Rootkit技术对函数调用进行监测,但是很难监测到通过精心构造指令集发起的漏洞利用。
(2)反虚拟机检测:现有大多检测技术都使用APT Hook和Rootkit技术,因此必定在虚拟机中遗留分析监控程序痕迹,恶意代码可以通过检测函数是否被Hook、是否存在特定的监控程序等方法来破坏Hook/Rootkit、或是直接不触发恶意行为以逃避检测。
(3)通过代理方式运行恶意代码易被检测:现有系统大多都是通过代理程序把恶意样本拷贝到虚拟机,然后再触发样本执行,因此恶意软件可以检测代理程序的特征,如进程、端口、通信等行为,判断是否运行在虚拟环境,从而进行检测逃避。
本发明所采用的技术方案是:一种基于指令监控的APT高级威胁检测方法,包括如下内容:
(一)通过ExKVM和开源虚拟机自省库LibVMI实现虚拟客户机在Hyperv isor层上的识别,达到在虚拟机外部监控虚拟客户机中恶意代码的运行;
(二)使用动态离线污点分析方法来发现漏洞利用攻击;
(三)监控恶意代码运行:
(1)监控系统调用和内核执行:在虚拟客户机外部,使用#BP地址注入方法进行无入侵的用户层API监控和内核层API执行监控;
(2)内核Rootkit攻击处理:通过#BP地址注入Windows内核内存分配函数和内核模块结构操作函数实现内核堆分配的跟踪;
(3)无代理运行恶意代码:通过注入劫持虚拟机中运行的任意进程来启动恶意代码或应用程序。
与现有技术相比,本发明的积极效果是:
(1)有效监测APT攻击中的漏洞利用:本发明基于硬件虚拟化技术,结合监控特殊指令运行、污点分析和漏洞利用行为检测算法,能够有效地检测未知漏洞和已知漏洞的触发和利用行为,解决了APT检测的关键性问题。
(2)高效可扩展:本发明结合硬件虚拟化和ExKVM,大大提高了虚拟机监控运行恶意代码的效率;并且ExKVM原生基于KVM,也继承了KVM的高可靠性和扩展性,提升了恶意样本分析效率。
(3)高隐蔽性:本发明的所有监控和分析程序位于虚拟机管理层,增加了恶意代码反虚拟检测的难度,避免了恶意代码对监控程序的破坏,提升了自身的安全性和可靠性。
附图说明
本发明将通过例子并参照附图的方式说明,其中:
图1为本发明的系统架构图;
图2为ExKVM初始化流程图;
图3为虚拟机自省模型结构示意图;
图4为无代理模式启动恶意代码或应用流程图。
具体实施方式
本发明提出的一种新的基于指令级监控的APT高级威胁检测方法,应用KVM虚拟化和Intel硬件虚拟化技术(Intel-VT),对APT攻击中的恶意代码进行函数(API)级和指令级行为监控的深度分析;并使用污点分析和其它漏洞检测方法从根源上有效检测未知和已知漏洞利用行为。本发明具有高度可扩展、隐蔽性强和数据高度保真等特点。
一、本发明的总体架构
如图1所示,主要模块包括:自定义的ExKVM(扩展的KVM)、多个虚拟机、虚拟机自省(LibVMI)、污点分析、运行监控和行为日志数据分析模块。本发明的设计目标是能够深入高效地动态分析APT攻击中的各种恶意代码,并且最大限度降低被恶意代码发现的概率,其具有高性能可扩展、数据收集完整真实性、隐蔽性和虚拟执行独立性。
(一)高性能可扩展
目前恶意样本分析面临巨大的性能瓶颈,即动态仿真分析恶意样本的速度远落后于恶意代码增长的速度。本发明中的ExKVM基于原生KVM自定义扩展开发而来,使其保留了原有充分利用Intel VT进行处理器和内存虚拟化的优势,又具有支持客户机暂停、内存读写执行、寄存器读写、中断和单步跟踪的事件机制。ExKVM充分利用Intel的处理器虚拟化(VT-x)和直接I/O访问虚拟化(VT-d)技术,使得虚拟机的运行速度接近真机运行,很大程度上提升了恶意代码动态运行的性能。ExKVM初始化流程如图2所示。
本发明使用QEMU设备的模拟解析运行,主要模拟磁盘和网络设备等外围设备,充分发挥QEMU写时复制技术(CoW),使用qcow2格式的磁盘文件,只有在数据发生变化时才会把数据写入磁盘,极大地提高了多虚拟机并发运行带来的磁盘开销。
(二)虚拟机自省
本发明使用自定扩展的KVM(ExKVM)和开源虚拟机自省库LibVMI实现虚拟客户机到Hypervisor层的语义识别,以此达到在虚拟机外部监控虚拟机客户机中恶意代码的运行。虚拟机自省模型结构如图3所示:
原生KVM主要负责CPU虚拟化和内存管理的虚拟化,对虚拟机事件的处理并没有开发外置接口,不能满足通过LibVMI在外部完全掌握虚拟机的运行情况,因此本发明独创性的结合Linux系统事件跟踪模块、增加硬件虚拟化指令(VMEnter,VMExit,VMExecution等)的处理扩展KVM的功能即ExKVM,使其能够更全面的支持虚拟机自省的需求。通过ExKVM和LibVMI,可以监控虚拟机的内存操作、寄存器操作和对虚拟CPU(vCPU)指令执行进行单步跟踪,为后续污点分析提供接口支持。
(三)污点分析
本发明使用动态离线污点分析的方法来发现漏洞利用特别是0day的利用攻击。整个污点分析主要分为三个关键部分:污点标记、恶意代码执行轨迹记录和轨迹重放污点分析。
(1)污点标记:通过#BP地址注入的形式Hook文件系统调用、网络系统调用来标记污点源;
(2)执行轨迹跟踪:依赖于ExKVM和LibVMI,跟踪记录执行轨迹中的内存和寄存器的写、交换,jmp、call、ret等程序分支指令的执行(地址、指令参数);
(3)回放(2)中记录的执行轨迹,进行污点分析:当jmp、call、ret等分支指令的目的地址是污点时,则标记为疑似恶意行为;深入污点目的地址附件数据:指令特征扫描、字符串扫描等,若匹配则产生可疑恶意行为报警。
(四)监控恶意代码运行
(1)监控系统调用和内核执行
动态恶意代码分析的基础功能是跟踪恶意代码的执行,目前大多数工具或者方法都是通过API Hook或是Rootkit的方式来实现。用户层的API Hook并不能监控到系统内核层的执行情况,而API Hook和Rootkit都是需要直接在虚拟机中安装运行,存在被恶意代码反虚拟执行检测的风险。本发明在虚拟机外部,使用独特的#BP地址注入方法进行无入侵的用户层API监控和内核层API执行监控,并且避免了在虚拟机中被恶意代码发现监控程序。
本发明在系统运行时,通过解析操作系统(Windows系列操作系统)的调试数据来构建系统调用和内核函数映射图。以Windows 7为例,FS和GS寄存器存了指向_KPCR结构的内核虚拟地址,_KPCR被KiInitialPCR符号表标识,并且被加载到内核中的一个固定的虚拟地址处(RVA),因此只需从vCPU中提取出FS和GS的值,并减去_KPCR加载的相对虚拟地址即可得到内核的加载基地址(KVA)。有了KVA和符号表就可以对所有内核函数进行#BP地址注入,使得运行时所有的内核函数及调用都会陷入分析程序中。
(2)内核Rootkit攻击处理
内核Rootkit攻击的方法是直接操作内核结构,Rootkit一般通过两种方式操作内核结构:1)通过Hook内核函数,实现搜索内核模块链表时隐藏自身;2)直接断链内核模块链表。对于内核Rootkit问题的核心难点是被隐藏的内核模块在内核堆中的位置未知,因此只要找出被隐藏内核模块的地址即可解决Rootkit攻击。
本发明通过#BP地址注入Windows内核内存分配函数(AllocatePoolWithTag)和内核模块结构操作函数(ObCreateObject)实现内核堆分配的跟踪。通过从调用栈上提取出这些函数的返回地址,当调用这些函数进行对分配操作返回时,虚拟机陷入分析程序,因此可以监控到所有系统内核结构使Rootkit逃避检测的手段失效。
(3)无代理运行恶意代码
目前动态恶意代码的分析基本都是通过在虚拟机内部运行代理程序的模式启动恶意代码或是启动虚拟机中的软件,本发明结合#BP地址注入和EPT保护机制实现了无代理直接从虚拟机外部运行恶意代码和启动应用软件,逃避了反调试反虚拟机检测:通过注入劫持虚拟机中运行的任意进程来启动恶意代码或是应用程序,流程如图4所示:
1)在虚拟机启动时监控CR3寄存器;
2)从CR3寄存器中获取到启动进程的上下文,查询加载了kernel32.dll模块的进程procA;
3)当procA执行到用户层时,陷入监控程序:从kernel32.dll模块中得出CreateProcessA的地址,并保存现场(各种寄存器);
4)RIP修改为CreateProcessA地址,把参数传入RCX和RDX寄存器,x86_64模式下为R8和R9寄存器;
5)恢复虚拟机执行:启动恶意代码或应用程序;
6)CreateProcessA返回时陷入监控程序,恢复现场继续执行。
(五)行为日志数据分析
对使用#BP地址注入Hook各种系统及内核API、在程序关键分支(JMP、CALL、RET)插装记录形成的日志数据,通过一系列的后续挖掘分析手段判别是否存在恶意代码攻击,包括:漏洞利用、反虚拟机/调试、文件行为、注册表、Shellcode特征检测、网络行为检测等,其中漏洞利用检测是本发明的一大特色。基于记录的执行日志数据的漏洞利用检测能有效地提高漏洞利用检测的效率和准确度。
(1)ROP形式漏洞利用检测
1)以程序关键分支运行日志为输入,遍历记录日志;
2)记录CALL指令调用时返回值:RetAddrSet;
3)遇到RET型指令时检查返回的目的地址是否在RetAddrSet中;
4)如果RET返回目的地址在RetAddrSet则继续往下执行7);
5)如果RET返回目的地址不在RetAddrSet中,则检测该RET指令的上一条指令是否为压栈指令,如果是压栈指令(PUSH等)则继续往下执行7);
6)如果5)中RET指令前一条指令是非压栈指令,则报警为可疑ROP漏洞利用;
7)继续遍历日志到结束。
本发明中的ROP检测算法,在已有ROP检测算法思想的基础上,进一步检测返回指令的上一条指令,极大的减少了ROP漏洞利用检测的误报率。
(2)HeapSpray漏洞利用检测
HeapSpray漏洞利用检测以#BP地址方式注入到系统或内核堆分配关键函数,并提取计算满足一定条件分配内存数据模糊Hash值,在分配堆大小大于一定阈值情况时记录堆分配的参数,形成日志数据:
1)以堆分配记录日志为输入数据;
2)按照堆分配大小分组,按照组大小降序排序(大小相同的堆分到一组);
3)取出排在最前面的堆分配:计算是否每个堆分配后其内容的模糊HASH值基本一致;或是每个堆中绝大部分数据都是无效指令(0x0C,0x06)等;
4)如果3)中的判断结果为真则报警为可疑HeapSpray攻击。