引擎保护方法和装置与流程

文档序号:12597104阅读:289来源:国知局
引擎保护方法和装置与流程

本公开涉及网络安全领域,具体地,涉及一种引擎保护方法和装置。



背景技术:

目前大部分浏览器引擎以及Java、Perl、Ruby、Flash等都使用了JIT编译(Just-In-Time Compilation)技术来提高代码执行效率。JIT编译技术在为可执行对象分配内存时会直接分配可预期的、具有可读写可执行(Read、Write、Exeute,RWX)权限的内存地址,这样违背了数据执行保护以及随机地址分配的保护措施,使得可执行对象执行时其引擎很容易受到缓冲区溢出、堆喷射等恶意攻击。因此,少数使用JIT编译技术的引擎采取了实时修改内存地址权限的方法对其进行保护,将分配给可执行对象的内存地址的写权限与可执行权限分开。但是这样又会使其处理周期过长,造成使用JIT编译技术的引擎效率降低。



技术实现要素:

本公开的目的是提供一种引擎保护方法,该方法能够在一定程度上避免引擎在可执行对象执行时被非法恶意攻击。

为了实现上述目的,本公开提供一种引擎保护方法,该方法包括:

按照第一预设规则给可执行对象分配内存地址;

按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写。

可选的,所述按照第一预设规则给可执行对象分配内存地址包括:

根据默认内存地址分配规则给所述可执行对象分配内存地址。

可选的,所述按照第一预设规则给可执行对象分配内存地址包括:

获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限;

当所述申请内存地址为空且所述申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址;

根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址;

当所确定的内存地址属于系统内存地址时,返回所述对所述申请内存地址进行随机化处理以得到随机化内存地址的步骤;

当所确定的内存地址不属于系统内存地址时,将所确定的内存地址分配给所述可执行对象。

可选的,在所述获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限之后,所述按照第一预设规则给可执行对象分配内存地址还包括:

判断所述申请内存大小是否是2的幂次方;

当所述申请内存大小不是2的幂次方时,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方。

可选的,所述按照第二预设规则为所分配的内存地址设置保护区包括:

将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内;

将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小。

本公开还提供一种引擎保护装置,该装置包括:

内存地址分配模块,用于按照第一预设规则给可执行对象分配内存地址;

保护区设置模块,用于按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写。

可选的,所述内存地址分配模块包括:

内存地址默认分配子模块,用于根据默认内存地址分配规则给所述可执行对象分配内存地址。

可选的,所述内存地址分配模块包括:

获取子模块,用于获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限;

内存地址随机化子模块,用于当所述申请内存地址为空且所述申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址;

内存地址确定子模块,用于根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址;

内存地址判断子模块,用于判断所述内存地址确定子模块所确定的内存地址是否属于系统内存地址,并当所确定的内存地址属于系统内存地址时,通知所述内存地址随机化子模块重新对所述申请内存地址进行随机化处理以得到随机化内存地址;

内存地址分配子模块,用于当所述内存地址判断子模块判断所确定的内存地址不属于系统内存地址时,将所确定的内存地址分配给所述可执行对象。

可选的,在所述获取子模块获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限之后,所述内存地址分配模块还包括:

申请内存大小判断子模块,用于判断所述申请内存大小是否是2的幂次方;

申请内存大小增加子模块,用于当所述申请内存大小不是2的幂次方时,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方。

可选的,所述保护区设置模块包括:

保护区设置子模块,用于将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内;

内存地址偏移子模块,用于将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小。

通过上述技术方案,先按照第一预设规则给可执行对象分配内存地址,然后按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写,这样就能够在一定程度上保护所述内存地址,且避免其引擎在可执行对象执行时被非法恶意攻击。

本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。

附图说明

附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:

图1是根据本公开一种实施方式的引擎保护方法的流程图。

图2是根据本公开又一种实施方式的引擎保护方法的流程图。

图3是根据本公开又一种实施方式的引擎保护方法的流程图。

图4是根据本公开又一种实施方式的引擎保护方法的流程图。

图5是根据本公开又一种实施方式的引擎保护方法的流程图。

图6是根据本公开一种实施方式的引擎保护装置的示意框图。

图7是根据本公开又一种实施方式的引擎保护装置中的内存地址分配模块的示意框图。

图8是根据本公开又一种实施方式的引擎保护装置中的内存地址分配模块的示意框图。

图9是根据本公开又一种实施方式的引擎保护装置中的内存地址分配模块的示意框图。

图10是根据本公开一种实施方式的引擎保护装置中的保护区设置模块的示意框图。

附图标记说明

100引擎保护装置 10内存地址分配模块

20保护区设置模块 101内存地址默认分配子模块

102获取子模块 103内存地址随机化子模块

104内存地址确定子模块 105内存地址判断子模块

106内存地址分配子模块 107申请内存大小判断子模块

108申请内存大小增加子模块 201保护区设置子模块

202内存地址偏移子模块

具体实施方式

以下结合附图对本公开的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。

图1是根据本公开一种实施方式的引擎保护方法的流程图,如图1所示,该方法包括步骤S101和步骤S102。

在步骤S101中,按照第一预设规则给可执行对象分配内存地址。

在步骤S102中,按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写。

所述保护区的设置目的是为了保护所述内存地址,其保护的方法即将所述保护区的权限设置为不可写。

通过上述技术方案,当需要给可执行对象分配内存时,先按照第一预设规则给可执行对象分配内存地址,然后按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写,这样就能够在一定程度上保护所分配的内存地址,且避免其引擎在可执行对象执行时被非法恶意攻击。

图2是根据本公开又一种实施方式的引擎保护方法的流程图,如图2所示,该方法包括图1中的步骤S102,还包括步骤S201。

在步骤S201中,根据默认内存地址分配规则给所述可执行对象分配内存地址。

上述步骤即为图1中步骤S101中所述的第一预设规则的其中一种。

所述默认内存地址分配规则即按照现有技术中使用JIT编译技术的引擎为可执行对象分配内存地址的规则,本公开对所述默认内存地址分配规则不作限定。

通过上述技术方案,先根据默认内存地址分配规则给所述可执行对象分配内存地址,然后按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写,这样提供了一种通过为所分配的内存地址设置保护区进而来保护引擎不受非法恶意攻击的方法。

图3是根据本公开又一种实施方式的引擎保护方法的流程图,图3所示的方法是图1中步骤S101中所述的第一预设规则中的另外一种。如图3所示,该方法包括步骤S301至步骤S307。

在步骤S301中,获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限。

可执行对象申请内存时,会通过自己的内存申请函数来进行申请,所述内存申请函数中主要包括申请的内存大小,申请内存的首地址,以及所要申请的内存页的权限等参数信息。

在步骤S302中,判断所述申请内存地址是否为空且所述申请内存权限是否为可读写可执行权限,如果是,则转至步骤S303,如果不是,则转至步骤S304。

判断所述申请内存地址是否为空且所述申请内存权限是否为可读写可执行权限即为判断所述可执行对象申请的内存是否为有被非法恶意攻击的危险的内存。

在步骤S303中,在申请内存地址为空且申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址,然后转至步骤S305。

步骤S303的主要目的是只在申请内存地址为空且申请内存权限为RWX权限时对申请内存地址进行随机化,这样就不会过多的占用系统时间,不会影响引擎(例如,使用JIT编译技术的引擎)的运行效率。

其中,所述对所述申请内存地址进行随机化处理可以通过利用George Marsaglia's MWC算法来进行随机化处理。George Marsaglia's MWC算法是一种利用异或与移位运算来产生高伪随机度的伪随机数生成算法,易于软件实现,而且在硬件上运行速度非常快,因此对所述申请内存地址进行随机化处理的过程几乎不会影响到引擎的运行效率。

在步骤S304中,根据所述申请内存大小、所述申请内存地址和所述申请内存权限给所述可执行对象分配内存地址。

当判断所述申请内存地址不为空时,说明可执行对象的申请内存地址是具体的地址,针对这种申请内存地址,选择不对其进行随机化处理,而直接根据所述申请内存大小、所述申请内存地址和所述申请内存权限给所述可执行对象分配内存地址。

当申请内存地址为空,但所述申请内存权限不为可读写可执行权限时,即所述可执行对象申请的内存地址不是RWX权限的内存地址时,也选择不对其进行随机化处理,而直接根据所述申请内存大小、所述申请内存地址和所述申请内存权限给所述可执行对象分配内存地址。因为当所述可执行对象的申请内存权限不是RWX权限时,所述引擎收到非法恶意攻击的危险程度相对并不高,在这种情况下就无需占用过多的系统时间对引擎进行保护。

在步骤S305中,根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址。

所述确定要分配给所述可执行对象的内存地址的过程常用的方法是调用一个系统内存分配函数来完成。在windows系统下,所述系统内存分配函数可以是VitualAlloc函数,当然也可以是其他系统内存分配函数,例如直接调用Windows堆函数或者CRT堆函数等。对于不同的系统,调用的内存分配函数可以不一样。

在步骤S306中,判断所确定的内存地址是否属于系统内存地址,如果否,则转至步骤S307,如果是,则转至步骤S303。

在确定了要分配给所述可执行对象的内存地址之后,需要对所确定的内存地址进行是否属于系统内存地址的判断,这一步属于常规判断。如果属于系统内存地址,因为系统内存地址不可用,则返回步骤S303对所确定的内存地址进行再一次的随机化处理,直到判断所确定的内存地址不属于系统内存地址时,即此时所确定的内存地址属于用户可用地址空间,这时,再转至步骤S307。

在步骤S307中,将所确定的内存地址分配给所述可执行对象。

在判断所确定的内存地址属于用户可用地址空间后,就将所确定的内存地址通过赋值的过程真正分配给可执行对象。

通过上述的技术方案,首先获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限,当所述申请内存地址为空且所述申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址,然后根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址,当所确定的内存地址属于系统内存地址时,返回所述对所述申请内存地址进行随机化处理以得到随机化内存地址的步骤,而当所确定的内存地址不属于系统内存地址时,就将所确定的内存地址分配给所述可执行对象,这样,如果攻击者想要在分配给可执行对象的内存地址上执行恶意代码,由于采取了以上的随机化处理,给可执行对象分配的内存地址是随机的,攻击者很难获取可执行对象的准确内存地址,这样,就能在一定程度上防止所述引擎被非法恶意攻击。

以下是针对图3中的随机化处理方法的有效性评估。

从表1中可以看出,没有使用本公开中的随机化处理方法时,使用JIT编译技术的引擎给可执行对象分配的是连续的相差0x10000字节的内存地址,因此攻击者能够猜测出可执行对象在内存中的准确位置。然而,使用本公开的随机化处理方法之后,所述引擎给可执行对象分配的地址是完全随机的,攻击者很难获取可执行对象在内存中的准确位置。

表1

图4是根据本公开又一种实施方式的引擎保护方法的流程图,是图1中步骤S101中所述的第一预设规则中的又一种。如图4所示,该方法在图3的步骤S301之后,还包括步骤S401和步骤S402,以及接下来的步骤S302至步骤S307。

在步骤S401中,判断所述申请内存大小是否是2的幂次方,如果否,则转至步骤S402,如果是,则转至步骤S302。

判断所述申请内存大小是否是2的幂次方的原因,一是通常情况下给可执行对象分配内存时,所述内存大小都是以2的幂的形式对齐的;二是2的幂的大小的内存空间适合硬件操作,有利用提高运行效率。

在步骤S402中,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方。

如果判断所述申请内存大小不是2的幂次方,则主动将所述申请内存大小增加至最接近原申请内存大小的2的幂次方,然后在进行内存分配工作。

通过上述的技术方案,在所述获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限之后,先判断所述申请内存大小是否是2的幂次方,当所述申请内存大小不是2的幂次方时,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方,然后再进行后续的内存分配,这样,有利于提高引擎的运行效率。

图5是根据本公开又一种实施方式的引擎保护方法的流程图,如图5所示,该方法包括步骤S501和步骤S502。

步骤S501,将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内。

所述保护区的大小相对于所述所分配的内存地址大小很小,例如,所述保护区的大小可以是8k。

将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内时,保护区的内存地址与所分配的内存地址会出现重合,此时执行步骤S502。

步骤S502,将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小。

在设置好保护区的地址之后,为避免内存重合,将所分配的内存地址向后偏移所述保护区的大小,保证保护区的内存地址与所分配的内存的保护地址是连续且不重合的。

通过上述的技术方案,先将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内,然后将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小,这样就为可执行对象的内存地址空间设置了一个能够起到保护作用的保护区,由于这个保护区的地址与可执行对象的内存地址空间是连续的,且所述保护区的权限是不可写,因此,当所述引擎受到非法恶意攻击例如缓冲区溢出等攻击时,就能够及时的反应报警,以使所述引擎终止程序的运行,从而起到保护所述引擎的功能。

本公开的发明人以JavaScript引擎V8、Tamarin以及Safari’s为例,编写了一系列的测试用例,用来测试使用本公开内容后引擎对于非法恶意攻击的防范效果。表中的JIT引擎即使用JIT编译技术的引擎。如表2所示,测试中的三个引擎对于测试用攻击样例的攻击,防范效果都是有效的。

表2

本公开的发明人还将本公开内容与使用JIT编译技术的引擎常用的安全防范措施进行了调研比较,结果如表3所示,从表3中可以看出,目前大多数使用JIT编译技术的引擎都没有使用本公开中的发明内容。

表3

其中,所述内存权限限定的方法,即在背景技术中提到的,少数使用JIT编译技术的引擎采取的实时修改内存地址权限的方法,将分配给可执行对象的内存地址的写权限与可执行权限分开,在最初为可执行对象分配内存地址时分配的是具有RWX权限的内存地址,并将权限修改为RW,在可执行对象即将执行时,将其内存地址的权限修改为RX,执行结束后再将其内存地址的权限修改为RW,这样处理非常消耗处理器周期,会降低引擎效率。

另外,引擎JagerMonkey是实现了内存权限限定功能的,但是在默认情况下此功能未被开启,因此默认其不具有此功能。

本公开的发明人还针对不同的使用JIT编译技术的引擎进行了10000次的内存分配操作,表4显示了在使用和不使用本公开内容的情况下的所用时间以及系统开销,如表4所示,使用本公开内容的引擎的系统开销在10%以内,这是在可以接受的范围内的;且所用时间的差距也在可以接收的范围内。

表4

图6是根据本公开一种实施方式的引擎保护装置100的示意框图。如图6所示,该装置包括:

内存地址分配模块10,用于按照第一预设规则给可执行对象分配内存地址;

保护区设置模块20,用于按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写。

通过上述技术方案,当可执行对象申请内存时,内存地址分配模块10先按照第一预设规则给可执行对象分配内存地址,然后保护区设置模块20按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写,这样就能够在一定程度上保护所述内存地址,且避免其引擎在可执行对象执行时被非法恶意攻击。

图7是根据本公开又一种实施方式的引擎保护装置100中的内存地址分配模块10的示意框图。如图7所示,所述内存地址分配模块10包括:

内存地址默认分配子模块101,用于根据默认内存地址分配规则给所述可执行对象分配内存地址。

通过上述技术方案,内存地址默认分配子模块101先根据默认内存地址分配规则给所述可执行对象分配内存地址,然后保护区设置模块20再按照第二预设规则为所分配的内存地址设置保护区,其中所述保护区的权限为不可写,这样提供了一种通过为所分配的内存地址设置保护区进而来保护引擎不受非法恶意攻击的方法。

图8是根据本公开又一种实施方式的引擎保护装置100中的内存地址分配模块10的示意框图。如图8所示,所述内存地址分配模块10包括:

获取子模块102,用于获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限;

内存地址随机化子模块103,用于当所述申请内存地址为空且所述申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址;

内存地址确定子模块104,用于根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址;

内存地址判断子模块105,用于判断所述内存地址确定子模块所确定的内存地址是否属于系统内存地址,并当所确定的内存地址属于系统内存地址时,通知所述内存地址随机化子模块重新对所述申请内存地址进行随机化处理以得到随机化内存地址;

内存地址分配子模块106,用于当所述内存地址判断子模块105判断所确定的内存地址不属于系统内存地址时,将所确定的内存地址分配给所述可执行对象。

通过上述的技术方案,首先获取子模块102获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限,内存地址随机化子模块103在当所述申请内存地址为空且所述申请内存权限为可读写可执行权限时,对所述申请内存地址进行随机化处理以得到随机化内存地址,然后内存地址确定子模块104根据所述随机化内存地址、所述申请内存大小和所述申请内存权限确定要分配给所述可执行对象的内存地址,内存地址判断子模块105在当所确定的内存地址属于系统内存地址时,返回所述对所述申请内存地址进行随机化处理以得到随机化内存地址的步骤,而内存地址分配子模块106在当所确定的内存地址不属于系统内存地址时,将所确定的内存地址分配给所述可执行对象,这样,如果攻击者想要在分配给可执行对象的内存地址上执行恶意代码,由于采取了以上的随机化处理,给可执行对象分配的内存地址是随机的,攻击者很难获取可执行对象的准确内存地址,这样,就能在一定程度上防止所述引擎被非法恶意攻击。

图9是根据本公开又一种实施方式的引擎保护装置100中的内存地址分配模块10的示意框图。如图9所示,在获取子模块102获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限之后,所述内存地址分配模块10还包括:

申请内存大小判断子模块107,用于判断所述申请内存大小是否是2的幂次方;

申请内存大小增加子模块108,用于当所述申请内存大小不是2的幂次方时,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方。

通过上述的技术方案,在获取子模块102获取为所述可执行对象申请内存的内存申请函数中的申请内存大小、申请内存地址和申请内存权限之后,申请内存大小判断子模块107判断所述申请内存大小是否是2的幂次方,申请内存大小增加子模块108在当所述申请内存大小不是2的幂次方时,将所述申请内存大小增加至大于所述申请内存大小的最小的2的幂次方,然后再进行后续的内存分配,这样,有利于提高引擎的运行效率。

图10是根据本公开一种实施方式的引擎保护装置100中的保护区设置模块20的示意框图。如图10所示,所述保护区设置模块20包括:

保护区设置子模块201,用于将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内;

内存地址偏移子模块202,用于将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小。

通过上述的技术方案,保护区设置子模块201先将所述保护区设置在从所分配的内存地址的首地址开始的预设大小的内存空间内,然后内存地址偏移子模块202将所分配的内存地址向后偏移,其中偏移的大小为所述预设大小,这样就为可执行对象的内存地址空间设置了一个能够起到保护作用的保护区,由于这个保护区的地址与可执行对象的内存地址空间是连续的,且所述保护区的权限是不可写,因此,当所述引擎受到非法恶意攻击例如缓冲区溢出等攻击时,就能够及时的反应报警,以使所述引擎终止程序的运行,从而起到保护所述引擎的功能。

以上结合附图详细描述了本公开的优选实施方式,但是,本公开并不限于上述实施方式中的具体细节,在本公开的技术构思范围内,可以对本公开的技术方案进行多种简单变型,这些简单变型均属于本公开的保护范围。

另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本公开对各种可能的组合方式不再另行说明。

此外,本公开的各种不同的实施方式之间也可以进行任意组合,只要其不违背本公开的思想,其同样应当视为本公开所公开的内容。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1