《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx

上传人(卖家):momomo 文档编号:5934445 上传时间:2023-05-16 格式:PPTX 页数:128 大小:2.49MB
下载 相关 举报
《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx_第1页
第1页 / 共128页
《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx_第2页
第2页 / 共128页
《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx_第3页
第3页 / 共128页
《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx_第4页
第4页 / 共128页
《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx_第5页
第5页 / 共128页
点击查看更多>>
资源描述

1、Part章 节04(软件漏洞的挖掘和利用)漏洞的挖掘是指分析应用程序或者系统,从中找出潜在的漏洞。漏洞的挖掘包含以下三个部分:l源代码漏洞挖掘l二进制漏洞挖掘l运行系统漏洞挖掘4.1 漏洞的挖掘l 在现代软件开发环境下,通常将源代码编译或解释为二进制文件,而后作为信息系统的一部分运行,因此源代码中的安全缺陷可能会直接导致软件漏洞的产生。l 源代码漏洞挖掘通常是使用静态分析技术。静态分析是指在不允许软件的前提下的分析过程,分析对象可以是源代码,也可以是某种形态的中间码。l 针对源码的漏洞挖掘主要有三种常见的技术:l 数据流分析l 污点分析l 符号执行4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘l

2、 基础概念l 数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术,分析对象是数据执行路径上的数据流动或可能的取值。l 执行路径表现为代码中的语句序列。l 三种流分析方法:l 流不敏感:不考虑语句执行顺利,比如单纯按照代码行号顺序分析l 流敏感:基于CFG控制流分析l 路径敏感:在流敏感基础上,添加实际路径判断4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 基础概念l 流不敏感的分析l 流不敏感的分析不考虑语句的先后顺序,往往按照程序语句的物理位置从上往下顺序分析每一语句,忽略程序中存在的分支。本质上,流不敏感的分析是一种很不准确的做法,所得到的分析结果

3、精确度不高,但由于分析过程简单且分析速度快,在一些简单的漏洞分析工具中仍然采用了流不敏感的分析方式,例如Cqual。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 基础概念l 流敏感的分析l 流敏感的分析考虑程序语句可能的执行顺序,通常需要利用程序的控制流图(control flow graph,CFG),根据分析的方向可以分为正向分析和逆向分析。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 基础概念l 路径敏感的分析l 路径敏感的分析不仅考虑语句的先后顺序,还对程序执行路径条件加以判断,以确定分析使用的语句序列是否对应一条可实际运行的程序

4、执行路径。成熟的漏洞分析工具中所采用的数据流分析往往采用流敏感或路径敏感的分析方式。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 基础概念4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 原理细节l 代码建模:漏洞分析系统在代码建模过程中应用一系列的程序分析技术获得程序代码模型。根据分析对象的不同,可以将源代码/中间代码转换为抽象语法树/三地址码;依据流分析手段的不同,可将代码转换为流控制图或调用图l 程序代码建模:为满足分析程序代码中语句或者指令的语义的需要,漏洞分析系统通常将程序代码解析为抽象语法树或者三地址码等中间表示形式。l 漏洞分析

5、规则:漏洞分析规则是检测程序漏洞的一步。漏洞分析规则描述“当分析到某个程序的某个指令语义时,漏洞分析系统该作出的处理”。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 原理细节l 静态漏洞分析:数据流分析将程序代码模型作为分析对象,将漏洞分析规则作为检测程序漏洞的依据,数据流分析可以看做一个遍历程序代码进行规则匹配的过程。之后采用任意一种流分析方式,通过规则匹配的手段,分析指令语义,寻找可能的漏洞。根据选取的流分析方式的不同,分析的规模和精度也可能产生不同。l 结果处理:为保证漏洞分析结果的准确性,使用数据流分析方法检测程序漏洞得到分析结果常常需要经过进一步分析处理。

6、这一过程包括漏洞确认,漏洞可靠性分析等步骤。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 针对数据流分析过程,首先针对各函数进行词法语法分析,生成AST,获取内部控制流:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 其次分析程序调用关系:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 漏洞规则l v被分配空间=V.startl v.start:kfree(v)=v.freel v.free:*v=

7、v.useAfterFreel v.free:kfree(v)=v.doubleFreel 在分析函数contrived_caller前,假定函数的参数w、x和p都被分配了空间,变量w和p的状态是start。由于变量x不是指针变量,不用记录它的状态。w和p处于start状态将作为函数comrivecLcaller的前置条件。l:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 具体分析过程:l 在BB1中,认为BB1的前置条件和函数ccmtrivedcaller的前置条件是相同的。变量p被释放,它的状态变为free。变量p、w和x作为函数contrived的

8、参数,函数contrived被调用,我们将分析函数contrived的代码。l 首先,将函数contrived的前置条件记为p处于free状态,w处于start状态。BB1的前置条件和函数contrived的前置条件是相同的,BB1未改变变量的状态,它的后置条件和前置条件相同。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 具体分析过程:l 然后,我们分析BB2。在BB2中,BB2的前置条件为P处于free状态,w处于start状态。变量w被释放,将w的状态记为free。变量p的值赋给q,将q的状态记为free。基本块的后置条件为p、q和w处于free状态

9、。l 对于BB3,变量的状态未发生变化,其前置条件及后置条件和BB2的后置条件是一样的。但是通过分析路径条件,可以发现不存在BB2到BB3到BB4这样的路径。关于路径条件的分析,将在符号执行中介绍。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 具体分析过程:l 在BB5中,BB5的前置条件为p、q和w处于free状态。对于语句ql=*q,根据分析规则将变量q的状态记为useAfterFree,并报告程序使用了已经释放的指针。l BB6为函数contrived的出口,对返回BB1的另一个后继分支BB3继续分析,BB1的后置条件为P处于free状态,w处于s

10、tart状态。BB3的已经记录了的前置条件为p、w处于free状态,和BB1的后置条件不同,记录BB3的第二个前置条件为p处于free状态,w处于start态并继续分析。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 具体分析过程:l 对于BB4,变量的状态未发生变化。通过分析路径条件,发现BB1到BB3到BB5为不可能的路径,因此将继续分析BB4。BB4的前置条件和后置条件都为P处于free状态,w处于start状态。l 随后可以将BB4和BB5的后置条件作为函数contrived的后置条件。此时函数contrived的后置条件为p、w处于free状态,

11、q处于useAfterFree状态或者w处于start状态,p处于free状态。在此,返回到函数contrived_caller继续分析。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 举例分析l 具体分析过程:l 对于函数contrived_caller的BB2,其前置条件为p处于useAfterFree状态,w处于free状态,或者p处于free状态,w处于start状态。分别根据BB2的两个不同的前置条件进行分析,如果选择前置条件中的前者,通过语句wl=*w,将变量w的状态记为useAfterFree,并报告程序使用了已经释放的指针。如果选择前置条件中的后者,程

12、序在语句w1=*w处是安全的。l 综上,可以发现代码的第10行和第17行可能出现使用已经释放的指针变量指向的内容的情况。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 典型工具l Fortify SCA简介l Fortify所推出的静态代码分析器Fortify SCA(Static Code Analyzer)是一个软件源代码缺陷静态测试工具。它通过分析应用程序可能会执行的所有路径,从源代码层面上识别软件的漏洞,并对识别处的漏洞提供完整的分析报告。l Fortify SCA首先解析目标代码文件或文件夹,将其转化成中间表达形式,然后通过内置的五种分析引擎:数据流引擎、语

13、义引擎、结构引擎、控制流引擎、配置引擎及由Fortify SCA分析规则库提供的分析规则对中间表达形式进行静态分析,从而将目标程序中可能存在的安全漏洞挖掘出来。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 典型工具l Fortify SCA由以下4个部分组成:l Fortify前端。负责对目标程序设计语言编制的程序代码文件或文件夹进行解析(词法分析、语法分析等)。Fortify设置了灵活的的中间体NST,可以将现行的主流代码转换为统一的NST格式,从而实现对不同代码的均一化检测。l 分析引擎。ForitfySCA主要包含的五大分析引擎:数据流引擎,语义引擎,结构引擎

14、,控制流引擎,配置引擎。其中,数据流引擎和控制流引擎是Fortify SCA最主要的两个分析引擎。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 典型工具l 分析规则库。Fortify SCA的分析引擎必须根据一定的分析规则来对程序进行静态漏洞分析。分析过程本质上类似于一个模式匹配过程,分析规则库就对应着各种代码安全漏洞模式。Fortify SCA自带的规则库的分类与CWE数据库类似,Fortify SCA产品系统中默认配置了大量的安全漏洞模式,可以满足一般性的漏洞分析需求。此外,用户也可在Fortify SCA中通过规则编辑器自定义分析规则,可按照待分析目标程序代码

15、的特定安全需求进行漏洞分析。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 典型工具l Fortify SCA工作原理:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 典型工具l 审计工作台或控制管理界面。负责驱动整个分析过程,对从分析引擎得到的检测结果(FPR文件)进行处理,包括对检测结果的排序、过滤、组织等,提供结果查看和输出的界面。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.1 数据流分析l 基本概念l 污点分析是一种跟踪并分析污点信息在程序中流动的技术,最早由Dorothy E.Denning 1976年提出。它的分析对象

16、是污点信息流。污点或者污点信息在字面上的意思是受到污染的信息或者“脏”的信息。l 一般而言,污点信息指的是来自于程序之外的信息,如鼠标点击等。但有时根据分析需要,程序内部的部分敏感数据也可以作为污点信息。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 基本概念l 污点分析的过程常常包括以下几个部分:识别污点信息在程序中的产生点并对污点信息进行标记,利用特定的规则跟踪分析污点信息在程序中的传播过程,在一些关键的程序点检查关键的操作是否会受到污点信息的影响。l 一般情况下,将污点信息的产生点称为Source点,污点信息的检查点称为Sink点。相应的识别程序中Source点和

17、Sink点的分析规则分别称为Source点规则和Sink点规则。Source点规则、Sink点规则以及污点信息的传播规则称为污点分析规则。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 一个分析实例:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 一个分析实例:l 将scanf所在的程序点作为Source点,将通过scanf接收的用户输入数据标记为污点信息,并且认为存放它的变量x是被污染的。如果在污点传播规则中规定“如果二元操作的操作数是污染的,那么二元操作的结果也是污染的”,那么对于语句“y=x+k”,由于x是污染的,所以y也被认为是污染的。一

18、个被污染的变量如果被赋值为一个常数,它将被认为是未污染的。例如上图中的赋值语句“x=0;”.将x从污染状态转变为未污染。循环语句whlie所在的程序点在这里被认为是一个Sink点,如果污点分析规则规定“循环的次数不能受程序输人的控制”,那么在这里就需要检查变量y是否是被污染的。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 一个分析实例:l 在上图中,不难得到变量y的取值控制依赖于变量x的取值。如果在污点分析中,变量x是被污染的,考虑到信息在控制依赖上的传播,变量y也应该是污染的。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 基本原理4.1 漏

19、洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 基本原理l 使用静态污点分析技术挖掘程序漏洞的系统的工作原理如上图所示。为了对程序进行污点分析,首先需要将程序代码转化为污点分析所使用的程序代码模型。l 另一方面,为应用污点分析挖掘程序漏洞,一般将漏洞分析规则用污点分析规则进行表示,包括Source点规则,Sink点规则以及污点信息传播规则。l 静态漏洞分析过程将程序代码模型以及漏洞分析规则作为输入,利用污点分析技术分析Source点的污点信息是否会影响Sink点处敏感操作所使用的关键数据,进而判断程序是否存在污点类型的程序漏洞,并给出初步的漏洞分析结果。4.1 漏洞的挖掘4.1.

20、1 源代码漏洞挖掘4.1.1.2 污点分析l 举例说明l 在漏洞分析中,人们通常使用污点分析技术挖掘一些特定类型的程序漏洞。l 这类漏洞通常表现为用户的非正常输入没有得到正确的检验和阻止,从而干扰了程序本身的执行。典型的例子是SQL注入。l 以下列代码为例,如果输入“or 1=1-”SQL语句的查询结果不为空,攻击者将在未输人正确信息的情况下,得到登录成功的信息。l String user=getUser();l String pass=getPass();l String sqlQuery=select*from login where user=+user+and pass=+pass+;

21、l Statement stam=con.createStatement();l ResultSetrs=stam.executeQuery(sqlQuery);l if(rs.next()success=ture;4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 举例说明l 在使用污点分析技术对上述类型的程序漏洞进行检查时,将所有来自程序之外的数据标记为污染的,通过分析受到污染的数据是否会影响到程序中关键操作所使用的关键数据,以判断程序是否存在这些类型的漏洞。l 对于上述代码所示的代码示例,在污点分析时,将来自程序之外数据的变量user和pass标记为污染的。由于变量s

22、qlQuery的取值受到变量user和变量pass的影响,因此也将变量sqlQuery标记为污染的。在后续代码中,程序将变量sqlQuery作为参数构造SQL操作语句,并且变量sqlQuery仍然被标记为污染的,据此可以判定程序存在SQL注人漏洞。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 典型工具l TAJ工具简介l TAJ(taint analysis for Java)是由IBM公司的Omer Tripp等人开发并实现在WALA工具上的针对Java语言的Web应用程序污点分析工具。l 通过使用静态污点分析技术跟踪程序中的信息流,TAJ可以检测可能存在于Java

23、 Web应用程序中的跨站脚本漏洞、SQL注人漏洞等污点类型的程序漏洞。l TAJ也可用于分析其他污点相关的程序问题,例如Java程序中的服务端的恶意文件执行问题、应用程序的隐私泄露问题以及异常处理不当问题。l TAJ在Java分析工具WALA上实现它的分析过程,它分析的对象是Java的字节码。通过构造调用图和程序切片的手段进行分析。l TAJ的工作过程如下:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 典型工具l TAJ工具简介4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 典型工具l TAJ工具简介l 在指向分析之后,TAJ利用污点分析检查程

24、序是否存在污点类型的漏洞以及其他的污点相关的安全问题。TAJ的污点分析过程可以看做是一个切片过程。在切片过程中,找到与污点数据有关的代码并进行分析,判断Source点的数据是否会传播到Sink点。l TAJ的切片分析基于一种混合形式的程序依赖图。这种混合依赖图包含两种形式的边。根据混合形式的程序依赖图,TAJ在正向切片算法中同时考虑和变量相关以及和对相关的数据依赖。TAJ在切片的分析中忽略了程序中的控制依赖,即它所使用的混合依赖图不包括控制依赖边,它的切片的过程也不将控制依赖相关的语句找出来。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 典型工具l TAJ工具简介l

25、为适用于对较大规模的程序的分析,TAJ在分析的过程中加入了一些近似分析的方案。包括优先分析Source点和Sink的数据,以及局部分析的手段等。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.2 污点分析l 基本概念l 符号执行是20世纪70年代提出的一种使用符号值代替具体值执行程序的技术,最先用于软件测试。符号是表示取值集合的记号。使用符号执行分析程序时,对于某个表示程序输人的变量,通常使用符号表示它的取值,该符号可以表示程序在此处接收的所有可能的输入。此外,在符号执行的分析过程中那些不易或者无法确定取值的变量也常常使用符号表示的方式进行分析。l 符号分析将程序中可能变化的量表示为抽

26、象的表达式,通过程序执行路径进行分析。与普通的程序执行相区别,在一般的程序执行步骤中,变量被赋予了具体的值。每一个符号执行的路径都是一个“true”和“false”组成的序列。每个程序的执行路径都可以简化为一颗二叉树,树的左右两端是“true”和“false”的两个分支。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念l 以以下例子为例:其执行树为:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念l 使用符号执行进行程序漏洞分析的工作原理如图所示:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念l

27、与数据流分析类似,使用符号执行技术进行漏洞分析的系统,常常使用抽象语法树、三地址码、控制流图、调用图等结构作为程序代码的模型。而代码建模过程通常包括词法分析、语法分析、中间代码生成和控制流分析等过程。l 于符号执行技术分析变量取值的特点,漏洞分析规则常常包括符号的标记规则以及一些在特定情况下变量取值的约束。静态漏洞分析过程将程序代码模型以及漏洞分析规则作为输入,通过使用符号执行以及约束求解等分析技术查找程序中可能存在的漏洞,并将初步的分析结果传递给处理分析结果过程。初步的分析结果经过进一步的处理形成最终的漏洞报告。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念

28、l 符号执行的两种手段-正向与反向l 在使用符号执行技术时,常常使用沿着程序路径分析的方式,将变量表示为符号和常量组成的计算表达式,同时分析路径条件或者漏洞存在的条件等约束。对于实际检测程序漏洞,通常关注程序中可能引起程序异常的操作,例如,数组的赋值或者C语言中的strcpy函数调用等类似操作所在的程序点称为漏洞检査点。此外,还可以从漏洞检查点出发,逆向分析程序是否存在一条使漏洞的存在条件可满足的程序路径。在这里将第一种检测程序漏洞的方法称为正向的符号执行,而后者称为逆向的符号分析。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念l 正向符号执行l 正向的符号执

29、行从某个分析的起始点开始,通过正向遍历程序的路径的方式进行程序漏洞的分析。其分析的起始点可以是程序入口点、程序中某个过程的起始点或者某个特定的程序点。在应用正向的符号执行检测程序漏洞时,通过分析路径上的程序语句,不断地将变量的取值表示为符号和常量的表达式,将路径条件表示为符号的约束,同时对符号在程序路径上需要满足的取值约束进行求解,判断路径是否可行,并且在特定的程序点上检查变量的取值是否一定符合程序安全的规定或者可能满足漏洞存在的条件。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 基本概念l 逆向符号执行l 符号执行通常是沿着程序路径对程序进行分析,遇到可能引起程序漏

30、洞的程序点,则分析该程序点处是否存在安全问题。然而,这样的分析过程缺乏漏洞分析的针对性。而逆向的符号执行分析可以弥补这种不足,有的放矢地进行漏洞分析。在应用逆向的符号分析方法检测程序漏洞时,通过直接在关键的程序点上分析所关心的变量是否可以满足存在程序漏洞的约束条件,并且通过逆向分析不断地获取路径条件对所关心变量的取值约束,并计算所关心的变量在当前的约束下是否还满足漏洞的约束条件,进而判断程序漏洞是否真实存在。分析过程常常在发现所关心变量的取值不再满足漏洞存在的条件或者分析到达程序的人口点时终止。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 举例说明l 以以下代码为例:

31、其程序调用图为:4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 举例说明l 对于形如arrayx的数组声明形式,分析过程记录数组的长度为x,其中x为常量。对于形如arrayi的数组元素访问形式,分析规则规定数组下标的取值在0到数组长度之间。l 首先对上述所示的代码片段进行基本解析,对代码中出现的宏进行数值替换,将代码第5行数组声明中的“ISDN_MAX_DRIVERS”替换为32,将代码第18行for循环语句中的“ISDN_MAX_CHANNELS”替换为64。l 该代码段包含了两个程序声明的函数“get_drv_by_nr”和“get_slot_by_minor”。其

32、中,函数“get_slot_by_minor”在第19行调用了函数“get_drv_by_nr”,函数“get_drv_by_nr”在第11行调用了函数“spin_lock_irqsave”。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 举例说明l 使用正向分析法分析上例:l 果使用自底向上的分析调用图的方法,那么对于上图所示的调用图情况,首先分析函数spin_lock_irqsave,这里由于没有列出它的实现代码,默认为对其的分析已经完成。之后需要分析函数get_drv_by_nr,分析过程如下:l 首先将函数get_drv_by_nr的参数di作为符号处理,这里用

33、符号a不其取值。l 代码第7行和第8行声明了两个变量,但未对其赋值,这里不对其进行处理。l 第9行if条件语句对变量di加以限制,在di0时执行后面的代码,di0是退出函数。这里记录a0时,函数返回空。然后遍历语句的false分支。l 第11行函数调用使用其摘要对其分析,这里的分析将其略去。4.1 漏洞的挖掘4.1.1 源代码漏洞挖掘4.1.1.3 符号执行l 举例说明l 第12行数组访问操作,是程序的检查点,根据分析规则,将a的取值范围被限定在0到数组drivers的长度之间。数组drivers的长度是32,所以有0a32。结合路径条件,有符号a的取值约束为。化简得到0a32。这时生成摘要0

34、a32程序是安全的。l 当函数spin_jock_irqsave分析完成后需要将符号a替换为参数di。这里摘要为di0时,函数返回空,0di32时,程序是安全的。l 之后分析到函数gel_slot_by_minor时,在第18行循环变量di的范围是064,这里记录0di64。第19行函数spin_jock_irqsave被调用,通过分析其摘要,参数di在di32时程序存在漏洞,而此时有0di2;l.l memcpy(void*)v3,(const void*)v4,4*v7);4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 举例说明2.Fuzz测试流程a.准备

35、测试用例,文件模糊测试首先要准备测试用例文件,可以通过生成和变异构建。其中,文件读取模块包括“overwrite”和“replace”两种原始数据变异模式。“overwrite”对指定位置使用畸形数据直接覆盖正常数据;“replace”通过搜索特征串并进行替换,可以改变文件大小,支持正则表达式。用户可以有针对性地进行数据替换,进行更“精确”的模糊测试数据构造。本实例通过对原始样本fuzz.mov进行“overwrite”变异产生测试用例,使用默认经验值数据ff就能触发漏洞。具体地,首先读取原始文件,然后逐字节变异产生模糊测试用例,逐字节变异每次顺序选取一个字节进行变异,本实例采用“经验值”畸形

36、数据产生规则,将选取字节依次替换为如下经验值:0 x00、Ox5A、0 x80、0 xA5、OxFF。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 举例说明 2.Fuzz测试流程 b.部署目标应用并指示其加载测试用例,测试用例生成后,需要配置打开测试用例的待测程序。本实例配置要测试的媒体播放器为QuickTime,设置好测试任务名称、程序、程序路径、程序参数等。然后,使用多种条件对某些特定的异常信息进行过滤(即不记录这些异常信息到最终的结果中),可以指定“异常号码”、“异常地址”、“进程名”、“异常模块”、“SecondChance”、“异常处理状态”、“寄

37、存器值”等过滤条件。例如:0 xE06D7363异常号码,其被用于描述任何由Microsoft Visual C+编译器通过调用“throw”而产生的错误。最后,通过运行时间超时等方式来决定测试目标程序是否终止运行,对于长时间未终止的进程可以根据超时主动杀死;对于弹出对话框,可以通过查找窗口句柄的方式进行关闭。这样整个测试过程中出现的交互操作就无须人工干预,能够自动完成所有的测试任务。上述准备工作完成后,模糊测试框架对pict文件进行模糊测试的任务设置已经完成,启动任务将运行QuickTime播放器打开测试用例文件,为了监控QuickTime运行时产生的异常,测试框架将以调试方式创建Quick

38、Time播放器进程。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 举例说明2.Fuzz测试流程c.监控异常。当有异常发生时,通过调试器记录堆栈、寄存器等信息,保存触发异常的测试用例,如下表所示。通过异常指令可以初步判断存在内存拷贝异常,此类异常出现漏洞的概率较大,还可以使用windbg插件msec.dll辅助判断异常是否存在可以被利用的漏洞。选定一条异常,利用模糊测试框架的“回归测试”功能产生异常的mov文件,然后运行QuickTime,将其附加到调试器,使用QuickTime打开产生异常的mov文件,异常发生后通过上下文环境分析产生异常原因,进一步追溯产生

39、异常的数据来源,最终确定漏洞产生原因。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 举例说明2.Fuzz测试流程4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试异常名称ACCESS.VIOLATION异常次数1导致崩溃0异常地址668E239A异常指令MOVESP+EAX+10,CL寄存器EAX:021EC742HBX:670625D0ECX:3FFFF9DlEDX:00000000ESI:021EDFFEEDI:0013CA64ESP:001381ACEBP:001381B4模块名QuickTime.qts进程名QuickTi

40、mePlayer.exel 典型工具l Peachl 1.Peach的基本概念:Michael Eddington等人开发的Peach是一个遵守MIT开源许可证的模糊测试框架。其最大的优势,就在于其框架的灵活性,以及其对代码重用特性良好的支持。l 2.Peach的架构组成:Peach的主要组件包括初始化、引擎、解析器、状态机、状态、操作、代理、监视器、变异策略、变异器等。其执行过程可以简单描述如图所示。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 典型工具l Peachl Peach提供了一些组件以构建新的模糊器,包括:生成器、转换器、发行器以及群组。l 1

41、.生成器:生成器负责生成从简单的字符串到复杂的分层的二进制消息范围内的数据。可以将生成器串接起来以简化复杂数据类型的生成。将数据生成抽象到自己的对象中就可以很容易地在所实现的模糊器中进行代码重用。l 2.转换器:以一种特定方式来改变数据。常见的转换器可能包括:base64编码器、gzip编码器以及URL编码器等。转换器可以被串接起来使用,也可以将其绑定到一个生成器。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 典型工具l Peachl Peach提供了一些组件以构建新的模糊器,包括:生成器、转换器、发行器以及群组。l 3.发行器:发行器通过一个协议实现了针对

42、所生成数据的一种传输形式。常见的发行器包括:文件发行器和TCP发行器。同样,将此概念抽象到自己的对象中也促进了代码的重用。发行器可供开发人员,使用人员根据需要将自己创建的生成器连接到不同的输出通道,Peach对发行器的最终期望是可以为任意的生成器提供透明的接口。l 4.群组:群组包含一个或者多个生成器,它是对生成器可以产生的值进行遍历的一种机制。Peach包含一些常用的群组实现。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.1 Fuzzing测试l 基本概念l 污点分析技术最早由Dorothy E.Denning于1976年提出,它的主要原理是将来自于网络、文件等非信任渠道的数据标记

43、为“被污染的”,则作用在这些数据上的一系列算术和逻辑操作而新生成的数据也会继承源数据的“被污染的”属性。通过对数据属性进行分析,便能够得出程序的某些特性。根据污点分析时是否运行程序,可以将其分为静态污点分析和动态污点分析。l 静态污点分析技术能够快速定位污点在程序中的所有出现情况,但是其缺点是精度较低,因此需要人工对分析结果进行复查确认。二进制静态污点分析技术主要是指利用IDA&Hex-Rays反汇编与反编译框架对二进制代码反汇编与反编译的基础上使用静态污点分析技术。使用静态污点分析技术的代表性工具主要有LCLint、Satumra等。l 动态污点分析是在程序运行的基础上,对程序数据流进行监控

44、,以规范程序数据的传播。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 基本概念l 根据流的不同,动态污点分析技术可以分为基于数据流的分析技术和基于控制流的分析技术。l 根据使用范围的不同,动态污点分析技术可以分为用户进程级的动态污点分析和全系统级的动态污点分析。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 基本原理l 污点分析首先需要定义一个污染源(Source点),即污染数据的来源,也就是引入外部数据的代码。污染数据通常由用户输入、文件或者网络引入。l 其次还需要定义一个污染触发点(Sink点)即可能触发潜在安全问题的危险代码。如果

45、只引人了污染数据但是没有被触发,那么这样的污染数据是无法构成威胁的。l 在Source点和Sink点之间,污染数据的传播分析即是简单的数据流分析过程,其通过变量之间的相互赋值进行传播。为了确定引人的污染数据是外部可控的,还需要进行污染净化分析通过收集输入验证等约束,进行简单的约束求解,以移除外部不可控的污染数据。l 动态污点分析技术和静态污点分析技术的基本原理是相同的,唯一区别在于静态污点分析技术在检测时并不真正运行程序,而是通过模拟程序的执行过程来传播污点标记;而动态污点分析技术需要运行程序,同时实时传播并检测污点标记。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析

46、l 基本原理l 下面是一个对命令注入漏洞进行污点分析的实例:4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 基本原理l 如上图,在实例中外部的污染数据从中的fgets函数引入,存在数据结构图中表示数据流分析对buf的跟踪,在处被污染的数据结构buf通过strcpy()函数传递给other这一数据结构,导致other被污染。图中表示数据流分析对other的跟踪,在的位置处由于system的参数other已被污染,因此system的参数是外部可控的,将导致潜在的危险,分析程序将此分析结果记录并报告给用户。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污

47、点分析l 举例说明l 本节介绍一个使用动态污点分析的方法检测缓冲区溢出漏洞的典型实例。如下代码所示,该段代码中存在一个字符串拷贝函数strncpy(),该函数负责将源数组的内容拷贝到目标数组。因为目标数组是放置在栈上的临时变量,且事先规定了大小,因此在没有对源数组长度进行有效判断的情况下将其拷贝给目标数组可能存在缓冲区溢出风险。本实例就针对该代码中的缺陷,进行动态污点分析,以期挖掘出该缓冲区溢出漏洞。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 举例说明l 上述代码中程序的main()函数中使用gets(source)代码接受键盘输人的字符串,并在该字符串长度小于

48、20个字节时进人fun()函数,将字符串拷贝到一个本地变量temp数组中。由于temp数组的大小只有15个字节,所以在拷贝时,可能出现缓冲区溢出。例如,从键盘输入19个字节的source字符串(字符串结束符0亦需要占用一个字节),则可以成功运行fun()函数,将其拷贝到temp数组中,溢出了4个字节。程序中接受外部输入字符串语句的二进制代码如下表1所示。l 程序中fun()函数中拷贝语句(1)(上述代码)的二进制代码如下表2所示。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 举例说明l 使用动态污点分析技术对该程序进行分析,首先需要确定程序攻击面。在介绍动态污点的

49、基本原理时,已经给出了程序攻击面的定义,即程序接受输入数据的接口集,一般由程序的人口点和外部函数调用所组成。在扫描该程序的二进制代码时,首先能够扫描到下表1中的语句(3)处的gets()函数。很显然,该函数是一个外部数据引入函数,其能够接受用户从键盘输入的一串字符串,因此,该函数符合程序攻击面的定义,是输入设备输入。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 举例说明l 在确定程序攻击面之后,分析污染源数据并进行污点标记。二进制代码语句(3)处的gets()函数(下表2)调用对应于源码中语句(2)处的get(source)代码(上述代码),该数组source的内

50、容由外部输入。因为一般把外部输人的内容都认为是不可靠的数据,所以需要为该数组做污染标记。在二进制代码分析中,可以根据程序攻击面中函数参数信息的格式,确定该函数的参数个数和类型以及返回值的类型。在本实例中,gets()函数只接受一个字符数组的起始地址为参数,并返回输人的字符串的起始地址。因此从下表1中的语句(4)处,查看到该语句将gets()返回值地址放到eax寄存器中,则此时eax寄存器的内容被标记为“污染的”。4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析l 举例说明l 表一l 表二4.1 漏洞的挖掘4.1.2 二进制漏洞挖掘4.1.2.2 动态污点分析0 x080

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|