《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《软件安全》课件第4章 软件漏洞的挖掘与利用.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件安全 软件安全课件第4章 软件漏洞的挖掘与利用 软件 安全 课件 漏洞 挖掘 利用
- 资源描述:
-
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 符号分析将程序中可能变化的量表示为抽
展开阅读全文