1.本发明涉及计算机技术领域,尤其涉及一种内存数据损坏攻击的监测方法和装置。
背景技术:2.c/c++语言编写的程序,会存在各种内存漏洞。内存漏洞是指程序员在软件编写的过程中,对内存的操作有时间或空间上的失误,产生使得程序可能做出违反程序本身设计的行为的安全问题。攻击者通过触发这些漏洞,泄露或修改内存数据,进而实施各种攻击,产生严重的危害。
3.常见攻击包括面向返回的编程(return-oriented programming,rop)攻击、面向跳转的编程(jump-oriented programming,jop)攻击和面向数据的编程(data-oriented programming,dop)攻击等。rop攻击者将一系列配件的地址先放入栈中,cpu运行到return时,会取出第一个地址并跳转到这个配件开始执行,当第一个配件执行结束时,结尾的return指令会取出第二个地址并跳转到第二个配件开始执行,如此循环,构造出任意恶意行为。jop攻击是以jump为结尾的代码片段作为配件,并以jump作为不同配件之间的连接。通过栈溢出控制栈上的数据,然后利用pop指令,将栈上的数据弹出到通用寄存器中。通过修改内存数据,利用load指令,将内存数据存入通用寄存器中。dop攻击通过内存漏洞修改参与运算的数据变量,例如库函数参数,循环参数,条件分支参数等,在不改变控制流的情况下完成恶意攻击。
4.这些攻击的关键点是在运行时损坏内存数据,对其进行任意读写。目前常采用数据流完整性(data flow integrity,dfi)机制作为主流的技术,通过在运行时保护内存数据,发现程序的异常行为,阻止此类攻击。然而,dfi机制因保护所有内存数据,采用一种过近似的分析过程得到数据的合法写集合。其会存在冗余信息,精确度难易保证,削弱了安全性。在程序运行时,由于标签检查机制的设计,会带来极大的内存开销以及性能损耗。
技术实现要素:5.本发明提供一种内存数据损坏攻击的监测方法,用以解决现有技术中安全性不足和性能开销巨大的缺陷,实现对内存数据损坏攻击的高效监测。
6.本发明提供一种内存数据损坏攻击的监测方法,包括:
7.对内存数据进行静态分析得到关键数据;
8.在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
9.执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
10.根据本发明提供的一种内存数据损坏攻击的监测方法,所述对内存数据进行静态
分析得到关键数据,包括:
11.对所述内存数据进行数据流分析得到初始关键数据;
12.对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,所述精确关键数据包括所述初始关键数据的控制流信息以及指针指向信息;
13.根据所述初始关键数据和所述精确关键数据的数据依赖关系进行关键数据传播分析得到所述关键数据。
14.根据本发明提供的一种内存数据损坏攻击的监测方法,所述初始关键数据包括三类,分别为:
15.进行过运算操作的指针和易受攻击函数的参数;
16.用户输入和网络应用程序中接收的外部数据;
17.条件分支参数、循环判断参数、库函数参数、系统调用参数、函数指针、间接调用目标地址和返回地址。
18.根据本发明提供的一种内存数据损坏攻击的监测方法,所述对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,包括:
19.对所述初始关键数据采用控制流分析得到所述控制流信息,所述控制流信息包括过程内程序执行过程和过程间函数跳转过程;
20.对所述控制流信息采用指针分析得到所述指针指向信息;
21.将所述指针指向信息中指向的目标集合替换所述初始关键数据中的指针,得到精确关键数据。
22.根据本发明提供的一种内存数据损坏攻击的监测方法,所述指针分析采用安德森指针分析算法。
23.根据本发明提供的一种内存数据损坏攻击的监测方法,根据所述内存读指令的标签检查指令进行标签检查,包括:
24.若所述内存读指令的关键数据的运行时标签与合法标签一致,则未发现攻击;若不一致,则发现攻击。
25.本发明还提供一种内存数据损坏攻击的监测装置,包括:
26.静态分析模块,用于对内存数据进行静态分析得到关键数据;
27.代码插桩模块,用于在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
28.标签检查模块,用于执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
29.本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述内存数据损坏攻击的监测方法。
30.本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述内存数据损坏攻击的监测方法。
31.本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述内存数据损坏攻击的监测方法。
32.本发明提供的一种内存数据损坏攻击的监测方法及装置,通过在内存数据中锁定关键数据,缩减保护数据量,提出了基于关键数据的数据流完整性防御机制,在程序运行时,更加高效地监测内存数据损坏攻击。
附图说明
33.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
34.图1是本发明提供的内存数据损坏攻击的监测方法的流程示意图之一;
35.图2是本发明提供的静态分析的流程示意图;
36.图3是本发明提供的控制流分析和指针分析的流程示意图;
37.图4是本发明提供的攻击检测实例示意图
38.图5是本发明提供的内存数据损坏攻击的监测方法的流程示意图之二;
39.图6是本发明提供的内存数据损坏攻击的监测装置的结构示意图;
40.图7是本发明提供的电子设备的结构示意图。
具体实施方式
41.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
42.rop:面向返回的编程是以ret为结尾的代码片段作为配件,结合对栈空间的控制,以ret作为不同配件之间的连接,不断的使程序运行这些配件。当程序执行一次return时,cpu从当前的栈上取出一个地址,并且跳转到这一地址指向的代码处开始运行。
43.dop:面向数据编程攻击是通过内存漏洞修改参与运算的数据变量,例如库函数参数,循环参数,条件分支参数等,在不改变控制流的情况下完成恶意攻击。
44.jop:面向跳转的编程是以jump为结尾的代码片段作为配件,并以jump作为不同配件之间的连接。通过栈溢出控制栈上的数据,然后利用pop指令,将栈上的数据弹出到通用寄存器中。通过修改内存数据,利用load指令,将内存数据存入通用寄存器中。
45.dfi:数据流完整性防御机制通过静态分析获取数据的合法写集合,采用代码插桩的方式对数据的内存读写指令进行指令插桩,得到可执行文件。在程序运行时,实时计算内存写指令的标签;遇到内存读指令时,进行标签检查,即检查内存读指令对应的内存写的标签值是否在静态分析得到的合法写集合中,若在,则继续执行;若不在,说明数据被非法损坏,产生异常行为,则终止程序执行。
46.数据流完整性防御机制的根本问题是保护的数据过多。对于内存数据损坏攻击而言,有一些数据是攻击所必需的,如果不控制这些数据,攻击就无法进行。所以,只需要保护这些数据不被控制,就能让攻击无法实现。通过对当前内存攻防的研究,本发明明确了内存数据损坏攻击相关的关键数据,仅需保护关键数据即可有效的防御内存数据损坏攻击。
47.下面结合图1-图3描述本发明的内存数据损坏攻击的监测方法,该方法包括如下步骤:
48.步骤101、对内存数据进行静态分析得到关键数据;
49.步骤102、在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
50.需要说明的是,给内存写指令插桩的设置标签指令是为了获取运行时标签。
51.步骤103、执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
52.需要说明的是,执行标签检查指令的对象,例如易受攻击函数的参数,进行过运算操作的指针,条件分支参数等。
53.本发明实施例提供的一种内存数据损坏攻击的监测方法,通过在内存数据中锁定关键数据,缩减保护数据量,提出了基于关键数据的数据流完整性防御机制,在程序运行时,更加高效地监测内存数据损坏攻击。
54.在本发明的至少一个实施例中,所述根据所述内存读指令的标签检查指令进行标签检查,包括:
55.若所述内存读指令的关键数据运行时标签与合法标签一致,则未发现攻击,继续执行;若不一致,则发现攻击,停止执行。
56.在本发明的至少一个实施例中,所述根据所述函数返回指令和函数调用指令的标签检查指令进行标签检查,包括:
57.对于函数返回指令,在函数头添加标签用于保护函数指针,在函数尾添加检查标签的指令,若函数返回指令运行时标签与保护函数指针的标签一致,则未发现攻击;若不一致,则发现攻击。
58.对于函数调用指令,若间接调用指令的函数指针的运行时标签在对应的合法标签中,则未发现攻击;若不在,则发现攻击。
59.在本发明的至少一个实施例中,所述对内存数据进行静态分析得到关键数据,包括:
60.步骤201、对所述内存数据进行数据流分析得到初始关键数据;
61.需要说明的是,在llvm前端clang编译器的抽象语法树(abstract syntax tree,ast)层进行数据流分析后,得到的初始关键数据key data。llvm在编译的语法分析过程中将程序生成一个较完整的抽象语法树,对变量和函数按照类型进行标记,并且对赋值操作进行分析得到对应数据流信息。定义了类clang plug in ast vistor,通过继承类recursive ast vistitor递归访问每个结点。通过visitdecl函数处理每个decl结点,通过visitstmt函数处理每个stmt结点,获取变量信息,数据流传递关系。
62.步骤202、对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,所述精确关键数据包括所述初始关键数据的控制流信息以及指针指向信息;
63.需要说明的是,通过控制流分析来确定程序每个函数的执行流程以及过程间调用关系,即得到程序的控制流信息。以基本块为单位进行分析,每个基本块中有若干条指令,从基本块第一条指令连续执行到最后一条指令,基本块以跳转指令或返回指令结尾。通过
建立指针与所指向的变量地址关系,得到指针指向的目标集合,用指向的目标替换数据流中的指针,这一步得到的同一指针指向的变量使用相同标签。。
64.步骤203、根据所述初始关键数据和所述精确关键数据的数据依赖关系进行关键数据传播分析得到所述关键数据。
65.需要说明的是,由于数据之间存在依赖关系,对关键数据进行跟踪,检测程序可能的执行路径,识别当前操作的状态。找到影响关键数据的数据并进行扩展,得到最终的关键数据。
66.具体的,所述扩展借助logicblox模拟程序执行。
67.现有的dfi机制未分析数据之间的依赖关系,未分析程序的控制流,导致指针分析不精确等。而本发明的实施例,由于分析对象仅为关键数据,在不引入更高性能开销的前提下,可以采用更加精确的分析过程,例如完整的控制流分析,以及分析数据之间的依赖关系等。
68.在本发明的至少一个实施例中,所述初始关键数据包括三类,分别为:
69.进行过运算操作的指针和易受攻击函数的参数;
70.用户输入和网络应用程序中接收的外部数据;
71.条件分支参数、循环判断参数、库函数参数、系统调用参数、函数指针、间接调用目标地址和返回地址。
72.需要说明的是,本发明实施例中关键数据包括3类11种,如表1所示:
73.表1
74.[0075][0076]
在本发明的至少一个实施例中,所述对所述内存数据进行数据流分析得到初始关键数据,其中,对每一行源码进行数据流分析包括:
[0077]
如果一个指针变量作为运算的结果,那么标记其为unsafe data;
[0078]
判断函数是否为易受攻击函数集合中的函数,如果是,则将其参数定义为unsafe data;
[0079]
判断函数是否为用户输入函数、网络应用程序中用于接收的外部数据的函数,如果是,则将其参数定义为input data;
[0080]
通过对函数调用语句的处理,判断其是否为库函数或者系统调用,若是,则将其参数定义为exploit data;
[0081]
通过对赋值语句左右子树的提取,获得数据流传递关系,得到对变量的读写关系,特别地处理指针、数组、结构体赋值操作。如果是函数指针,则其为exploit data;
[0082]
通过对条件分支语句的处理,如果是循环或者判断的条件分支语句的子结点,则该变量为exploit data。
[0083]
在本发明的至少一个实施例中,对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,包括:
[0084]
步骤301、对所述初始关键数据采用控制流分析得到所述控制流信息,所述控制流信息包括过程内程序执行过程和过程间函数跳转过程;
[0085]
需要说明的是,采用控制流分析去分析分支指令branch、switch以及跳转指令call、ret等指令得到控制流信息,进一步得到数据的传递过程和函数跳转过程。
[0086]
步骤302、对所述控制流信息采用指针分析得到所述指针指向信息;
[0087]
需要说明的是,使用指针分析分析指针,建立指针和它所指向的变量地址关系,得到指针指向的目标集合。
[0088]
步骤303、将所述指针指向信息中指向的目标集合替换所述初始关键数据中的指针,得到精确关键数据。
[0089]
在本发明的至少一个实施例中,所述指针分析采用安德森指针分析算法。
[0090]
需要说明的是,采用安德森(andersen)指针分析算法对代码中的指针或引用进行标记和跟踪,找出程序中指针可能的指向目标集合,同一指针指向的变量使用相同标签。安德森指针分析算法的分析对象包括unsafe data,以及识别间接调用目标地址,返回地址等exploit data。
[0091]
在本发明的至少一个实施例中,由于标签数和数据分类有关,因此所述标签的标签位为3bit。
[0092]
需要说明的是,现有dfi采用16bit作为标签位。本发明根据内存攻击中数据的不同作用,按照关键数据的类别设计了3bit标签位,极大降低了空间开销,并在运行时会降低性能损耗。
[0093]
在本发明的至少一个实施例中,由于关键数据根据数据在内存攻击中的不同作用分成三类且通过静态分析可以确定每个数据的类别。由于攻击者的恶意行为会更改数据的类别,从而产生异常。因此需要按照关键数据的类别设计标签。
[0094]
具体的,运行时标签与合法标签用三位二进制表示:
[0095]
001:表示此数据为unsafe data
[0096]
010:表示此数据为exploited data
[0097]
100:表示此数据为input data
[0098]
最后数据的标签值为三者相加之和。普通变量标签均用000表示。
[0099]
本实施例公开了一段攻击检测的实际代码:
[0100]
1:int main(){
[0101]
2:char*dfibuf;
[0102]
3:char buffer[1024];
[0103]
4:socketconnet();
[0104]
5:read(client_sockfd,buffer,1024);
[0105]
6:static void(*pfun2)();
[0106]
7:static void(*pfun1)();
[0107]
8:static char*tmpfile,aa[16],*tmpfile1;
[0108]
9:static void(*pfun)();
[0109]
10:tmpfile=aa;
[0110]
11:tmpfile1=aa;
[0111]
12:static char bb[16];
[0112]
13:static void(*pfun3)();
[0113]
14:pfun=ppp;
[0114]
15:memcpy(aa,buffer,32);
[0115]
16:(*pfun)();
[0116]
17:}
[0117]
图4是本发明实施例的攻击检测实例示意图,参照图4和上述代码,通过静态分析
得到aa、pfun是exploit data,aa还是unsafe data,通过对其添加标签和检查标签的机制对其进行保护。未初始化静态变量和全局变量都存在bss数据段,所以变量数组aa和函数指针*pfun均存储在bss段。在第15行写入数组aa时,在地址标签对应表里设置其标签为011。在14行写入函数指针*pfun,设置标签为010,在16行读取函数指针过程中检查*pfun的标签,*pfun的合法标签为010,但是由于数组aa溢出覆盖*pfun对应内存,则*pfun内存地址对应的标签此时为011,不属于合法标签集合,所以检查出错误,提示错误并终止程序的运行。
[0118]
如图5所示,为本发明实施例提供的一种内存数据损坏攻击的监测方法的流程图。首先,获取源程序。在静态分析阶段,使用多阶段的静态数据流分析去识别关键数据。在代码插桩阶段,根据识别的关键数据计算每个数据的具体标签值。对源码程序插桩实现对数据标签的读写检查,在内存写指令前插入设置标签的指令,在内存读指令前插入一段标签检查的指令。遇到函数返回指令,在函数头添加标签,保护函数指针,在函数尾添加检查标签的指令,确保返回地址没有被修改。对于函数调用指令,得到函数名称、函数参数等信息。对于函数参数,如果是普通的函数调用,则对函数参数传递过程中的内存读写进行插桩,如果没有则不进行操作。尤其针对间接调用指令,需要根据指针分析得到间接调用函数的指针指向集,求出每个指向的函数指针对应的合法标签,在间接调用指令之前添加标签检查,最终得到可执行文件。
[0119]
运行可执行文件,遇到内存写指令,则计算对应的运行时标签并存储。遇到内存读指令,获取内存读指令中关键数据对应的运行时标签。然后进行标签检查,如果此标签值和静态分析得到的合法标签值一致,继续执行程序;若不一致,报错终止程序执行。遇到函数返回指令和函数调用指令,也执行对应的标签检查操作。
[0120]
下面对本发明提供的内存数据损坏攻击的监测装置进行描述,下文描述的内存数据损坏攻击的监测装置与上文描述的内存数据损坏攻击的监测方法可相互对应参照。如图6所示,本发明的内存数据损坏攻击的监测装置,包括:
[0121]
静态分析模块601,用于对内存数据进行静态分析得到关键数据;
[0122]
代码插桩模块602,用于在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
[0123]
标签检查模块603,用于执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
[0124]
本发明实施例提供的一种内存数据损坏攻击的监测装置,通过在内存数据中锁定关键数据,缩减保护数据量,提出了基于关键数据的数据流完整性防御机制,在程序运行时,更加高效地监测内存数据损坏攻击。
[0125]
在本发明的至少一个实施例中,所述根据所述内存读指令的标签检查指令进行标签检查,包括:
[0126]
若所述内存读指令的关键数据的运行时标签与合法标签一致,则未发现攻击,继续执行;若不一致,则发现攻击,停止执行。
[0127]
在本发明的至少一个实施例中,所述根据所述函数调用指令和函数返回指令的标签检查指令进行标签检查,包括:
[0128]
对于函数返回指令,在函数头添加标签用于保护函数指针,在函数尾添加检查标
签的指令,若函数返回指令运行时标签与保护函数指针的标签一致,则未发现攻击;若不一致,则发现攻击。
[0129]
对于函数调用指令,若间接调用指令的函数指针的标签在对应的合法标签中,则未发现攻击;若不在,则发现攻击。
[0130]
在本发明的至少一个实施例中,所述对内存数据进行静态分析得到关键数据,包括:
[0131]
对所述内存数据进行数据流分析得到初始关键数据;
[0132]
对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,所述精确关键数据包括所述初始关键数据的控制流信息以及指针指向信息;
[0133]
根据所述初始关键数据和所述精确关键数据的数据依赖关系进行关键数据传播分析得到所述关键数据。
[0134]
在本发明的至少一个实施例中,所述初始关键数据包括三类,分别为:
[0135]
进行过运算操作的指针和易受攻击函数的参数;
[0136]
用户输入和网络应用程序中接收的外部数据;
[0137]
条件分支参数、循环判断参数、库函数参数、系统调用参数、函数指针、间接调用目标地址和返回地址。
[0138]
在本发明的至少一个实施例中,所述对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,包括:
[0139]
对所述初始关键数据采用控制流分析得到所述控制流信息,所述控制流信息包括过程内程序执行过程和过程间函数跳转过程;
[0140]
对所述控制流信息采用指针分析得到所述指针指向信息;
[0141]
将所述指针指向信息中指向的目标集合替换所述初始关键数据中的指针,得到精确关键数据。
[0142]
在本发明的至少一个实施例中,所述指针分析采用安德森指针分析算法。
[0143]
与现有技术相比,本发明采用了较为精确的多阶段的静态分析过程,分析结果更加精确,冗余信息更少。本实施例使用ripe,cve-2002-1496进行安全评估,如表2所示,经评估本发明可以更加有效的监测内存数据损坏攻击。
[0144]
表2 ripe的监测结果
[0145]
防御机制攻击总数成功防御数成功监测率dfi85066378.00%本发明85076990.47%
[0146]
由于缩小了保护数据集合,设计了本发明减少了运行时检查的频率,从而可减少检查时的性能开销。本发明实施例使用spec2000进行测试,如表3所示,开销约为10%。
[0147]
表3 spec2000的评估结果
[0148][0149]
图7示例了一种电子设备的实体结构示意图,如图7所示,该电子设备可以包括:处理器(processor)710、通信接口(communications interface)720、存储器(memory)730和通信总线740,其中,处理器710,通信接口720,存储器730通过通信总线740完成相互间的通信。处理器710可以调用存储器730中的逻辑指令,以执行内存数据损坏攻击的监测方法,该方法包括:
[0150]
对内存数据进行静态分析得到关键数据;
[0151]
在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
[0152]
执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
[0153]
此外,上述的存储器730中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0154]
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行
时,计算机能够执行上述各方法所提供的内存数据损坏攻击的监测方法,该方法包括:
[0155]
在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
[0156]
执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
[0157]
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的内存数据损坏攻击的监测方法,该方法包括:
[0158]
在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;
[0159]
执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
[0160]
以上所描述的装置实施例仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0161]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0162]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
技术特征:1.一种内存数据损坏攻击的监测方法,其特征在于,包括:对内存数据进行静态分析得到关键数据;在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。2.根据权利要求1所述的内存数据损坏攻击的监测方法,其特征在于,所述对内存数据进行静态分析得到关键数据,包括:对所述内存数据进行数据流分析得到初始关键数据;对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,所述精确关键数据包括所述初始关键数据的控制流信息以及指针指向信息;根据所述初始关键数据和所述精确关键数据的数据依赖关系进行关键数据传播分析得到所述关键数据。3.根据权利要求2所述的内存数据损坏攻击的监测方法,其特征在于,所述初始关键数据包括三类,分别为:进行过运算操作的指针和易受攻击函数的参数;用户输入和网络应用程序中接收的外部数据;条件分支参数、循环判断参数、库函数参数、系统调用参数、函数指针、间接调用目标地址和返回地址。4.根据权利要求2所述的内存数据损坏攻击的监测方法,其特征在于,所述对所述初始关键数据进行控制流分析和指针分析得到精确关键数据,包括:对所述初始关键数据采用控制流分析得到所述控制流信息,所述控制流信息包括过程内程序执行过程和过程间函数跳转过程;对所述控制流信息采用指针分析得到所述指针指向信息;将所述指针指向信息中指向的目标集合替换所述初始关键数据中的指针,得到精确关键数据。5.根据权利要求4所述的内存数据损坏攻击的监测方法,其特征在于,所述指针分析采用安德森指针分析算法。6.根据权利要求1至5任一所述的内存数据损坏攻击的监测方法,其特征在于,所述根据所述内存读指令的标签检查指令进行标签检查,包括:若所述内存读指令的关键数据的运行时标签与合法标签一致,则未发现攻击;若不一致,则发现攻击。7.一种内存数据损坏攻击的监测装置,其特征在于,包括:静态分析模块,用于对内存数据进行静态分析得到关键数据;代码插桩模块,用于在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;标签检查模块,用于执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。
8.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至6任一项所述内存数据损坏攻击的监测方法。9.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述内存数据损坏攻击的监测方法。10.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述内存数据损坏攻击的监测方法。
技术总结本发明提供一种内存数据损坏攻击的监测方法和装置,方法包括:对内存数据进行静态分析得到关键数据;在所述内存数据的内存读指令、函数调用指令和函数返回指令前插入标签检查指令,在所述内存数据的内存写指令前插入设置标签的指令,得到所述内存数据的可执行文件;执行所述可执行文件,根据所述关键数据的内存读指令、函数调用指令和函数返回指令的标签检查指令进行标签检查。本发明通过在内存数据中锁定关键数据,缩减保护数据量,提出了基于关键数据的数据流完整性防御机制,在程序运行时,更加高效地监测内存数据损坏攻击。更加高效地监测内存数据损坏攻击。更加高效地监测内存数据损坏攻击。
技术研发人员:陈李维 聂晓帆 张元瞳 魏浩来 史岗 孟丹
受保护的技术使用者:中国科学院信息工程研究所
技术研发日:2022.03.15
技术公布日:2022/7/5