发明内容
有鉴于此,本发明提供一种漏洞检测方法及装置,以解决现有技术中的漏洞检测结果的准确度较低,且使用范围较小问题。
其具体方案如下:
一种漏洞检测方法,包括:
选取输入的文档数据;
检测选取的文档数据中是否具有利用特定漏洞的代码shellcode;
当所述选取的文档数据中具有shellcode时,在预先设定的虚拟CPU环境内执行所述shellcode中的指令;
当执行所述shellcode中的指令过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;
当所述被读取内存满足预设内存规则时,则判定存在漏洞。
优选的,还包括:显示所述漏洞的信息。
优选的,还包括:替换所述shellcode。
优选的,所述选取输入文档数据的过程包括:
设定滑动窗口的起始位置为文档数据的起始位置;
按照预设窗口范围依次选取所述文档数据。
优选的,还包括:
判断所述窗口范围的末位是否为文档数据的末位,若是,则结束,若否,则更新所述滑动窗口的起始位置,执行检测所述被选取的数据中是否具有利用特定漏洞的代码shellcode的过程。
优选的,所述检测所述被选取的数据中是否具有shellcode的过程包括:
反汇编所述被选取的数据;
判断所述反汇编结果与预先设定的指令规则是否匹配,若匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。
优选的,所述预设内存规则包括:内存的地址、长度、匹配次数和依赖规则链表中的任意一项或多项的组合。
优选的,所述内存规则按照树形结构进行存储匹配。
一种漏洞检测装置,包括:
数据选取单元,用于选取输入的文档数据;
指令过滤单元,用于检测所述选取的文档数据中是否具有利用特定漏洞的代码shellcode;
虚拟执行单元,用于当所述选取的数据中具有shellcode时,在预先设定的虚拟CPU环境内执行所述shellcode中的指令;
内存监视单元,用于监视所述执行所述shellcode中的指令过程中是否对内存进行读写操作;
规则匹配单元,用于当执行所述shellcode过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;
漏洞判定单元,用于当所述被读取内存满足预设内存规则时,则判定存在漏洞。
优选的,还包括:漏洞信息显示单元,用于显示所述漏洞的信息。
优选的,还包括:替换单元,用于替换所述shellcode。
优选的,所述数据选取单元包括:
起始位置设定单元,用于设定滑动窗口的起始位置为文档数据的起始位置;
选取单元,用于按照预设窗口范围依次选取所述文档数据。
优选的,所述指令过滤单元包括:
反汇编单元,用于反汇编所述被选取的数据;
指令规则匹配单元,用于将所述反汇编结果与预先设定的指令规则进行匹配,若所述反汇编结果与预先设定的指令规则匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。
从上述的技术方案可以看出,本发明实施例公开的一种漏洞检测方法,通过在虚拟环境下检测接收的数据是否具有利用特定漏洞的代码shellcode,并对检测到的shellcode进行模拟运行,看其运行过程中是否具有与预设内存规则相匹配的内存操作,以判定是否存在漏洞。从而提高检测漏洞的完全性,提高了检测精度,并进一步扩大了应用范围。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明公开了一种漏洞检测方法,采用在虚拟环境下检测接收的数据是否具有利用特定漏洞的代码shellcode,并对检测到的shellcode进行模拟运行,看其运行过程中是否具有与预设内存规则相匹配的内存操作,以判定是否存在漏洞的方法,其具体实现方式如下所述:
本发明实施例公开的一种漏洞检测方法的流程如图1所示,包括:
步骤S11、选取输入的文档数据;
从输入的文档数据中选择进行检测的数据,具体的选取形式可以为利用滑动窗口操作选取,也可以利用指针进行选取。指针选取形式只适应于C或C++之类的语言格式的数据,而滑动窗口的形式可以适应任何语言格式的数据。
步骤S12、检测所述文档数据是否具有shellcode,若是,则执行步骤S13,若否,则结束;
本步骤中可以利用shellcode所具有的一些通用特征来判断数据中是否具有shellcode,例如,很多的shellcode都带有循环自解密指令,则可以通过判断数据中是否具有循环自解密指令来判断是否具有shellcode。例如:
mov ecx,0x5C
mov esi,0x00401000
_continue:
xor byte ptr[esi+ecx-1],0x01
loop_continue
上述示例指令是对地址为0x00401000,长度为0x5C的代码段,按照每字节与1进行异或运算。
根据类似的指令,只需要提供相应的指令规则,即可灵活匹配,例如检测循环对内存进行异或写操作规则,其具体的程序如下所示:
Start(code)
While(short)
{
exists(xor(var1,var2))
}
End(code)
在上述规则中,变量var1和var2可以是Mem、Reg、Imm和Any中的一种,其中:
Mem:表示内存操作数
Reg:表示寄存器操作数
Imm:表示立即数操作数
Any:表示任意类型
Exists:为指令存在检测函数
上述规则表示匹配一个由短跳转指令产生的一个循环,当在数据中的循环体中发现一条xor指令时,则规则匹配成功,说明数据具有shellcode。
步骤S13、在预先设定的虚拟CPU环境内执行所述shellcode中的指令;
本步骤通过虚拟机来实现,通过虚拟机内的虚拟CPU实现对指令的模拟执行,并通过虚拟环境,提供对指令执行的环境支撑。例如,很多shellcode需要获取PEB(Process Enviroment Block,进程环境块)和kernel32.dll的基地址,再获得一些重要的API(Application Programming Interface,应用程序编程接口)函数。当指令对kernel32.dll的基地址进行访问的时候,就会被检测到。
步骤S14、判断执行所述shellcode中的指令过程中是否对内存进行读写操作,若是,则执行步骤S15,若否,则结束;
步骤S15、判断被读取内存是否满足预设内存规则,若是,则执行步骤S16,若否,则结束;
所述预设内存规则可以包括:内存的地址、长度、匹配次数和依赖规则链表中的任意一项或多项的组合。例如,当被读取的内存的地址与预设内存规则中的内存地址相同时,说明指令执行过程中对预先设定的内存地址的内存进行了读取操作,则此shellcode为恶意代码,文档中存在漏洞。
内存规则的结构如下:
Monitor::memory(Address,Length,Operation,Count,DependRule)
Address:内存地址
Length:长度
Operation:读取或写入
Count:匹配次数
DependRule:依赖规则
在匹配规则的过程中,由于shellcode自解密的过程中会对一段连续内存进行写操作,所以需要不断的执行循环操作,因此其与内存规则的匹配次数也会不断的改变,可以根据此情况,设定当匹配次数为某一特定值时,满足匹配次数的内存规则,其具体的数值可以灵活的设置。同样可以通过设置更多的依赖规则,来达到缩小目标范围的效果,使其更精确的匹配shellcode,降低误报率。
本实施例中的内存规则可以采用树形结构排列,其结构示意图如图2所示,该结构中Root为根节点,每个节点包含左子树L和右子树R,左子树的规则依赖于父子树的规则,而右子树的规则不依赖父子树的规则。进行内存规则匹配的时候,遍历整个树,根据依赖关系,即可判断是否符合内存规则条件。
步骤S16、判定存在漏洞。
当内存规则被匹配时,表示文档中存在可执行的恶意shellcode,即文档中存在漏洞,反之则文档是安全的。
本实施例公开的种漏洞检测方法对接收的文档中的数据进行检测,以实现判断其是否具有漏洞的目的,其检测原则为与shellcode对应的内存匹配原则,从而使得该检测方法可以适用于任何一种shellcode,可以对新的、未知的新shellcode具有相同的检测能力。对于大量shellcode样本的的分析具有通用性,提高了检测精度,扩大了适用范围。
本发明实施例公开的又一漏洞检测方法流程如图3所示,包括:
步骤S31、选取输入的文档数据;
步骤S32、检测选取的文档数据中是否具shellcode,若是,则执行步骤S33,若否,则结束;
步骤S33、在预先设定的虚拟CPU环境内执行所述shellcode中的指令;
步骤S34、判断执行所述shellcode中的指令过程中是否对内存进行读写操作,若是,则执行步骤S35,若否,则结束;
步骤S35、判断被读取内存是否满足预设内存规则,若是,则执行步骤S36,若否,则结束;
步骤S36、判定存在漏洞;
步骤S37、显示所述漏洞的信息;
将所述漏洞信息进行显示,以便于对漏洞进行分析。
步骤S38、替换所述shellcode。
通过检测获得内存地址Address,与之对应的文件偏移地址Offset,shellcode长度Length等信息,然后将Offset到Offset+Length这段内容用新的shellcode填充,即可达到替换shellcode内容。根据填充的内容不同,替换后shellcode可以实现恢复文档的正常功能。
本发明实施例公开的又一漏洞检测流程如图4所示,包括:
步骤S41、设定滑动窗口的起始位置为文档数据的起始位置;
步骤S42、按照预设窗口范围依次选取所述文档数据;
具体的窗口范围可以根据实际情况设定,可以为1k,也可以为2k。选取的范围越大,检测的时间就越短,检测速度就越快。选取的范围越小,检测的精度就越高,可以根据具体应用场景进行设定。
步骤S43、反汇编所述被选取的数据;
将被选取的数据反汇编为汇编语言格式的数据。
步骤S44、判断所述反汇编结果与预先设定的指令规则是否匹配,若匹配,则执行步骤S45a,若不匹配,则执行步骤S45b;
本步骤中的预先设定的指令规则为,数据的循环体具有xor指令。
步骤S45a、判定所述被选取数据中具有shellcode,执行步骤S46a;
步骤S45b、判断所述窗口范围的末位是否为文档数据的末位,若否,则执行步骤S46b,若是,则结束;
步骤S46a、在预先设定的虚拟CPU环境内执行所述shellcode中的当前待执行指令,执行步骤S47;
Shellcode中可能会包含多个执行指令,分别对这些指令进行模拟执行。
步骤S46b、更新所述滑动窗口的起始位置,返回执行步骤S42;
步骤S47、判断执行所述当前待执行指令过程中是否对内存进行读写操作,若是则执行步骤S48a,若否,则执行步骤S48b;
步骤S48a、判断所述被读取内存是否满足预设内存规则,若是,则执行步骤S49a,若否,则返回执行步骤S48b;
本实施例中所述的预设内存规则的判断过程为依次判断被操作内存的地址、长度、匹配次数和依赖规则链表的数据是否与预先设定的内存规则相匹配,虽然匹配规则的内容较多,检测时间较长,但是会大大提高检测精度,避免漏检的情况出现。
步骤S48b、判断当前待执行指令是否为选取数据中的shellcode内的最后一条指令,若否,则执行步骤S49b,若是,则返回执行步骤S45b;
步骤S49a、判定存在漏洞;
步骤S49b、选取下一条指令作为当前待执行指令,返回步骤S46a;
步骤S410、显示所述漏洞的信息;
将所述漏洞信息进行显示,以便于对漏洞进行分析。
本实施例中同样也可增加替换shellcode的过程。
本实施例公开的漏洞检测方法中,采用利用窗口选取被检测数据的方式,利用循环选取的步骤实现对被检测数据的选取及检测,简化了处理流程,提高了处理效率。
本发明进一步公开了一种漏洞检测装置,其结构如图5所示,包括:数据选取单元51、指令过滤单元52、虚拟执行单元53、内存监视单元54、规则匹配单元55和漏洞判定单元56,其中:
数据选取单元51用于选取输入的文档数据;指令过滤单元52用于检测选取的文档数据中是否具有利用特定漏洞的代码shellcode;虚拟执行单元53用于当所述数据中具有shellcode时,在预先设定的虚拟CPU环境内执行所述shellcode中的指令;内存监视单元54用于监视所述执行所述shellcode中的指令过程中是否对内存进行读写操作;规则匹配单元55用于当执行所述shellcode中的指令过程中对内存进行读写操作时,判断被读取内存是否满足预设内存规则;漏洞判定单元56用于当所述被读取内存满足预设内存规则时,则判定存在漏洞。
进一步的,该装置还包括:漏洞信息显示单元57,用于显示所述漏洞的信息;替换单元58,用于替换所述shellcode。
其中,所述的虚拟执行单元53可以由虚拟机实现,所述内存监视单元54可以由内存监视引擎实现。
进一步的,所述数据选取单元51包括:起始位置设定单元511,用于设定滑动窗口的起始位置为文档数据的起始位置;选取单元512,用于按照预设窗口范围依次选取所述文档数据。
所述指令过滤单元52包括:反汇编单元521,用于反汇编所述被选取的数据;指令规则匹配单元522,用于将所述反汇编结果与预先设定的指令规则进行匹配,若所述反汇编结果与预先设定的指令规则匹配,则所述被选取数据中具有shellcode,若不匹配,则所述被选取数据中不具有shellcode。
本装置中各个单元执行具体操作的过程如下所述:
首先通过起始位置设定单元设定窗口的起始位置为文档数据的起始位置,然后,选取单元按照预先设定的窗口范围选取窗口范围内的文档数据,反汇编单元将窗口范围内的数据进行反汇编得到被选取数据对应的汇编语言代码,指令规则匹配单元对汇编语言代码进行规则匹配,检测其中是否具有shellcode,如果具有,则将该汇编语言代码输入到虚拟执行单元进行虚拟执行,内存监测单元监测整个执行过程中是否出现对内存的读取操作,如果出现,则规则匹配单元将被操作的内存与预先设定的内存规则进行匹配,若相同,则漏洞判定单元判定该文档中存在漏洞。后续,可利用漏洞信息显示单元将漏洞信息进行显示,以便于后续研究分析。同样可以利用替换单元,替换掉文档中的shellcode,以保证文档则正常使用。
本实施例中可将数据选取单元、指令过滤单元、内存监视单元、规则匹配单元和漏洞判定单元同时集成在虚拟机上实现,也可以将其采用分体化设计实现。在此并不限定其具体实现形式。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。