著录项信息
专利名称 | 一种攻击时漏洞检测方法及其系统 |
申请号 | CN200910081510.5 | 申请日期 | 2009-04-10 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2009-08-26 | 公开/公告号 | CN101515320 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/22 | IPC分类号 | G;0;6;F;2;1;/;2;2;;;H;0;4;L;2;9;/;0;6查看分类表>
|
申请人 | 中国科学院软件研究所 | 申请人地址 | 北京市海淀区中关村南四街4号
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中国科学院软件研究所 | 当前权利人 | 中国科学院软件研究所 |
发明人 | 陈恺;苏璞睿;司端锋 |
代理机构 | 北京君尚知识产权代理事务所(普通合伙) | 代理人 | 余长江 |
摘要
本发明公开了一种攻击时漏洞检测方法及其系统,属于网络安全领域。本发明方法为:被分析的程序加载到虚拟机后,识别虚拟机当前运行的进程是否属于被分析的程序;如果是则判断当前代码是否处于循环中,如果处于循环中则记录当前状态信息;否则判断当前程序是否存在攻击;如果存在攻击,则从记录的当前状态信息中寻找最后一次程序指针所依赖变量被改变之前的状态s;恢复s中保存的状态信息,重新从状态s开始运行,找出修改程序指针所依赖变量的具体指令并返回该指令的位置;本发明的系统包括:虚拟环境模块、状态选择模块、系统监视模块、漏洞分析模块、状态记录模块。本发明操纵性好、检测效率高,同时避免了商业软件缺乏源代码无法分析的问题。
1.一种攻击时漏洞检测方法,其步骤为:
1)将被分析的程序加载到虚拟机中并运行;
2)识别出当前运行的属于被分析程序的进程,并记录其当前状态信息;
3)根据当前状态信息判断当前进程所属程序是否存在攻击;
4)如果存在攻击,则从记录的当前状态信息中寻找最后一次程序指针所依赖变量被改变之前的状态s;
5)恢复状态s中保存的状态信息,重新从状态s开始运行,找出修改程序指针所依赖变量的具体指令并记录该指令的位置;其中,所述找出修改程序指针所依赖变量的具体指令的方法为:重新从s状态开始运行后,每执行一条指令判断是否改变了程序指针所依赖变量a的值,如果发生改变且改变为漏洞被触发时a的值,则记录下当前指令位置。
2.如权利要求1所述的方法,其特征在于所述被分析程序的进程识别方法为:根据当前虚拟CPU中存储页目录地址的寄存器的值区分程序的进程,并且根据虚拟内存中的相应内容获取进程名称信息,然后通过进程名称对比,识别虚拟机当前运行的进程是否属于被分析的程序。
3.如权利要求1所述的方法,其特征在于在所述步骤2)中,识别出进程后判断该进程是否处于循环中,如果处于循环中,则记录当前状态信息;所述判断进程是否处于循环中的方法为:采用静态DJ图的方式判断进程是否处于循环中。
4.如权利要求1所述的方法,其特征在于所述当前状态信息包括:虚拟内存中堆、栈和虚拟CPU中寄存器信息。
5.如权利要求4所述的方法,其特征在于根据程序的指针是否指向堆或者栈中,判断当前进程所属程序是否存在攻击。
6.一种攻击时漏洞检测系统,包括虚拟环境模块、状态选择模块、系统监视模块、漏洞分析模块、状态记录模块;
所述虚拟环境模块:用于提供虚拟的执行环境,将被分析程序加载入虚拟环境并执行,所述系统监视模块:用于监控系统当前运行时的状态信息并识别虚拟机当前运行的进程是否属于被分析的程序,同时将当前状态信息传送给状态选择模块和漏洞分析模块;
所述状态选择模块:用于根据当前状态信息判断当前进程的代码是否处于循环中,并将当前状态信息传送给所述状态记录模块;
所述状态记录模块:用于将接收到的状态信息保存记录;
所述漏洞分析模块:用于判断当前进程所属程序是否存在攻击,如果存在攻击,则从记录的当前状态信息中寻找最后一次程序指针所依赖变量被改变之前的状态s;恢复状态s中保存的状态信息,重新从状态s开始运行,每执行一条指令判断是否改变了程序指针所依赖变量a的值,如果发生改变且改变为漏洞被触发时a的值,则记录下当前指令位置。
7.如权利要求6所述的系统,其特征在于所述当前状态信息包括:虚拟内存中堆、栈和虚拟CPU中寄存器信息。
8.如权利要求7所述的系统,其特征在于所述漏洞分析模块根据程序的指针是否指向堆或者栈中,判断当前进程所属程序是否存在攻击。
9.如权利要求6所述的系统,其特征在于所述虚拟环境模块包括虚拟CPU、虚拟内存、虚拟硬盘、虚拟输入输出系统。
一种攻击时漏洞检测方法及其系统\n技术领域\n[0001] 本发明主要涉及一种漏洞的检测方法和系统,尤其涉及一种攻击时漏洞检测方法和系统,属于网络安全领域。\n背景技术\n[0002] 未知漏洞是黑客与软件开发者希望率先掌握的第一手资料。对于黑客,获取一定数量的未知漏洞,可以随意进入存在相应漏洞的计算机,进行权限提升,甚至可以进一步产生更大的破坏。随着网络的不断发展以及各种软件数量和种类的不断增多,未知漏洞产生的危害更为明显。危害巨大的蠕虫几乎都是未知漏洞的产物。例如,众所周知的冲击波利用了微软的MS03-026漏洞,震荡波利用了微软的MS04-011漏洞,SQL蠕虫王利用了微软SQLServer的漏洞等等。因此,如何在漏洞被成功利用前保护系统并检测出未知漏洞,就成为软件安全工作的重中之重了。\n[0003] 目前主要的漏洞检测手段为基于源程序的静态漏洞检测。可是由于多数软件不提供源程序,大大限制了这类分析方法的检测范围。因此人们试图将基于源程序的漏洞检测方法移植到可执行程序上。但可执行程序本身的不确定性极大地降低了分析结果的准确性,例如间接跳转、指针别名等都是目前静态分析中难以解决的问题。软件保护技术亦增加了分析的难度,例如多态、变形、加密等方式迫使静态分析甚至不能反编译出有效的代码。\n事实上,只要在漏洞被成功利用前阻止漏洞产生危害并且暴露漏洞本身,就可以有效防止利用这个漏洞产生的攻击。因此,如何在漏洞被成功利用之前保护系统并找出漏洞成为目前漏洞研究的热点。\n发明内容\n[0004] 针对上述问题,本发明的目的在于提供漏洞检测方法,在攻击产生时,根据攻击本身的信息进行漏洞分析,准确定位软件漏洞。这部分漏洞信息,可以加快软件生产商补丁发布工作,也可以在补丁未发布前提供临时解决方案。\n[0005] 根据以上目的,如图1所示,漏洞的攻击时检测方法包括步骤:\n[0006] 1)虚拟机加载:由虚拟加载器将被分析的程序加载到虚拟环境中,同时执行。虚拟环境中事先安装操作系统作为被分析程序的运行平台,称为客户操作系统。客户操作系统根据被分析程序的不同选择Windows或者Linux等。\n[0007] 2)进程定位:由于目前多数操作系统是多任务同时执行的,所以虚拟环境中所有的程序共同运行在虚拟CPU上。因此,有必要对当前在虚拟CPU上执行的代码进行区分,识别出这段代码所隶属的程序。虚拟CPU中有个特殊的检测器CR3,存储着页目录地址。根据操作系统的知识,页目录相对于进程是唯一的。因此可以根据当前虚拟CPU中CR3的值区分进程,并且根据虚拟内存中的相应内容获取进程名称信息,由此可以判断当前运行中的进程是否是需要分析的进程。如果是,转步骤3),否则转步骤8)。\n[0008] 3)循环判断:如果当前代码处于循环中,转步骤4),否则转步骤5)。循环判断方法可以采用动态方式或者静态方式进行判断,这里使用静态DJ图的方式进行判断。\n[0009] 4)状态记录:记录当前状态,包括堆、栈、CPU寄存器信息。\n[0010] 5)攻击检测:判断当前程序指针是否指向堆或者栈中,如果处于,则表示存在攻击,转步骤6),否则表示不存在攻击,转步骤8)。\n[0011] 6)状态回滚:设程序指针所依赖的变量为a,在记录的状态集中寻找最后一次a被改变的记录位置。由于并不是每条指令都被记录,因此找到的程序记录状态并不一定是改变a的位置。\n[0012] 7)再运行检测:将步骤6中的找到的状态记为s,恢复s中保存的寄存器、堆、栈信息,重新从s位置开始运行,此时找出修改a的具体指令。如果能找出,即找到漏洞的位置,返回此位置;否则表示记录下的状态并不足以指示漏洞的位置,返回错误。\n[0013] 8)继续虚拟环境的执行,如果程序运行结束则返回,否则转步骤2)。\n[0014] 本发明的积极效果为:\n[0015] 与现有技术相比,本发明使用虚拟环境执行,可以最大限度的避免干扰被分析程序的运行,同时可以获取最准确的内存以及寄存器数据,保持更好的操纵性;有选择的记录状态,可以使得状态数量尽量少,降低内存使用率,提高分析效率;攻击时进行漏洞分析,可以有针对性的进行漏洞检测,提高检测效率,同时保证漏洞不被成功利用,保证了系统的安全性;使用二进制代码分析,可以在缺乏源代码的情况下进行直接分析,避免了商业软件缺乏源代码无法分析的问题。\n附图说明\n[0016] 图1为攻击时漏洞检测的流程图;\n[0017] 图2为攻击时漏洞检测系统结构示意图。\n具体实施方式\n[0018] 如图1所示,为最简化模式下的攻击时漏洞检测流程图。具体的实现方式如下:\n[0019] 1)虚拟机加载:由虚拟加载器将被分析的程序加载到虚拟环境模块中,同时执行。虚拟环境模块中事先安装操作系统作为被分析程序的运行平台,称为客户操作系统。\n操作系统根据被分析程序的不同选择Windows或者Linux等。具体代码如下:run(target program);\n[0020] 2)进程定位:程序是代码的静态描述,进程是代码的动态描述,即运行起来的程序。由于客户操作系统安装的是windows操作系统,属于多任务操作系统,即虚拟CPU上在某段时间内可能执行多个不同的程序。因此需要识别虚拟CPU上当前正在运行的代码是否属于需要被分析的程序。这部分工作由系统监视模块完成。虚拟CPU中有个特殊的寄存器CR3,存储着页目录地址。根据操作系统的知识,页目录相对于进程是唯一的。因此可以根据当前虚拟CPU中CR3的值区分程序的进程,并且根据虚拟内存中的相应内容获取进程名称信息(如在windows操作系统下,通过EPROCESS结构信息获取程序的名称),由此可以判断当前运行中的进程是否是需要分析的进程。如果是,转步骤3),否则转步骤8)。采用如下结构表示进程结构信息。\n[0021] typedef struct cr3_table_struct{\n[0022] int cr3_value;\n[0023] int is_need_log;\n[0024] uint8_t name[NEXT_LEN];\n[0025] unsigned long PID;\n[0026] }cr3_table_struct;\n[0027] 其中,cr3_value表示CR3寄存器的值;is_need_log表示是否需要监控;name表示进程名称;PID表示进程的ID号。通过进程名称的比对,可以选取需要分析的程序作为分析对象,同时根据操作系统的信息可以获得PID信息。\n[0028] 3)状态选择模块根据系统监控模块提供的状态信息(如虚拟内存中堆、栈和虚拟CPU中寄存器信息)判断当前指令是否处于循环中,比如当系统监控模块提供的指令指针(EIP)信息在当前进程所有循环指令的地址范围内时,即可以确认为当前指令在循环中,如果代码处于循环中,转步骤4),否则转步骤5)。可以采用动态方式或者静态方式对循环进行判断,这里使用静态DJ图(支配-加入图)的方式进行判断,得到当前进程所有处于循环过程内地址的集合。代码如下:\n[0029] if(the code is in a loop)\n[0030] goto module4;\n[0031] else{\n[0032] goto module5;\n[0033] }\n[0034] 4)状态记录模块根据状态选择模块提供的信息,记录当前状态信息,包括虚拟内存中堆、栈和虚拟CPU中寄存器信息。这部分的代码如下:\n[0035] save(heap);\n[0036] save(stack);\n[0037] save(register);\n[0038] save是记录函数。\n[0039] 5)漏洞分析模块检测当前状态下是否存在攻击,检测方法是判断当前程序指针是否指向堆或者栈中,如果处于,则表示存在攻击,转步骤6),否则表示不存在攻击,转步骤\n8)。\n[0040] if(eip points to stack or heaps)\n[0041] goto module6;\n[0042] else\n[0043] goto module8;\n[0044] 6)设程序指针所依赖的变量为a,漏洞分析模块在状态记录模块提供的记录的状态集中寻找最后一次a被改变的记录位置,并根据此位置得到变量a改变之前的状态s。具体程序如下:\n[0045] for each state_i in states\n[0046] {\n[0047] if(state_i.a==a)continue;\n[0048] else break;\n[0049] }\n[0050] 如果没有找到a,则表示记录状态不全,返回错误;否则循环结束时,state指向需要重新执行分析的状态。\n[0051] 7)将步骤6中找到的状态记为s,恢复s中保存的寄存器、堆、栈信息,重新从s状态开始运行,此时找出修改a的具体指令。具体的判断方法为,每执行一条指令判断是否改变了a的值,如果发生改变且改变为漏洞被触发时a的值,则记录下当前指令位置。此位置即为找到漏洞的位置,返回此位置;否则表示记录下的状态并不足以指示漏洞的位置,返回错误。具体代码如下:\n[0052] heap=s.heap;\n[0053] stack=s.stack;\n[0054] register=s.register;\n[0055] rerun(s);\n[0056] if(find the vulnerability)\n[0057] return the vulnerability\n[0058] else\n[0059] return null and restart the target program\n[0060] 8)继续虚拟环境的执行,如果程序运行结束则返回,否则转步骤2)。具体的代码如下:\n[0061] continue to run the virtual environment;\n[0062] if(the target program ends)return;\n[0063] else goto module2;\n[0064] 图2是攻击时漏洞检测系统结构示意图,具体模块分为:虚拟环境模块、状态选择模块、系统监视模块、漏洞分析模块、状态记录模块。\n[0065] 虚拟环境模块:提供虚拟的执行环境,包括虚拟CPU、虚拟内存、虚拟硬盘、虚拟输入输出系统。此模块输入为外界被分析的程序和外界的I/O输入(例如键盘输入等)。通过将被分析程序加载入虚拟环境并执行,虚拟内存和虚拟CPU记录着相应的程序运行时信息。外界输入和运行中的被分析程序通过虚拟I/O交互。\n[0066] 系统监视模块:监控系统当前运行时的状态信息并识别虚拟机当前运行的进程是否属于被分析的程序,同时传送给状态选择模块、和漏洞分析模块进行分析。\n[0067] 状态选择模块:用于根据当前状态信息判断当前进程的代码是否处于循环中,并将当前的状态信息(包括虚拟CPU、虚拟内存等信息)传送给状态记录模块。\n[0068] 状态记录模块:将接收到的状态信息保存记录。\n[0069] 漏洞分析模块:用于判断当前进程所属程序是否存在攻击,如果存在攻击,则从记录的当前状态信息中寻找最后一次程序指针所依赖的变量被改变之前的状态s;恢复状态s中保存的状态信息,重新从状态s开始运行,找出修改程序指针所依赖变量的具体指令并返回该指令的位置;即如果漏洞被触发,通过状态记录模块记录的信息,检查程序中的漏洞产生点,并将漏洞信息输出。\n[0070] 以上是本发明提供方法的具体实施例。本领域技术人员从本说明书及实施例的描述中可以容易地实现该软件系统,因此本实施例中不再做详细的描述。
法律信息
- 2011-08-17
- 2009-10-21
- 2009-08-26
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有引用任何外部专利数据! |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 1 | | 2011-12-19 | 2011-12-19 | | |
2 | | 2011-12-19 | 2011-12-19 | | |