DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 93|回复: 0
打印 上一主题 下一主题

基于动态输入追踪的模糊技术

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 17:26:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                    ??????摘 要:在基于反汇编的输入路径追踪技术的基础上,结合基于代码覆盖的测试数据生成和基于快照恢复的错误注入技术,将其应用于模糊测试中。提出一种软件安全漏洞自动化挖掘的方法,较好地解决传统模糊技术存在的若干局限。设计并实现一个基于此方法的测试系统,通过对实例软件的漏洞挖掘实验,验证该方法的有效性。
  关键词:漏洞挖掘;模糊测试;输入追踪
  1 概述
  随着信息技术的广泛应用,软件安全漏洞所造成的危害正日益严重。软件安全漏洞发掘作为一种预先发现软件潜在安全漏洞、保证信息安全的重要技术,也越来越受到人们的重视。目前国内外常用的漏洞自动发掘技术主要有手工分析、模糊(fuzzing)技术、补丁比较、源码自动分析和动态调试等。
  软件安全漏洞发掘技术大致分为基于源代码的漏洞发掘技术和基于可执行文件的漏洞发掘技术。然而现在大多数软件都不是开源的,如各种商业软件和操作系统软件等,因此,针对可执行文件的漏洞发掘技术显得尤为重要。
  fuzzing 测试是通过提供非正常的输入并监测系统异常发现软件安全漏洞的自动化方法。它的基本原理是将利用正确数据随机修改得到的畸形数据注入应用程序中,观察运行结果(程序崩溃或者异常中断),通过程序运行的错误来挖掘软件的脆弱点。fuzzing 测试的思想比较直观,便于实现自动化。利用这种方法进行漏洞发掘,发现漏洞到定位漏洞比较容易,并且不存在误报,但却能揭示出程序中的重要漏洞,目前正广泛应用于各类软件漏洞的发掘,在近几年的漏洞挖掘实践过程中取得了很好的效果。
  虽然经过多年的发展fuzzing 技术已经取得长足的进步,但是仍然存在较多的不足,主要体现在以下4 个方面:
  (1)测试数据生成有一定程度的盲目性,不能进行有针对性的测试,因此数据变化空间难以控制。(2)代码覆盖问题,通常生成的大量测试用例分布在某些特定的分支和状态上,而一些特殊的分支或者状态得不到覆盖,因此代码的测试完整性不足。(3)生成用例难以通过软件的正确性和一致性检测,造成生成大量无效测试用例,或需要人工对复杂的文件格式进行分析,测试效率低下。(4)难以发现需要几个输入同时起作用才能引发的异常或多阶段综合条件触发的复杂漏洞。本文在结合了静态分析和动态分析技术的基础上,提出一种基于动态输入路径追踪的fuzzing 技术进行软件安全漏洞发掘的新思路,较好地解决了上述问题。
  2 总体框架与关键技术
  2.1 基本框架
  基于动态输入跟踪的fuzzing 技术的基本原理为:将待测软件的可执行代码反汇编为汇编代码,通过静态分析汇编代码,确定函数块及其调用关系,并查找代码分支选择信息以供生成测试用例,动态跟踪输入数据的流向以确定错误注入点,将测试用例注入后若无异常发生则恢复注入前的进程快照重新进行fuzzing,其基本框架如图1 所示。



  2.2 基于反汇编的输入路径追踪技术
  软件从外部接收的输入数据由于可被用户控制,因而是引发各类软件漏洞的根源。输入点是指用户提供的数据提交给程序的地方,它位于软件与用户交界处,是软件中漏洞产生的发源地,因此需要观测目标软件的输入点,以便动态跟踪输入数据在程序中的流向和使用。采用输入追踪法,首先需要确定代码的输入点。利用反汇编工具反汇编目标程序的二进制代码,分析得到的汇编代码以确定程序的函数块及其内部的基本块。查找所有可能接受外部输入的库函数调用,确定为可能的输入点。例如WSARecvFrom()的调用将会接收网络报文,并把数据放入缓存区。接着,利用动态调试工具监测输入点函数的调用,并在其被调用时观察其调用结果,若经比较发现来自外部输入,则记录此输入数据的存放缓冲区并设置内存中断,当有指令读写该内存时即发生中断,记录所有读写此缓存区的函数指令并标记为错误注入点,记录每个输入数据执行的代码路径。通过对动态执行中输入数据的实时跟踪,可以监测到函数具体调用的是输入数据的哪些部分,也就可以对测试数据的相应部分进行有针对性的fuzzing,从而避免了测试数据变化空间巨大的问题,而且由于是从内部直接对相关函数进行测试,因此有助于发掘多重输入向量或多阶段综合条件触发的复杂漏洞。

            
                   
??????2.3 基于代码覆盖的测试数据生成
  黑盒测试通常不考虑测试的路径覆盖问题,在测试的完整性方面存在局限,往往不能发现未执行代码中的漏洞。例如下面是摘自于一个服务器软件的代码片段:



  静态逆向分析模块主要是利用反汇编工具IDA Pro 来反汇编目标程序的二进制代码,以生成相应的汇编代码,在此基础上利用脚本自动识别确定函数块及其内部的基本块,分析程序的基本结构和函数调用关系;查找代码中的静态字符串、整数和代码分支处的比较字段,并搜索代码中调用的不安全库函数,用以建立测试用例库。
  动态跟踪模块在调试器的基础上构建而成,主要负责在程序执行期间动态监测输入函数的调用,以确定输入数据的内存位置;接着跟踪输入数据的流向和使用,在输入数据被读写时记录操作函数,以确定错误注入点。
  测试数据生成模块主要负责根据静态逆向分析模块提供的分析查找结果自动建立测试用例库,并利用测试用例库在测试过程中自动生成测试用例。
  错误注入模块主要负责自动将测试数据生成模块生成的测试用例注入到程序进程中。在程序运行到错误注入点时,保存错误注入前的进程快照,修改输入数据所在的地址指针;在执行到还原点时,恢复之前保存的进程快照,重新进行错误注入。
  异常检测记录模块主要负责通过监测程序的异常报错,寻找软件存在的问题。要记录分析的部分包括:(1)异常的类型:运算错误,标准输入/输出错误,内存访问错误,系统APIs 调用错误,一般运行时错误,语法错误,应用程序不可预知的崩溃等。(2)错误记录:系统自身的错误记录,可执行程序的错误记录。(3)出错时各个寄存器值和其他环境变量的值,以及程序的返回值。
  选取一款小型代理服务器软件Polipo 作为测试对象,验证该动态输入追踪方法的有效性。用系统动态跟踪服务器进程接收来自远程client 的http 请求,针对处理请求消息中各字段的处理函数生成测试用例并注入进行fuzzing。当生成测试用例的Content-Length 字段值为一个极大整数时,检测到发生内存非法访问异常,服务器随即崩溃。通过调试器调试软件发现Polipo 的client.c 文件中httpClientDiscardBody()函数存在符号错误,当远程用户提交带有超长Content-Length头的http 请求会产生整数溢出,进而导致服务崩溃,从而验证了该漏洞的存在。
  4 结束语
  本文在基于反汇编的输入路径追踪技术的基础上,结合基于代码覆盖的测试数据生成和基于快照恢复的错误注入技术,将其应用于fuzzing 测试中,提出了一种软件安全漏洞自动挖掘的新方法。该方法较好地解决了fuzzing 技术存在的测试数据空间巨大、代码覆盖不完整和测试效率低等问题,且无需目标软件源代码,因而应用范围较广。基于此方法设计并实现了一个测试系统,通过对实例软件的漏洞挖掘实验,验证了该方法的有效性。下一步工作主要为对输入路径的追踪细化为针对指令级的追踪,以进一步提高动态追踪的精确性和可靠性。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-9-20 21:23 , 耗时 0.092824 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表