一种高效动态软件漏洞挖掘方法

文档序号:6602308阅读:374来源:国知局
专利名称:一种高效动态软件漏洞挖掘方法
技术领域
本发明属于软件工程和信息安全领域,具体涉及一种高效的动态软件漏洞挖掘方 法。
背景技术
计算机、网络通信及软件等信息技术的飞速发展与广泛应用,推动了现代社会向 信息社会的迈进,而其中存在的大量漏洞和隐患也使得当前信息安全形势日益严峻,信息 安全中的一个核心问题就是存在于计算机系统中的软件安全漏洞,恶意的攻击者可以利用 这些安全漏洞提升权限,访问未授权资源,甚至破坏敏感数据。软件安全漏洞已经成为诸多 系统安全问题的根源之一,因此如何发现软件中的安全漏洞至关重要。模糊测试(Fuzzing),作为一种黑盒测试技术,是一种著名的软件安全漏洞动态挖 掘技术。模糊测试以大量畸形数据作为目标程序输入,观测目标程序处理畸形数据时的表 现,从而发掘目标程序内部潜在的缺陷或错误。模糊测试的工作流程包括以下几步1)按照一定规则产生一批畸形输入;2)将畸形输入逐一送入目标软件进行处理,并监视软件是否会抛出异常;3)记录软件产生的错误信息,如寄存器状态,栈状态等;4)向测试人员发送异常信息,以便进一步鉴定这些错误是否能被利用。在上述模糊测试(Fuzzing)技术中,如何生成畸形数据是影响模糊测试效率的关 键因素。很多模糊测试工具通常采用对正常输入进行随机修改的方法生成畸形数据。例 如,Idefense公司的FileFuzz可以将正常文件的每一个字节依次替换为随机值或预定义 的数值,进而生成畸形文件。但是,这样生成的畸形数据缺乏针对性,很难触发软件安全漏 洞,导致模糊测试工具效率低下。另外,一些模糊测试工具可以根据预定义的规则,自动生成畸形数据。但是这类模 糊测试工具严重依赖于人工定义畸形数据的生成规则。对于复杂的数据格式,人工定义生 成规则面临巨大的工作量,通常不可能完成;即使对于简单的数据格式,人工定义规则也很 容易弓I入错误,导致生成的畸形数据无法触发安全漏洞。

发明内容
本发明的目的在于克服现有模糊测试技术中的不足,提供一种高效的软件漏洞挖 掘方法为表述方便,目标软件接收的各种类型的输入(包括文件、命令行参数、网络报文 等)统称为输入数据。为了实现本发明的目的,采用的技术方案概述如下一种高效动态软件漏洞挖掘方法,其步骤包括1)目标软件处理正常输入数据,并收集正常输入数据中传播进入系统函数参数、库函数参数的字节;2)生成畸形数据;具体地,在正常输入数据中,修改传播进入系统函数、库函数的 字节,生成畸形数据;3)对目标软件测试;将生成的畸形数据输入至目标软件,如果目标软件处理这些 畸形数据时异常,则生成漏洞报告。进一步地,上述步骤1)收集正常输入数据中传播进入系统函数参数、库函数参数 的字节的方法包括1.1)通过系统函数调用劫持技术(H00K),劫持文件打开(例如UNIX系统里 open()函数)、文件读取(例如UNIX系统里read()函数)、文件关闭(例如UNIX系统中 close ()函数),以及网络数据操作函数。根据操作系统不同以及对输入数据关注点不同, 可以对需要劫持的函数范围适当修改,以达到最佳效果。1. 2)基于1. a)中工作,当目标程序将输入数据读入内存时,进一步地记录相应内 存地址与输入数据之间的依赖关系。以每个字节在正常输入数据中的位置偏移标示该字 节,并记录每个内存单元来源于哪些字节。1. 3)在程序执行过程中,跟踪输入数据的传播;特别地,采用动态代码插桩方法 跟踪正常输入数据的传播,根据每条机器指令(例如mov、add、pop)的语义信息,在运行时 刻跟踪、记录每个内存单元依赖于哪些输入字节。1.4)调用系统函数或库函数时,检查相应参数是否依赖于输入数据。如果依赖, 进一步输出相应参数依赖哪些输入字节。特别地,对于简单类型的参数(例如int,char 类型),直接检查参数数值是否依赖输入数据;对于指针类型的数据(例如int*,char*类 型),进一步检查指针所指向的内存单元是否依赖输入数据。对于其他复杂的函数参数,用 户可根据先验知识和系统调用及库函数的原型声明,指定哪些系统调用和库函数需要检查 以及相应的检查策略,以达最佳效果。所述正常输入数据包括文件、命令行参数和网络报文。进一步地,上述步骤2)包括但不限于以下几种修改模式2. 1)对每个可以传入系统调用、库函数的字节逐一替换为随机值;2. 2)对每个可以传入系统调用、库函数的字节逐一替换为指定值;2. 3)对可以传入系统调用、库函数的字节进行协同更改,例如将多个字节同时替 换为随机值或指定值。进一步地,上述步骤3)包括3. 1)在调试模式下运行目标软件;3. 2)逐一将步骤2)中生成的畸形数据输入至目标软件;3.3)如果目标软件发生异常(包括但不限于内存访问错误、除0异常、死循环 等),收集当时软件执行的调用栈以及执行上下文信息(例如当时寄存器信息),将这些信 息生成一个漏洞报告,输出至测试人员以便进一步鉴定这些错误是否能被利用。与现有技术相比,本发明方法的技术效果是本发明方法通过自动识别正常输入数据中传入系统函数、库函数的字节,从而针 对性的修改这些字节产生畸形数据,显著提高了畸形数据触发安全漏洞的可能性,充分提 高了模糊测试的效率。


图1是本发明方法总体流程图;图2是本发明方法步骤1的详细流程图。
具体实施例方式下面结合附图,更详细的描述本发明的具体实施方式
。步骤1.运行正常输入数据,收集运行时敏感信息。该步骤基于二进制动态代码插桩技术,在插桩模式下运行目标软件,跟踪输入数 据的读入、传播、使用。还可以采用二进制改变方法或者源代码的代码插桩方法(参见 文献[l]GeorgeC. Necula. CIL Intermediate Language and Tools for Analysis and Transformation ofC Programs. Proceedings of the 11th International Conference on Compiler Construction. 2002. [2]Susanta Nanda. BIRD :Binary Interpretation using Runtime Disassembly. Fourth IEEE/ACM International Symposium on Code Generation and Optimization,2006.)现有的二进制动态代码插桩技术已经十分成熟,很多著名IT公司如Intel、 VMware都已经相继推出了二进制动态代码插桩工具PIN、DynamoRIO等。本实施实例以PIN平台做二进制动态插桩工具给出详细的实施方式和操作过程, 但本发明的保护范围不限于本实施例。参看图2,对步骤1详细说明1. 1)劫持操作系统文件操作及网络数据操作的系统调用。基于PIN平台的API接 口 PIN_AddSyscallEntryFunction、PIN_AddSyscallExitFunction,劫持相应的系统调用的 参数和返回值。通过对一些文件打开、读入、关闭的系统调用的劫持,例如在windows平台
胃 NtCreateFile> NtOpenFile、NtReadFile, ^ Linuxopen、read、close、
seek、lseek等,就可以获得传入这些系统调用的参数及返回值。1. 2)如果目标软件将正常输入数据读入了内存,就记录内存单元和输入数据的映 射关系。例如,Linux平台上执行read(fd,buf,100)的作用是从文件fd中读取100字节 到以buf为起始地址的内存中。假设fd是输入文件,执行该read系统调用后,我们根据当 时fd的文件偏移及buf的数值,详细记录buf+0来源于第1输入字节, buf+i来源于第 i+1个输入字节…,buf+99来源于第100个输入字节。1. 3)在程序执行过程中,跟踪输入数据的传播;利用代码插桩方法跟踪正常输入 数据的传播,基于PIN提供的INSJnsertCall等API接口,在每条指令执行前,根据指令的 语义信息,检查该条指令对输入数据传播的影响。对于算术运算指令,如果原操作依赖于输入数据,则目的操作数也依赖于输入数 据。特别的,目的操作数依赖的输入数据等于所有源操作数依赖的输入数据的并集。例如 add eax, ebx ;//eax = eax+ebx ;假设eax依赖于第i个输入字节,ebx依赖于第j个输入 字节,执行该指令后,eax依赖于第i,j两个输入字节。对于特殊运算指令,例如xor eax, eax ;该指令的作用是将eax清0。假设执行该 指令前eax依赖于第i个输入字节,执行该指令后eax不依赖任何输入数据。对于数据传送指令,目的操作数依赖的输入数据依赖于源操作数的输入数据。例如,moveax,ebx ;//eax = ebx的作用是将ebx赋值给eax。执行该指令后,eax依赖于ebx 所依赖的输入数据。特别的,代码中的常数不依赖于任何输入数据。例如,mov eax,l,该指令将eax赋 值为常数1。执行该指令后eax不依赖任何输入数据。1. 4)调用系统函数或库函数时,检查相应参数是否依赖于输入数据。^ ^ PIN的 IMG_AddInstrumentFunction> RTN_FindByName> PIN_ AddSyscallEntryFunction、PIN_AddSyscallExitFunction 等 API 接 口,可以对指定的系 统调用或库函数劫持,进而检查参数是否依赖于输入数据。特别地,对于简单类型的参数 (例如int,char类型),直接检查参数数值是否依赖输入数据;对于指针类型的数据(例如 int*,char*类型),进一步检查指针所指向的内存单元是否依赖输入数据。对于其他复杂 的函数参数(例如int**,结构体指针),用户可根据先验知识和系统调用及库函数的原型 声明,指定哪些系统调用和库函数需要检查以及相应的检查策略,以达最佳效果。步骤2.生成畸形数据;具体地,根据步骤1)中收集的信息,针对性的修改可以传 入系统函数、库函数的字节,从而生成畸形数据。例如,假设步骤1中输出第10、11、12、13和第20、21、22、23等字节会传入系统调 用或库函数中。可以采用多种方式对上述字节修改2. 1)依次将原始样本中第10、11、12、13和第20、21、22、23等字节替换为随机值;
每个字节替换若干次。2. 2)依次将原始样本中第10、11、12、13和第20、21、22、23等字节替换为用户指定
值;用户可指定任意数值。2.3)将原始样本中第10、11、12、13和第20、21、22、23等字节写协同更改,例如同 时连续的四个字节(第10、11、12、13)视为一个整体,更改为随机值或如用户指定值。用户 可指定协同更改规则,以达到最佳效果。步骤3. Fuzzing 测试将步骤2中产生的畸形样本传递给目标软件,看目标软件是否会产生异常,异常 情况包括但不限于内存访问错误、除0异常、死循环等,如果有异常,收集异常情况发生时 软件执行的调用栈以及执行上下文信息(例如当时寄存器信息),将这些信息生成一个漏 洞报告,输出至测试人员以便进一步鉴定这些错误是否能被利用。上述步骤1至3可以循环进行。最后应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照 上述实施例对本发明进行了详细说明,本领域的技术人员应当理解依然可以对本发明进 行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖 在本发明的权利要求范围当中。
权利要求
一种高效动态软件漏洞挖掘方法,其步骤包括1)目标软件处理正常输入数据,并收集正常输入数据中传播进入系统函数参数、库函数参数的字节;2)在正常输入数据中,修改传播进入系统函数、库函数的字节,生成畸形数据;3)将生成的畸形数据输入至目标软件,如果目标软件处理畸形数据时异常,则生成漏洞报告。
2.如权利要求1所述的方法,其特征在于,所述正常输入数据包括文件、命令行参数和 网络报文。
3.如权利要求1所述的方法,其特征在于,所述步骤1)收集正常输入数据中传播进入 系统函数参数、库函数参数的字节的具体方法为1.1)通过系统函数调用劫持方法劫持目标软件对正常输入数据的读入;1. 2)当目标软件将正常输入数据读入内存时,记录内存地址与输入数据之间的映射关系;1. 3)跟踪正常输入数据的传播,记录每个内存单元依赖的正常输入数据的字节;1. 4)调用系统函数或库函数时,检查系统函数参数或库函数参数是否依赖于正常输入 数据,如果依赖,输出依赖的字节;
4.如权利要求1所述的方法,其特征在于,所述步骤1.3)采用动态代码插桩方法跟踪 正常输入数据的传播。
5.如权利要求1所述的方法,其特征在于,所述步骤1.3)记录相应内存地址与输入数 据之间的依赖关系的方法为以每个字节在正常输入数据中的位置偏移标示该字节,并记 录每个内存单元来源于哪些字节。
6.如权利要求1所述的方法,其特征在于,所述步骤1.4)对于int,char类型参数,直 接检查参数数值是否依赖输入数据;对于指针类型的参数,检查指针所指向的内存单元是 否依赖输入数据;对于其他复杂的函数参数,根据先验知识和系统调用及库函数的原型声 明,指定需要检查系统调用和库函数。
7.如权利要求1所述的方法,其特征在于,所述步骤2)修改的方式为对每个可以传播 进入系统调用、库函数的字节逐一替换为随机值或者指定值。
8.如权利要求1所述的方法,其特征在于,所述步骤2)修改的方式为对可以传播进入 系统调用、库函数的字节进行协同更改,将多个字节同时替换为随机值或指定值。
9.如权利要求1所述的方法,其特征在于,所述步骤3)在调试模式下运行目标软件; 逐一将生成的畸形数据输入至目标软件。
10.如权利要求1所述的方法,其特征在于,所述步骤3)如果目标软件发生异常,收集 当时目标软件执行的调用栈以及执行上下文信息,生成漏洞报告。
全文摘要
本发明公开了一种高效动态软件漏洞挖掘方法,其步骤包括1)目标软件处理正常输入数据,并收集正常输入数据中传播进入系统函数参数、库函数参数的字节;2)在正常输入数据中,修改传播进入系统函数、库函数的字节,生成畸形数据;3)将生成的畸形数据输入至目标软件,如果目标软件处理畸形数据时异常,则生成漏洞报告。本发明方法通过自动识别正常输入数据中传入系统函数、库函数的字节,从而针对性的修改这些字节产生畸形数据,显著提高了畸形数据触发安全漏洞的可能性,充分提高了模糊测试的效率。
文档编号G06F11/36GK101853200SQ20101017199
公开日2010年10月6日 申请日期2010年5月7日 优先权日2010年5月7日
发明者丁羽, 张超, 戴帅夫, 李义春, 王铁磊, 邹维, 韦韬 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1