服务热线:010-65014696

安全研究

椒图关注 FOCUS ON JOWTO

漏洞检测方法及装置(专利号:201010526718.6)

[2014-11-14]

技术领域

  [0001] 本发明涉及网络技术领域,尤其涉及一种漏洞检测方法及装置。

背景技术

  [0002] 现有对文档类漏洞的检测及解决方案主要是利用杀毒软件进行查杀,通常杀毒软件主要采用的是病毒样本特征比对的技术,通过获取病毒样本来完善病毒特征库的覆盖范围,采用静态分析技术将病毒文件与病毒样本库规则匹配。

  [0003] 首先,这种解决方案具有一定的滞后性,必须是病毒大范围传播以后才可以获得样本。对于小范围传播、变种、未公开的漏洞(ODAY)则不具备快速收集的条件,这样就无法查杀具有上述漏洞的恶意文档。

  [0004] 另外静态分析技术主要依赖于有经验的分析人员花费大量时间去进行反汇编调试,跟踪分析文档是否包含恶意代码的攻击行为,一旦攻击者在文档中加入了大量的花指令、反调试技术会导致分析单个文件的时间大大延长。而且静态漏洞分析方法依赖于个人经验,缺少规范化的机制和流程,所以有非常大的偶然性。并且有可能出现无法分析或者分析结果错误等问题。

  [0005] 综上所述可以看出,采用现有技术中的漏洞检测方法的漏洞分析结果的准确度较低,且该方法的使用范围较小。

发明内容

  [0006] 有鉴于此,本发明提供一种漏洞检测方法及装置,以解决现有技术中的漏洞检测结果的准确度较低,且使用范围较小问题。

  [0007] 其具体方案如下:

  [0008] 一种漏洞检测方法,包括:

  [0009] 选取输入的文档数据;

  [0010] 检测选取的文档数据中是否具有利用特定漏洞的代码shellcode;

  [0011] 当所述选取的文档数据中具有shellcode时,在预先设定的虚拟CPU环境内执行所述shellcode中的指令;

  [0012] 当执行所述shellcode中的指令过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;

  [0013] 当所述被读取内存满足预设内存规则时,则判定存在漏洞。

  [0014] 优选的,还包括:显示所述漏洞的信息。

  [0015] 优选的,还包括:替换所述shellcode。

  [0016] 优选的,所述选取输入文档数据的过程包括:

  [0017] 设定滑动窗口的起始位置为文档数据的起始位置;

  [0018] 按照预设窗口范围依次选取所述文档数据。

  [0019] 优选的,还包括:

  [0020] 判断所述窗口范围的末位是否为文档数据的末位,若是,则结束,若否,则更新所述滑动窗口的起始位置,执行检测所述被选取的数据中是否具有利用特定漏洞的代码shellcode的过程。

  [0021] 优选的,所述检测所述被选取的数据中是否具有shellcode的过程包括:

  [0022] 反汇编所述被选取的数据;

  [0023] 判断所述反汇编结果与预先设定的指令规则是否匹配,若匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。

  [0024] 优选的,所述预设内存规则包括:内存的地址、长度、匹配次数和依赖规则链表中的任意一项或多项的组合。

  [0025] 优选的,所述内存规则按照树形结构进行存储匹配。

  [0026] 一种漏洞检测装置,包括:

  [0027] 数据选取单元,用于选取输入的文档数据;

  [0028] 指令过滤单元,用于检测所述选取的文档数据中是否具有利用特定漏洞的代码shel_lcode:

  [0029] 虚拟执行单元,用于当所述选取的数据中具有shellcode时,在预先设定的虚拟CPU环境内执行所述shellcode中的指令;

  [0030] 内存监视单元,用于监祝所述执行所述shellcode中的指令过程中是否对内存进行读写操作;

  [0031] 规则匹配单元,用于当执行所述shellcode过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;

  [0032] 漏洞判定单元,用于当所述被读取内存满足预设内存规则时,则判定存在漏洞。

  [0033] 优选的,还包括:漏洞信息显示单元,用于显示所述漏洞的信息。

  [0034] 优选的,还包括:替换单元,用于替换所述shellcode。

  [0035] 优选的,所述数据选取单元包括:

  [0036] 起始位置设定单元,用于设定滑动窗口的起始位置为文档数据的起始位置;

  [0037] 选取单元,用于按照预设窗口范围依次选取所述文档数据。

  [0038] 优选的,所述指令过滤单元包括:

  [0039] 反汇编单元,用于反汇编所述被选取的数据;

  [0040] 指令规则匹配单元,用于将所述反汇编结果与预先设定的指令规则进行匹配,若所述反汇编结果与预先设定的指令规则匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。

  [0041] 从上述的技术方案可以看出,本发明实施例公开的一种漏洞检测方法,通过在虚拟环境下检测接收的数据是否具有利用特定漏洞的代码shellcode,并对检测到的shellcode进行模拟运行,看其运行过程中是否具有与预设内存规则相匹配的内存操作,以判定是否存在漏洞。从而提高检测漏洞的完全性,提高了检测精度,并进一步扩大了应用范围。

附图说明

  [0042] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

  [0043] 图1为本发明实施例公开的漏洞检测方法流程图;

  [0044] 图2为本发明实施例公开的内存规则树形结构示意图;

  [0045] 图3为本发明实施例公开的又一漏洞检测方法流程图;

  [0046] 图4为本发明实施例公开的又一漏洞检测方法流程图;

  [0047] 图5为本发明公开的漏洞检测装置结构示意图。

具体实施方式

  [0048] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

  [0049] 本发明公开了一种漏洞检测方法,采用在虚拟环境下检测接收的数据是否具有利用特定漏洞的代码shellcode,并对检测到的shellcode进行模拟运行,看其运行过程中是否具有与预设内存规则相匹配的内存操作,以判定是否存在漏涧的方法,其具体实现方式如下所述:

  [0050] 本发明实施例公开的一种漏洞检测方法的流程如图l所示,包括:

  [0051] 步骤Sll、选取输入的文档数据;

  [0052] 从输入的文档数据中选择进行检测的数据,具体的选取形式可以为利用滑动窗口操作选取,也可以利用指针进行选取。指针选取形式只适应于C或C++之类的语言格式的数据,而滑动窗口的形式可以适应任何语言格式的数据。

  [0053] 步骤S12、检测所述文档数据是否具有shellcode,若是,则执行步骤S13,若否,则结束;

  [0054] 本步骤中可以利用shellcode所具有的一些通用特征来判断数据中是否具有shellcode,例如,很多的shellcode都带有循环自解密指令,则可以通过判断数据中是否具有循环自解密指令来判断是否具有shellcode。例如:

  [0055] mov ecx,Ox5C

  [0056] mov esi,Ox00401000

  [0057]_continue:

  [0058] xor byte ptr [esi+ecx-l] ,Ox01

  [0059] loop_continue

  [0060] 上述示例指令是对地址为Ox00401000,长度为Ox5C的代码段.按照每字节与1进行异或运算。

  [0061] 根据类似的指令,只需要提供相应的指令规则,即可灵活匹配,例如检测循环对内存进行异或写操作规则,其具体的程序如下所示:

  [0062] Start (code)

  [0063] While (short)CN 101964036 A

  [0064] {

  [0065] exists (xor (varl, var2))

  [0066] }

  [0067] End (code)

  [0068] 在上述规则中,变量varl和var2可以是Mem、Reg、Imm和Any中的一种,其中:

  [0069] Mem:表示内存操作数

  [0070] Reg:表示寄存器操作数

  [0071] Imm:表示立即数操作数

  [0072] Any:表示任意类型

  [0073] Exists:为指令存在检测函数

  [0074] 上述规则表示匹配一个由短跳转指令产生的一个循环,当在数据中的循环体中发现一条xor指令时,则规则匹配成功,说明数据具有shellcode。

  [0075] 步骤S13、在预先设定的虚拟CPU环境内执行所述shellcode中的指令;

  [0076] 本步骤通过虚拟机来实现,通过虚拟机内的虚拟CPU实现对指令的模拟执行,并通过虚拟环境,提供对指令执行的环境支撑。例如,很多shellcode需要获取PEB (Process

  Enviroment Block,进程环境块)和kerne132. dll的基地址,再获得一些重要的API (Application Programming Interface.应用程序编程接口)函数。当指令对kerne132.dll的基地址进行访问的时候,就会被检测到。

  [0077] 步骤S14、判断执行所述shellcode中的指令过程中是否对内存进行读写操作,若是,则执行步骤S15,若否,则结束;

  [0078] 步骤S15、判断被读取内存是否满足预设内存规则,若是,则执行步骤S16,若否,则结束;

  [0079] 所述预设内存规则可以包括:内存的地址、长度、匹配次数和依赖规则链表中的任意一项或多项的组合。例如,当被读取的内存的地址与预设内存规则中的内存地址相同时,说明指令执行过程中对预先设定的内存地址的内存进行了读取操作,则此shellcode为恶意代码,文档中存在漏洞。

  [0080] 内存规则的结构如下:

  [0081] lVIonitor::memory (Address, Length, Operation, Count, DependRule)

  [0082] Address:内存地址

  [0083] Length:长度

  [0084] Operation:读取或写入

  [0085] Count:匹配次数

  [0086] DependRule:依赖规则

  [0087] 在匹配规则的过程中,由干shellcode自解密的过程中会对一段连续内存进行写操作,所以需要不断的执行循环操作,因此其与内存规则的匹配次数也会不断的改变,可以根据此情况,设定当匹配次数为某一特定值时,满足匹配次数的内存规则,其具体的数值可以灵活的设置。同样可以通过设置更多的依赖规则,来达到缩小目标范围的效果,使其更精确的匹配shellcode,降低误报率。

  [0088] 本实施例中的内存规则可以采用树形结构排列,其结构示意图如图2所示,该结构中Root为根节点,每个节点包含左子树L和右子树R,左子树的规则依赖于父子树的规则,而右子树的规则不依赖父子树的规则。进行内存规则匹配的时候,遍历整个树,根据依赖关系,即可判断是否符合内存规则条件。

  [0089] 步骤S16、判定存在漏洞。

  [0090] 当内存规则被匹配时,表示文档中存在可执行的恶意shellcode,即文档中存在漏洞,反之则文档是安全的。

  [0091] 本实施例公开的种漏洞检测方法对接收的文档中的数据进行检测,以实现判断其是否具有漏洞的目的,其检测原则为与shellcode对应的内存匹配原则,从而使得该检测方法可以适用于任何一种shellcode,可以对新的、未知的新shellcode具有相同的检测能力。对于大量shellcode样本的的分析具有通用性,提高了检测精度,扩大了适用范围。

  [0092] 本发明实施例公开的又一漏洞检测方法流程如图3所示,包括:

  [0093] 步骤S31、选取输入的文档数据;

  [0094] 步骤S32、检测选取的文档数据中是否具shellcode,若是,则执行步骤S33,若否,则结束;

  [0095] 步骤S33、在预先设定的虚拟CPU环境内执行所述shellcode中的指令;

  [0096] 步骤S34、判断执行所述shellcode中的指令过程中是否对内存进行读写操作,若是,则执行步骤S35,若否,则结束;

  [0097] 步骤S35、判断被读取内存是否满足预设内存规则,若是,则执行步骤S36,若否,则结束;

  [0098] 步骤S36、判定存在漏洞;

  [0099] 步骤S37、显示所述漏洞的信息;

  [0100] 将所述漏洞信息进行显示,以便于对漏洞进行分析。

  [0101] 步骤S38、替换所述shellcode。

  [0102] 通过检测获得内存地址Aclclress,与之对应的文件偏移地址Offset,shellcode长度Length等信息,然后将Offset到Offset+Length这段内容用新的shellcode填充,即可达到替换shellcode内容。根据填充的内容不同,替换后shellcode可以实现恢复文档的正常功能。

  [0103] 本发明实施例公开的又一漏洞检测流程如图4所示,包括:

  [0104] 步骤S41、设定滑动窗口的起始位置为文档数据的起始位置;

  [0105] 步骤S42、按照预设窗口范围依次选取所述文档数据;

  [0106] 具体的窗口范围可以根据实际情况设定,可以为lk,也可以为2k。选取的范围越大,检测的时间就越短,检测速度就越快。选取的范围越小,检测的精度就越高,可以根据具体应用场景进行设定。

  [0107] 步骤S43、反汇编所述被选取的数据;

  [0108] 将被选取的数据反汇编为汇编语言格式的数据。

  [0109] 步骤S44、判断所述反汇编结果与预先设定的指令规则是否匹配,若匹配,则执行步骤S45a,若不匹配,则执行步骤S45b;

  [0110] 本步骤中的预先设定的指令规则为,数据的循环体具有xor指令。

  [0111] 步骤S45a、判定所述被选取数据中具有shellcode,执行步骤S46a;

  [0112] 步骤S45b、判断所述窗口范围的末位是否为文档数据的末位,若否,则执行步骤S46b,若是,则结束;

  [0113] 步骤S46a、在预先设定的虚拟CPU环境内执行所述shellcode中的当前待执行指令,执行步骤S47;

  [0114] Shellcode中可能会包含多个执行指令,分别对这些指令进行模拟执行。

  [0115] 步骤S46b、更新所述滑动窗口的起始位置,返回执行步骤S42;

  [0116] 步骤S47、判断执行所述当前待执行指令过程中是否对内存进行读写操作,若是则

  执行步骤S48a,若否,则执行步骤S48b;

  [0117] 步骤S48a、判断所述被读取内存是否满足预设内存规则,若是,则执行步骤S49a,

  若否,则返回执行步骤S48b;

  [0118] 本实施例中所述的预设内存规则的判断过程为依次判断被操作内存的地址、长度、匹配次数和依赖规则链表的数据是否与预先设定的内存规则相匹配,虽然匹配规则的内容较多,检测时间较长,但是会大大提高检测精度,避免漏检的情况出现。

  [0119] 步骤S48b、判断当前待执行指令是否为选取数据中的shellcode内的最后一条指令,若否,则执行步骤S49b,若是.则返回执行步骤S45b;

  [0120] 步骤S49a、判定存在漏洞;

  [0121] 步骤S49b、选取下一条指令作为当前待执行指令,返回步骤S46a;

  [0122] 步骤S410、显示所述漏洞的信息;

  [0123] 将所述漏洞信息进行显示,以便于对漏洞进行分析。

  [0124] 本实施例中同样也可增加替换shellcode的过程。

  [0125] 本实施例公开的漏洞检测方法中,采用利用窗口选取被检测数据的方式,利用循环选取的步骤实现对被检测数据的选取及检测,简化了处理流程,提高了处理效率。

  [0126] 本发明进一步公开了一种漏洞检测装置,其结构如图5所示,包括:数据选取单元51、指令过滤单元52、虚拟执行单元53、内存监视单元54、规则匹配单元55和漏洞判定单元56,其中:

  [0127] 数据选取单元51用于选取输入的文档数据;指令过滤单元52用于检测选取的文档数据中是否具有利用特定漏洞的代码shellcode;虚拟执行单元53用于当所述数据中具有shellcode时,在预先设定的虚拟CPLi环境内执行所述shellcode中的指令;内存监视单元54用于监视所述执行所述shellcode中的指令过程中是否对内存进行读骂操作;规则匹配单元55用于当执行所述shellcode中的指令过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;漏洞判定单元56用于当所述被读取内存满足预设内存规则时,则判定存在漏洞。

  [0128] 进一步的,该装置还包括:漏洞信息显示单元57,用于显示所述漏洞的信息;替换单元58,用于替换所述shellcode。

  [0129] 其中,所述的虚拟执行单元53可以由虚拟机实现,所述内存监视单元54可以由内存监视引擎实现。

  [0130] 进一步的,所述数据选取单元51包括:起始位置设定单元511,用于设定滑动窗口的起始位置为文档数据的起始位置;选取单元512,用于按照预设窗口范围依次选取所述文档数据。

  [0131] 所述指令过滤单元52包括:反汇编单元521,用于反汇编所述被选取的数据;指令规则匹配单元522,用于将所述反汇编结果与预先设定的指令规则进行匹配,若所述反汇编结果与预先设定的指令规则匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。

  [0132] 本装置中各个单元执行具体操作的过程如下所述:

  [0133] 首先通过起始位置设定单元设定窗口的起始位置为文档数据的起始位置,然后,选取单元按照预先设定的窗口范围选取窗口范围内的文档数据,反汇编单元将窗口范围内的数据进行反汇编得到被选取数据对应的汇编语言代码,指令规则匹配单元对汇编语言代码进行规则匹配,检测其中是否具有shellcode,如果具有,则将该汇编语言代码输入到虚拟执行单元进行虚拟执行,内存监测单元监测整个执行过程中是否出现对内存的读取操作,如果出现,则规则匹配单元将被操作的内存与预先设定的内存规则进行匹配,若相同,则漏洞判定单元判定该文档中存在漏洞。后续,可利用漏洞信息显示单元将漏洞信息进行显示,以便于后续研究分析。同样可以利用替换单元,替换掉文档中的shellcode.以保证文档则正常使用。

  [0134] 本实施例中可将数据选取单元、指令过滤单元、内存监视单元、规则匹配单元和漏洞判定单元同时集成在虚拟机上实现,也可以将其采用分体化设计实现。在此并不限定其具体实现形式。

  [0135] 本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

  [0136] 专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

  [0137] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM或技术领域内所公知的任意其它形式的存储介质中。

  [0138] 对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

说明书附图

\

图1

\

图2

\

图3

\

图4

\

图5