




已阅读5页,还剩62页未读, 继续免费阅读
基于动态污点分析的网络程序漏洞挖掘方法--优秀毕业论文.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分 类 号 学号 m200972544 学校代码 10487 密级 硕士学位论文硕士学位论文 基于基于动态动态污点分析的网络程序污点分析的网络程序 漏洞挖掘漏洞挖掘方法方法 学位申请人学位申请人 吴小伟吴小伟 学 科 专 业学 科 专 业 信息安全信息安全 指 导 教 师指 导 教 师 李李汉菊汉菊 副教授副教授 答 辩 日 期答 辩 日 期 2012 年年 1 月月 11 日日 a thesis submitted in partial fulfillment of the requirements for the degree of master of engineering a network software vulnerabilities discovery method based on dynamic taint analysis candidate wu xiaowei major information security supervisor li hanju huazhong university of science and technology wuhan hubei 430074 p r china january 2011 独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究 成果 尽我所知 除文中已经标明引用的内容外 本论文不包含任何其他个人或集体 已经发表或撰写过的研究成果 对本文的研究做出贡献的个人和集体 均已在文中以 明确方式标明 本人完全意识到本声明的法律结果由本人承担 学位论文作者签名 日期 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留 使用学位论文的规定 即 学校有权保 留并向国家有关部门或机构送交论文的复印件和电子版 允许论文被查阅和借阅 本 人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索 可以采用影印 缩印或扫描等复制手段保存和汇编本学位论文 保密 在 年解密后适用本授权书 不保密 请在以上方框内打 学位论文作者签名 指导教师签名 日期 年 月 日 日期 年 月 日 本论文属于 i 华 中 科 技 大 学 硕 士 学 位 论 文 摘摘 要要 网络服务器程序如果存在漏洞可能导致服务器被黑客入侵 例如缓冲区溢出漏 洞就可能导致服务器执行任意远程代码 为了保障服务器的安全 亟需一种能够快 速发现网络服务器程序中存在的漏洞的方法 fuzzing 测试是如今对网络服务应用程 序进行漏洞挖掘最有效的方法之一 传统 fuzzing 方法存在针对未公开协议无法产生 高效测试案例以及无法对软件异常进行自动化分析的两个缺陷 针对传统测试方法的两个缺陷 提出一种基于动态污点分析技术的漏洞挖掘方 法 首先提出一种基于动态污点分析的网络协议格式逆向的技术 通过对网络程序 进行动态污点跟踪 获得在二进制层服务器对网络报文进行处理的指令流等信息并 用于对网络报文格式的逆向解析 解决了协议格式未知导致的不能生成有效测试案 例的问题 然后利用得到的报文格式编写出 sulley fuzzing 测试框架的测试脚本并进 行 fuzzing 测试 最后提出一种利用动态污点跟踪能够对软件异常进行自动化分析技 术 解决了人工异常分析耗时且准确性不高的缺陷 通过对 oracle10 1g tns 协议和 serv u4 0 ftp 协议进行了测试 逆向解析得到 的报文的协议格式 并利用 sulley 进行 fuzzing 测试后能够发现服务器程序中 2 个已 公布的缓冲区溢出漏洞 同时也发现了 11 个未公开的拒绝服务漏洞 证明了基于污 点分析技术的漏洞挖掘方法的有效性 关键词 关键词 漏洞挖掘 模糊测试 动态污点分析 协议格式逆向 漏洞分析 ii 华 中 科 技 大 学 硕 士 学 位 论 文 abstract if vulnerabilities exist in network server applications the network server might be hacked for instance buffer overflow vulnerabilities may result in remote code execution and hackers can get full control of the server to protect the server from all this attacks we need a fast way to find vulnerabilities in server applications fuzzing test is one of the most efficient ways to find vulnerabilities in those applications current fuzzing methods cannot generate efficient test cases for those whose use unpublicized protocols and also suffer from exception and vulnerability analysis a new method based on dynamic taint analysis is brought out at first using dynamic taint tracking on server applications and collect information on how the received messages are used in by the application this information is used to generate protocol field description of the message then use this protocol format to work with sulley fuzzing framework and do the fuzzing test after the fuzzing period dynamic taint analysis is used to find out the reason of all the exception found in fuzzing test automatically and output the analysis result to the tester after using our method to generate protocol description of oracle10 1g tns protocol and serv u 4 0 ftp protocol we use sulley fuzzing framework to do the testing work and found some old buffer overflow vulnerabilities and some unknown vulnerabilities this experiment proves the effectiveness of our method keywords vulnerability discovery fuzzing test dynamic taint analysis protocol reverse engineering vulnerability analysis iii 华 中 科 技 大 学 硕 士 学 位 论 文 目 录 摘摘 要要 i abstract ii 1 绪论绪论 1 1 研究背景 1 1 2 国内外研究现状 2 1 3 研究工作的意义 8 1 4 主要研究内容 8 1 5 论文组织结构 8 2 基于动态污点分析技术的基于动态污点分析技术的 fuzzing 方法方法 2 1 基于动态污点分析技术的 fuzzing 测试技术 10 2 2 动态污点跟踪技术 12 2 3 基于污点分析的协议格式逆向 14 2 4 基于污点分析的异常分析 20 2 5 本章小结 24 3 基于污点分析基于污点分析 fuzzing 方法实现方法实现 3 1 动态污点跟踪模块的实现 25 3 2 污点协议逆向模块的现实 28 3 3 sulley fuzzing 测试模块 31 3 4 污点异常分析模块 32 3 5 本章小结 33 4 fuzzing 测试实验与分析测试实验与分析 4 1 oracle10 1g tns 协议格式分析与 fuzzing 测试 34 4 2 serv u4 0 ftp 协议格式分析与 fuzzing 测试 41 4 3 本章小结 44 1 华 中 科 技 大 学 硕 士 学 位 论 文 5 总结与展望总结与展望 5 1 总结 45 5 2 展望 45 致致 谢谢 47 参考文献参考文献 48 附录附录 1 初始域边界划分结果初始域边界划分结果 52 附录附录 2 域边界调整结果域边界调整结果 55 附录附录 3 最终报文格式输出结果最终报文格式输出结果 57 附录附录 4 wireshark 报文解析结果报文解析结果 60 1 华 中 科 技 大 学 硕 士 学 位 论 文 1 绪论绪论 1 1 研究背景研究背景 随着互联网的发展 出现了越来越多的网络服务器程序 如 ftp file transfer protocol 服务器 http hypertext transfer protocol 服务器等 给人们的日常网络生 活提供各种各样的网络服务 于此同时 针对网络服务器程序的攻击也越来越多 这些攻击一般通过缓冲区溢出漏洞攻击等方式实现 如果攻击成功 将给网络服务 提供商和普通网民都带来巨大的损失 例如在 1988 年出现的 morris 蠕虫通过 fingerd 系统服务进行传播 1 2001 年出现的 nimda 蠕虫通过 iis 文件目录遍历漏洞进行传 播 2 导致了因特网上大量主机感染中毒 为了防止出现此类问题 软件生产厂商经常采用多种方法来对自己的网络程序进 行质量测试 希望能够发现并消除尽量多的软件漏洞 与此同时 黑客也会对这些 网络程序进行质量测试 试图找到安全漏洞并加以利用 这个过程常称为漏洞挖掘 进行漏洞挖掘最有效的方法之一是 fuzzing 测试 3 网络程序漏洞的挖掘有着很重要的意义 因为网络程序使用更加广泛 而且可以 被远程访问 网络协议是网络程序进行通信的基础 一般对网络程序进行漏洞挖掘 都是对其使用的网络协议进行 fuzzing 测试 网络协议主要分为两种类型 一种是格式公开的网络协议 这种协议一般有官方 文档对协议进行描述 如 http ftp 等协议 对这种协议进行测试的方法一般是利 用协议格式描述文档来生成测试案例并测试 另一种是格式未公开的私有协议 如 tns transparent network substrate 协议 smb server message block 协议等 这种协 议无法直接通过协议格式来生成测试案例进行测试 漏洞挖掘难度比较大 针对未公开网络协议进行测试的方法有两种 一种是对合法的网络报文进行内容 变异生成新的测试案例 称为变异型 fuzzing 测试 另外一种是通过各种分析方法对 网络协议格式进行分析 然后利用测试公开协议的方法进行测试 称为生成型fuzzing 测试 前一种方法由于变异数据没有目的性 产生的测试案例数目多而且相似性很 高 导致测试效率低下 第二种方法则需要在进行测试之前对网络协议格式进行逆 向 人工进行协议格式逆向需要花费很多时间 而且分析结果不够准确 因此自动 化协议格式逆向对于整个 fuzzing 测试具有极其重要的意义 2 华 中 科 技 大 学 硕 士 学 位 论 文 本文提出一种基于动态污点分析的网络程序 fuzzing 测试方法 通过使用基于二 进制插装的动态污点跟踪技术 获得程序在处理网络报文过程时二进制层的信息并 用于协议格式逆向 然后将得到的协议格式配合 sulley fuzzing 框架 4 对网络程序进 行 fuzzing 测试 最后将能够使目标程序产生异常崩溃的测试案例进行重放 利用基 于动态污点分析的漏洞分析技术进行自动化异常分析 1 2 国内外研究现状国内外研究现状 本课题研究中主要涉及漏洞挖掘技术 fuzzing 测试技术 动态污点跟踪技术 网络协议格式逆向解析技术 漏洞分析技术 下面将针对这些技术介绍其国内外研 究现状 1 2 1 漏洞挖掘技术漏洞挖掘技术 常见的漏洞挖掘方法有下面三种 白盒测试一般通过对软件源代码进行代码审计的方式来寻找软件漏洞 由于需要 访问软件的源代码 而对于商业软件来说源代码是无法获得的 这就限制了白盒测 试的使用 有大量的商业或者开源软件通过白盒测试的方法对软件进行源代码级别 的审核 如 rats 5 等 白盒测试的优点是可以有效而且准确地通过源代码审计发现并消除格式化字符 串等漏洞 同时由于能够获取源代码 所以可以达到完全的代码覆盖 所有的代码 路径都能被审计到 白盒测试的缺点是许多软件漏洞并不直接在源代码级别就能表 现出来 如多阶段软件漏洞等 而且在 win32 下的绝大多数软件都是不开源的 这 也限制了白盒测试的使用 黑盒测试是指将整个软件系统作为一个黑盒子对待 用户从黑盒的一端提供数据 输入 另一端产生输出结果 通过观察软件系统是否出现异常或者发生崩溃来确定 是否存在软件漏洞 黑盒测试包含手工和自动化测试两种 一般都采用自动化黑盒 测试的方法来进行漏洞挖掘 这种自动化测试的方法称为 fuzzing 测试 黑盒测试的优点是不需要获取软件的源代码 应用范围比白盒测试要广 同时黑 盒测试不需要了解软件内部结构 只需要了解程序的输入和输出接口 简单易用 而且具有测试结果的可重现性 黑盒测试的缺点是无法覆盖所有的代码执行路径 这是由于对程序内部结构不了解造成的 同时黑盒测试也无法发现多阶段软件漏洞 3 华 中 科 技 大 学 硕 士 学 位 论 文 灰盒测试则是一种处于白盒测试与黑盒测试之间的方法 它除了包括利用黑盒测 试对软件使用测试用例进行测试的方法 还用到了逆向工程技术和二进制审核技术 二进制审核是指通过 ida 等反汇编工具对目标软件进行反汇编 再通过逆向工程的 方法 可以轻松定位到黑盒测试中软件出现异常的位置以及异常出现的原因 一般 来说灰盒测试都是手工完成 但 bugscam 6 实现了对软件的自动化灰盒测试 通过 二进制审核虽然无法得到白盒测试中那种源代码级别的审核效果 但是通过逆向工 程 仍然可以找到一些有用的信息 有时候汇编级别的二进制审核往往能够得到更 多的信息 获取的这些信息可以用于辅助模糊测试进行漏洞挖掘 1 2 2 fuzzing 测试技术测试技术 fuzzing 测试是如今使用最广泛 效率最高的漏洞挖掘方法 它是一种自动化的 软件漏洞挖掘方法 fuzzing 测试是一个典型的自动化或者半自动化的过程 这个过程包括反复操纵 目标软件并向其提供非预期的处理数据 同时使用异常监视工具等来监视软件的异 常表现 通过 fuzzing 测试 可以发掘出很多软件漏洞 如缓冲区溢出漏洞 格式化 字符串漏洞等 当前的多种针对网络程序进行 fuzzing 测试方法的局限性主要有 1 测试数据的生成 a 对于协议格式已知的情况 可以通过生成的方法来产生测试案例 能够 产生效率和有效性较高的测试案例 使用这种方法的 fuzzing 工具有 ftpfuzz protos 7 等 大多数时候协议格式并不公开 这也限制了这种 方法的通用性 b 协议格式未知的情况 由于协议格式未知 无法利用生成的方法生成测 试案例 只能采用变异的方法 对于一个长度为 n 字节的域进行变异方 法生成测试案例有 28n个 测试案例数目巨大 而且大多数的测试案例的 相似度很高 无法达到很好的测试案例覆盖效果 导致 fuzzing 测试的 效率过低 2 软件异常和漏洞分析技术 当测试案例产生并得到执行之后 某些测试案例可能导致程序发生异常或者 崩溃 随后的测试步骤就是对这些崩溃行为进行分析来确定崩溃的原因 从而定 4 华 中 科 技 大 学 硕 士 学 位 论 文 位出程序出错的位置 以及确定该次崩溃是否是一个可利用漏洞的表现 传统 fuzzing 测试工具基本不包含对崩溃和漏洞分析的功能 分析只能依靠 测试人员手工使用调试器进行分析 这要求测试人员有较强的逆向分析能力和软 件调试能力 这导致测试的时间大大延长 fuzzing 测试的效率大大降低 1 2 3 动态污点分析技术动态污点分析技术 动态污点分析技术 8 是一种近几年刚被提出的一种技术 可以应用于多种领域不 同问题 其主要原理是将不可信的外部数据标记为污点数据 然后通过动态二进制 插桩等方法对污点数据的传播进行污点跟踪 由污点数据进行一系列的算术或者逻 辑运算产生的数据也将标记为污点数据 最后通过对污点传播过程进行污点分析来 实现特定功能 当前使用动态污点分析技术在安全领域有着广泛的应用前景 文献 9 13 通过对 输入数据进行污点跟踪并检查输入数据被执行来检测未知漏洞攻击 文献 9 14 15 则进一步通过利用检测到的位置漏洞来为 ids intrusion detection systems 等产生过 滤特征码 文献 16 20 利用它对恶意软件的行为特征分析 能够有效处理经过加密 变形或者多态等手段进行处理过的恶意软件 在软件测试案例生成方面的研究 文 献 21 27 在动态污点跟踪的基础上实施符号化执行技术 通过对约束条件的符号化 表达式使用 sat 等求解器求解来获得使程序会按照指定路径执行的测试案例 解决 了测试过程中代码覆盖率不高的缺点 实现动态污点分析一般有两种方式 即通过硬件实现和通过软件实现 早期的动 态污点分析系统一般采用硬件扩展的方式实现如文献 11 13 通过定制硬件 将 32 位数据总线进行扩展 添加一位总线作为污点数据的标记 同时对所有执行的机器 指令进行污点跟踪和分析 文献 28 29 则通过对虚拟机进行扩展来实现 由于通过硬件扩展的实现动态污点分析的实现难度很大 成本高 所以多数动态 污点分析系统都采用软件方式来实现 软件方式实现动态污点分析一般都是使用动 态二进制插桩技术 动态二进制插桩是指在程序执行过程中 任何一条机器指令在执行之前 都需要 经过二进制插桩工具的处理和修改 然后再重新传递给系统进行执行 动态二进制 插桩在二进制代码级别对程序的执行进行截获插桩 并不需要获得程序的源代码 从而在对于非开源的商业软件有着很多重要的应用 5 华 中 科 技 大 学 硕 士 学 位 论 文 现有的动态二进制插桩工具主要有 dynamorio 30 valgrind 31 pin 32 这几个 其中 valgrind 只支持 linux 等系统 不支持 windows 平台 而 dynamorio 和 pin 则支持包括 windows 在内的多个平台 具有良好的跨平台性 pin 由于稳定性比 dynamorio 好 而且官方文档完备 开发难度小 易于调试 所以本文选择的插装平台为 pin 图 1 1 显示了 pin 插装工具的系统架构 pin 系统 的主要部件有 虚拟机 vm 代码缓存部件 code cache 提供给 pintool 调用的 api 函数集合 虚拟机层包含一个指令实时翻译部件 jit 一个指令模拟执行部件 emulator 和一个指令分发部件 dispatcher 图 1 1 pin 二进制插装框架 pin 获得目标进程的完全控制权限 虚拟机层则调用各个部件来执行目标程序 jit 负责实时获取目标程序的代码进行翻译并放入 code cache 在这个过程中 jit 将用户编写的 pintool 插装程序的代码加入到翻译后的代码之中 随后 dispatcher 部 件从 code cache 获得代码并交给 emulator 进行模拟然后在真实的 cpu 上执行 由 于可以加载用户编写 pintool 的代码 在 pintool 中用户可以自定义添加自己的插装模 块 对所有执行的机器指令进行检查 由于 pin 处于操作系统之上 因此只能够对 用户态的程序进行插装 1 2 4 网络网络协议格式逆向分析协议格式逆向分析 对于未知网络协议格式进行分析主要有下面 3 种方法 6 华 中 科 技 大 学 硕 士 学 位 论 文 1 人工协议分析 主要通过使用 wireshark 等数据包捕获工具来对应用程序接受的报文进行捕获然 后进行人工分析 这种方法能够分析出一些文本协议的格式 二进制协议就很难分 析出来 这种方法分析结果存在一定的误差 而且也需要花费很长的时间 是所有 协议逆向方法中效率最低的 2 基于网络报文的序列比对方法 通过数据包捕获工具把应用程序多次运行接收的网络报文保存下来 然后通过生 物学或者基因算法等序列比对算法来确定不同网络报文序列之间的相似性 如 pi 33 discoverer 34 roleplayer 35 等 这种方法的优点是可以通过数据包获得分析的数据 源 不需要有目标主机的操作权限 对于文本协议处理效果较好 缺点是仅仅从网 络报文能够获得的信息很少 只能对域边界进行简单划分 无法获得域的具体类型 同时也无法处理加密网络报文 3 基于二进制分析的方法 通过在二进制层次分析程序对网络报文的处理过程来进行报文格式逆向 主要有 polyglot 36 prospex 37 dispatcher 38 autoformat 39 tupni 40 rosetta 41 和文 献 42 43 等 这些方法各有各的优点 有的能够比较好的处理文本协议 有的则能 够比较好的处理二进制协议 polyglot 通过程序在对网络报文不同字段进行处理时二进制层的一些特点来提取 分隔符 关键字 长度域和目标域等字段 优点是对文本类协议效果较好 缺点是 不适合处理二进制协议 而且只能识别几种特定的字段 无法获得整条报文所有域 的一个整体划分结果 prospex 是利用了的 polyglot 方法进行网络报文格式分析之后 利用报文格式信 息对同一个回话过程中的不同报文进行分类 进而推断出在整个交互过程中网络协 议状态机 dispatcher 利用 polyglot 的方法处理恶意软件进行通信的网络报文格式 同时通 过监控某些函数参数是否被输入数据控制来获得报文的一些语义层信息 最终分析 出恶意软件的行为 7 华 中 科 技 大 学 硕 士 学 位 论 文 文献 43 用到了与 polyglot 类似的方法进行网络报文格式分析 但是他进行的改 进是可以确定分隔出的域是一个可变域还是不变域 这对于确定协议域的类型有重 要意义 同时它还提出对多条同类型网络报文进行分析来确定某些域是否为可选域 autoformat 则使用到了和前面几篇文献相比完全不同的方法 autoformat 通过 维护一个函数调用堆栈 函数嵌套调用序列 来获得处理了某个输入数据的机器指令 所处位置的具体语义信息 并将函数调用堆栈相同的那些输入数据和合并到同一个 域 autoformat 能够对整条消息的各个域边界进行划分 同时能够推断出整条报文 各个域之间的层次关系 进而识别出平行域 出现位置可调换 等有用的语义信息 autoformat 的缺点是无法确定每个域的具体类型 而且只是对文本协议效果较好 无法很好处理二进制协议 1 2 5 软件异常分析技术软件异常分析技术 软件异常分析技术 44 是 fuzzing 测试过程中非常重要的一个步骤 一个测试案例 能引发目标程序出现一个异常 但不一定能够进行利用 对异常原因进行分析后才 能够确定漏洞是否可利用 并获得漏洞利用时需要的一些关键信息 如被覆盖的返 回地址或者异常处理 seh 函数地址 目前对软件异常进行分析主要三种方法 1 静态反汇编 利用 ida pro 等静态反汇编工具对目标程序进行反汇编分析 定位到出现异常指令的位置 然后通过人工反汇编阅读来分析出现异常的可 能的原因 这种方法要求测试人员有较高的逆向分析能力和汇编代码阅读能 力 而且由于是静态分析 无法获得实时内存和寄存器等数据 因此无法准 确分析漏洞产生的原因 还有一个缺点是无法处理加壳后的程序 2 动态调试分析 利用 ollydbg 和 windbg 等动态调试工具附加到目标程序上进 行分析 这种方法克服了无法获得实时内存和寄存器数据的缺点 也能够处 理加壳后的程序 但是仍需要测试人员有较高的逆向分析能力 这种方法还 有一个缺点就是无法确定输入数据与产生的异常之间的联系 也就无法得到 漏洞产生的本质原因 3 自动化工具分析 通过一些动态分析工具来分析发生异常时的内存数据 寄 存器数据等来确定漏洞是否可以利用 如微软的 exploitable 45 这种方法与 前面两种方法相比对测试人员的要求降低了 但是分析的结果的准确性不能 8 华 中 科 技 大 学 硕 士 学 位 论 文 够保证 1 3 研究工作的意义研究工作的意义 针对网络程序进行漏洞挖掘的传统 fuzzing 方法需要得到目标程序使用的网络 协议格式后才能生成有效的测试案例 人工分析协议格式逆向需要花费很长时间 导致测试周期变长 另外对 fuzzing 测试过程目标程序出现异常的原因进行分析一般 是通过人工完成的 无法实现自动化 这两个缺陷导致了传统 fuzzing 方法效率比较 低下 为了解决这两个缺陷 本文提出一种基于动态污点分析的 fuzzing 测试方法 通 过利用动态污点分析技术来实现对网络报文格式的逆向解析 然后配合 sulley 这个 fuzzing 测试框架对网络程序进行 fuzzing 测试 并对测试过程中出现的程序崩溃行 为进行自动化分析 解决了传统 fuzzing 测试过程中生成测试数据有效性不高 对软 件崩溃行为需要人工调试分析的局限性 有效地提高了 fuzzing 测试的效率 1 4 主要研究内容主要研究内容 本文主要研究内容有下面几点 1 深入了解当前针对网络程序进行漏洞挖掘的方法和漏洞分析技术 2 深入了解当前网络协议逆向方法和国内外研究现状 3 提出一种基于动态污点分析技术的 针对未知网络协议的完整测试框架 4 实现基于动态二进制插装的动态污点跟踪原型系统 5 实现基于动态污点分析技术的网络协议格式逆向方法 6 实现基于动态污点分析技术的漏洞分析方法 7 进行实际测试 对多个网络协议进行协议格式逆向分析并进行 fuzzing 测试 验证所提出方法的正确性 1 5 论文组织结构论文组织结构 本文主要围绕基于动态污点分析 fuzzing 方法展开 涉及到基于动态污点分析的 网络协议格式逆向和基于动态污点分析的软件异常分析方法 总共分为 5 章 组织 结构如下 第一章介绍了相关背景 国内外研究现状 主要研究内容和论文组织结构 9 华 中 科 技 大 学 硕 士 学 位 论 文 第二章介绍了基于动态污点分析 fuzzing 方法的系统架构 以及其中污点分析协 议分析模块和污点软件异常分析模块的原理方法 第三章介绍了基于动态污点分析 fuzzing 方法的具体测试流程 以及污点分析协 议分析模块和污点软件异常分析模块的具体实现方法 第四章利用本文方法对 oracle10 1g tns 协议和 serv u 4 0 ftp 协议进行了实验 测试 第五章对前面的工作进行了总结 指出当前系统的优势与缺点 为今后的研究提 供参考 10 华 中 科 技 大 学 硕 士 学 位 论 文 2 基于动态污点分析技术的基于动态污点分析技术的 fuzzing 方法方法 动态污点分析技术在安全领域有着极为广泛的应用 也是研究领域的热门课题 之一 本文提出了一种利用动态污点分析来进行网络程序漏洞挖掘的方法 解决了 传统 fuzzing 测试过程中生成的测试案例效率低 软件崩溃行为分析困难的局限性 提高了漏洞挖掘的效率 2 1 基于动态污点分析技术的基于动态污点分析技术的 fuzzing 测试技术测试技术 传统 fuzzing 方法对网络程序进行 fuzzing 测试的时候 不可避免的会遇到下面 两个问题 1 目标网络协议格式分析 获得目标网络协议格式是 fuzzing 流程中产生有效测试案例的基础 目前针对网 络协议格式逆向还没有很成熟很准确的方法 传统的 fuzzing 方法都必须依靠人工方 法进行分析 因此对目标网络协议格式进行分析成为了 fuzzing 测试的一个局限 2 对软件异常崩溃进行分析 fuzzing 流程中及其重要的一步就是对发现的软件异常进行分析 确定漏洞产生 的原因 传统 fuzzing 方法大多是人工进行调试分析 耗费时间长 而且无法准确找 到崩溃发生的本质原因 利用动态污点分析技术可以有效的突破传统 fuzzing 测试的这两个局限性 利用动态污点分析技术 可以在二进制层次获得目标程序对输入污点数据的处理 过程以及污点的传播过程 得到的这些信息可以用于提取协议格式 得到了协议格 式之后 就可以利用生成的方法来生成高效的测试案例 利用动态污点分析技术 可以准确的跟踪初始污点输入数据在内存和寄存器中的 传播过程 这就意味着可以准确得到异常崩溃与输入数据之间的关系 同时可以得 到崩溃时的寄存器 内存 堆栈上的数据内容以及它们的对应的污点标签 从而得 到输入数据对他们的影响情况 也能够在一定程度上确定一次崩溃是否可以被成功 利用 11 华 中 科 技 大 学 硕 士 学 位 论 文 因此本文提出一种基于动态污点分析技术的 fuzzing 测试方法 解决传统 fuzzing 方法的两个局限性 传统 fuzzing 流程与基于污点分析的 fuzzing 流程对比如图 2 1 所示 识别测试目标 识别输入接口 生成测试数据 执行测试数据 监控运行异常 自动化协议格 式逆向 自动化异常分 析 识别测试目标 识别输入接口 生成测试数据 执行测试数据 监控运行异常 分析运行异常 传统fuzzing测 试流程 基于动态污点分析 的fuzzing测试流程 图 2 1 污点分析 fuzzing 与传统 fuzzing 方法流程的比较 基于动态污点分析的 fuzzing 方法的整体架构如图 2 2 所示 具体来说 基于动态污点分析的 fuzzing 测试方法分为下面几步 1 对目标网络程序进行污点跟踪 输出所有的污点传播操作到 trace 文件 2 利用污点协议逆向模块的对 trace 文件进行处理 提取网络报文的格式 3 生成 sulley fuzzing 框架对该条报文的协议格式描述脚本 然后使用 sulley 生成测试案例并进行 fuzzing 测试 利用 sulley 的监控功能 提取出使得目标网络程 序出现异常的测试案例 4 使用 sulley 对触发异常的测试案例进行重放 利用污点异常分析模块进行分 析 输出分析结果 12 华 中 科 技 大 学 硕 士 学 位 论 文 污点跟踪 trace文件 动态污点跟踪模块 目标网络程序 网络报文 协议格式 sulley fuzzing测试框架 目标网络程序 异常测试案例 污点异常分析模块 目标网络程序 污点协议逆向模块 图 2 2 基于动态污点分析的 fuzzing 方法整体架构 2 2 动态污点跟踪技术动态污点跟踪技术 动态污点跟踪指的是将用户输入的数据标记为污点数据 然后在利用二进制插 装在目标程序运行过程中 检查这些污点数据的传播过程以及应用程序对这些污点 数据的使用情况 污点传播是指如果某条机器指令将一个污点数据复制到其他内存 或者寄存器中 这些位置的内容也应该被标记为污点数据 污点标记和污点传播的 方法和处理对象有很多 本文采用的污点跟踪主要包含以下几个过程 1 污点初始化 这个过程主要是将用户输入的不可信数据标记为污点数据 包括从网络接收的网 络报文 从本地文件读取的数据 注册表数值 环境变量 命令行参数等 每当有 用户可控数据输入时 确定输入缓冲区的内存位置和大小 并将相应的内存位置标 记为污点状态 2 污点的传播和清除 污点的传播是指如果读取了之前标记为污点的内存位置的数据 并将其赋值到其 他内存或者寄存器 则将目标内存或者寄存器也标记为污点状态 污点的清除则指的是如果将没有被污染的数据赋值给标记为污点状态的内存区 13 华 中 科 技 大 学 硕 士 学 位 论 文 域或者寄存器时 将目标内存或者寄存器的污点状态清除 利用二进制插装技术 在每条机器指令执行之前 获得该指令的各个操作数的实 际内容并查询是否被输入数据污染 然后根据指令的具体类型来确定相应的污点传 播和清除操作 根据机器指令对数据的操作可能导致出现的污点传播情况 将机器指令划分为下 面几类 1 数据移动指令 主要将数据从内存 寄存器等位置进行数据移动 包括 mov 类指令 mov cmov movsz movzx movs 含 repmovs lods 含 replods stos 含 repstos 等 如果源操作数的实际内容含有污点标记 则目标操作数将被污染 需要被赋予 相同的污点标记 例如 mov ebx eax 指令 如果 eax 的内容含有污点标记 则 ebx 也会被污染 ebx 对应的内容也要加上污点标记 如果源操作数的实际内容不含污点标记 则目标操作数的污点状态将被清除 例如 mov ebx eax 指令 如果 eax 内容为非污点数据 则无论 ebx 之前是否含有 污点标记 都应该进行污点清除 所有的立即数 常数 的内容是程序本身含有的数据 永远不含污点标记 所有 如果立即数为源操作数 则目标操作数需要进行污点清除 2 算术运算指令 主要对内存或寄存器中的数据进行算术运算 包括 and or xor add sub div mul 等 如果源操作数的实际内容含有污点标记时 目标操作数除了保存原有污点标 记 还需要增加源操作数所包含的污点标记 例如 add ebx eax 指令 如果 eax 寄存器含有污点标签 则 ebx 需要增加 eax 的污点标签 同时需要保持原有的污 点标签 如果源操作数的实际内容不含污点标记时 目标操作数保持污点状态不改 例 如 add ebx 0 x10 指令 则目标寄存器 ebx 保持原有污点标签不变 3 内存相关操作指令 包含 push pop pushad popad pushfd popfd 等 这 些指令相当于变相的 mov 指令 它们的功能相当于将寄存器的数据放入堆栈内存或 者将堆栈上的数据放入寄存器 污点的传播和清除处理操作和第一类指令相同 4 对于其他类型的指令 这些指令可能隐含了某些操作 如 call 指令隐含了 push 14 华 中 科 技 大 学 硕 士 学 位 论 文 eip 的操作 导致堆栈内存污点被清除 而 leave 则隐含了 mov ebp esp pop ebp 的 操作 也会造成污点的传播和清除 所以需要对这些指令进行特殊处理 5 无关指令 这些指令不会引起污点的传播和清除 包括 jmp jcc ret nop 等 存在几个特殊情况需要进行污点清除 1 xor eax eax 由于编译器优化结果 常用这条指令来对 eax 进行清零操作 所 以当 xor 指令的两个操作数相同时 需要对其进行污点清除操作 2 sub eax eax 和前面一样 对目标操作数进行清零操作 2 3 基于基于污点污点分析的分析的协议格式协议格式逆向逆向 利用 2 2 节中的动态污点跟踪技术 将接收到的网络报文标记为污点源数据 将 程序在处理网络报文过程中产生的所有污点传播和清除操作记录到 trace 文件中 本 节则通过对 trace 文件进行分析和处理 从中提取出网络报文的格式信息 利用动态污点分析技术进行协议格式逆向的主要处理流程如图 2 3 所示 动态污点跟踪 产生trace文件 域边界划分 域边界调整 域类型判定 报文格式输出 开始 结束 图 2 3 基于动态污点分析的协议格式逆向方法处理流程 15 华 中 科 技 大 学 硕 士 学 位 论 文 2 3 1 格式域边界划分格式域边界划分 对报文的整体格式域边界进行划分能够获得对报文整体结构的清晰认识 在其他 报文逆向分析的方法中 都没有专门对报文域边界进行划分的相关研究 如使用报 文序列比对方法进行协议格式逆向的相关研究中 能够利用同类型报文结构上的相 似性来找到相同的域 但这种方法主要针对是文本类型的协议 对于二进制协议的 效果则不理想 本文提出的基于动态污点分析的格式域边界划分方法对文本协议和 二进制协议都能够取得比较准确域边界划分效果 在动态污点跟踪过程中 网络报 文中的每一个字节赋予一个单独的污点标记进行区分 污点标记一一对应于网络报 文中的某个字节 trace 文件记录了每一条机器指令引起的污点传播或清除操作的详细信息 包括 机器指令的地址 污点传播的类型 操作数包含的污点标记内容 对整个 trace 文件 进行扫描 可以获得针对网络报文中每个字节 有哪些机器指令对其进行过处理 为每个输入字节建立一个机器指令序列 包含了程序依次对该指令进行过处理的机 器指令的地址 1 域边界划分原理 首先 报文中不同域的字节之间 程序对其进行处理的机器指令序列差别很大 其次 报文中同一个域中的字节之间 程序对其进行处理的机器指令序列差别很小 2 域边界划分方法 根据两个报文字节对应的机器指令序列 本文采用needleman wunsch序列比 对算法计算出两个序列相似度 这个相似度的数值越大 则说明两个字节被处理的 机器指令序列越相似 某个字节是否能够合并到之前已经存在的一个域的标准是 该字节与域含有的其他字节计算相似度 最后计算相似度的平均值 如果该平均值 大于一个阈值 m 则将该字节加入这个域 否则该字节不加入该域 而是新建一个 空的域并将其加入 对于报文中属于同一个域的字节之间 相似度的值往往比较高 一般都大于 0 6 属于不同域的字节之间的相似度数值则较低 一般都小于 0 3 因此本文将平均相似 度的阈值设置为 0 7 实验结果表明能够将不同域的边界准确的划分开来 16 华 中 科 技 大 学 硕 士 学 位 论 文 2 3 2 格式域边界调整格式域边界调整 通过第一步的处理得到的域边界会有少许的误差 因为某些库函数如 strlen strcpy 等对同一个域进行处理的时候 经常出现对第一个字节或者最后一个字节处理 的机器指令序列会存在差别 所以需要从比机器指令更上一层的 api 函数层的信息 来对格式的域边界进行调整和验证 程序处理报文数据的时候一般会调用系统的字符串处理函数或者内存处理函数 这些系统函数实现的功能是对一块连续的内存区域进行处理 如果某个系统函数对 某一块连续的报文数据进行了处理 则认为这部分连续的报文数据属于同一个域 为了处理静态链接生成时系统函数代码直接被放入目标程序而不动态调用系统 函数的情况 还需要对所有的循环数据处理指令进行处理 因为这些 api 在底层实 现的时候经常使用块处理机器指令 包括 repmovs repstos 这两条指令经常用于实 现大块的内存或者字符串的赋值和拷贝操作 具体对下面的情况进行处理 1 对于字符串处理函数 如果源字符串缓冲区包含污点数据 那么这些污染字 节属于同一个域 字符串处理函数包括 strcpy strcat strlen strcmp strstr strchr mbrtowc multibytetowidechar 等 包含这些函数的各种变种形式 如宽字符版本 lstrcpy 等 2 对于内存块处理函数 如果源内存块缓冲区包含污点数据 那么这些污染字 节属于同一个域 内存块处理函数包括 memcpy memccpy memmove memchr memcmp 等 3 对于格式化字符串处理函数 如果格式化串参数中含有 s 则说明对应的 参数为字符串类型 如果 s 对应参数字符串含有污点数据 那么这些污染字节属 于同一个域 内存块处理函数包括 printf sprintf vsnprintf 等 4 对于循环块处理指令 如 repmovs repstos 等 源数据地址由 esi 和 edi 指定 而循环的次数则由 ecx 指定 通过二进制插装获得 edi esi ecx 的值 同时获 得每次循环处理的数据的长度 width 就可以得到源缓冲区的首地址 edi 和 esi 而源缓冲区的长度为 width ecx 对源缓冲区的内容进行检查 如果有污点数据 那么这些污点字节属于同一个域 17 华 中 科 技 大 学 硕 士 学 位 论 文 特殊情况 以 repmovs 为例 程序可能先对源缓冲区中长度为 width 整数倍的那 部分数据使用 repmovsd 指令每次处理 4 字节 对于剩余的那些字节使用 repmovsb 指令每次处理 1 个字节 对于这种情况 如果发现连续两个 repmovs 指令 如果处 理的区间分别是 start1 end1 和 start2 end2 且两条 repmovs 指令在代码段中的位置 属于同一个函数 则将两个区间合并为 start1 end2 通过对上面几种情况进行处理 就可以得到每个函数或者数据块指令所处理的数 据的区间 start end 利用所有获得的 start end 区间对域边界进行调整 调整策略如 下 1 如果 start end 区域包含了多个使用域边界划分的得到的域 那么忽略当前的 这个区间 2 如果 start end 完整包含了之前的某两个域 则将这两个域合并为一个域 3 如果 start end 被某个域完整包含 则将该域切割成两个域 通过上面的方法 可以在 api 函数层得到一条报文中的属于同一个域的那些字 节 然后对第一步中的格式域边界划分结果进行细化 得到更准确的结果 2 3 3 域类型判断域类型判断 利用上面的方法 可以获得一个比较精确的协议域边界划分结果 下一步是对每 个域的具体类型进行判断 对格式域的具体类型判断有很重要的意义 一方面可以 获得各个域的语义层次的信息 另一方面对 fuzzing 测试案例的生成也具有很好的指 导作用 如果某些域判定为不变域 则生成测试案例的时候不应该对其进行变异 而对于可变域则需要进行变异 一般将协议域划分为下列几种类型 常量二进制域 内容不能改变的二进制数据 如标志位等 常量字符串域 内容不能改变的 ascii 或 unicode 字符串 通常是对应用程序有 特殊含义的字符串 如关键字等 固定长度的可变二进制域 长度固定 但具体数值可变 如控制字段等 固定长度的字符串域 属于 的一种特定情况 只不过内容为可打印字符 变长二进制域 长度和内容都可变 如数据字段 用于存放大量用户数据 18 华 中 科 技 大 学 硕 士 学 位 论 文 变长字符串域 长度和内容都可变 但是以 0 作为结尾符 如一些常见文本 协议的数据字段 长度域 用于指示数据字段 或者 的长度或者在协议报文中的偏移位置 分隔符 数据字段 或者 有时候没有使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 徐州线条eps施工方案(3篇)
- 西藏诗词朗诵活动方案策划(3篇)
- 清水泥施工方案(3篇)
- 红色文创活动方案策划(3篇)
- 综合型建筑施工方案(3篇)
- 施工方案验算怎么解决(3篇)
- 北京市昌平区2024-2025学年八年级下学期第一次月考语文考题及答案
- 2025年1-6月我国电子商务发展情况
- 心肺复苏测试题目及答案
- 企业法务合同审查标准化流程及要点清单
- 港口码头自然灾害应急措施
- 院前急救知识考核试题及答案
- 造价咨询合同管理办法
- 孤立性血管性眩晕
- 2026《衡中学案》高考一轮总复习 生物学 全书
- 问题性皮肤培训课件
- 2025年工业区污水处理厂可行性研究报告
- 检车站员工管理制度
- 特色农产品电商直播基地建设项目可行性研究报告
- 智能航运管理-洞察阐释
- 被迫签署离职协议书
评论
0/150
提交评论