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

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

  1. 1、本文档共127页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

漏洞的挖掘是指分析应用程序或者系统,从中找出潜在的漏洞。

漏洞的挖掘包含以下三个部分:

源代码漏洞挖掘

二进制漏洞挖掘

运行系统漏洞挖掘;在现代软件开发环境下,通常将源代码编译或解释为二进制文件,而后作为信息系统的一部分运行,因此源代码中的安全缺陷可能会直接导致软件漏洞的产生。

源代码漏洞挖掘通常是使用静态分析技术。静态分析是指在不允许软件的前提下的分析过程,分析对象可以是源代码,也可以是某种形态的中间码。

针对源码的漏洞挖掘主要有三种常见的技术:

数据流分析

污点分析

符号执行

;基础概念

数据流分析是一种用来获取相关数据沿着程序执行路径流动的信息分析技术,分析对象是数据执行路径上的数据流动或可能的取值。

执行路径表现为代码中的语句序列。

三种流分析方法:

流不敏感:不考虑语句执行顺利,比如单纯按照代码行号顺序分析

流敏感:基于CFG控制流分析

路径敏感:在流敏感基础上,添加实际路径判断

;基础概念

流不敏感的分析

流不敏感的分析不考虑语句的先后顺序,往往按照程序语句的物理位置从上往下顺序分析每一语句,忽略程序中存在的分支。本质上,流不敏感的分析是一种很不准确的做法,所得到的分析结果精确度不高,但由于分析过程简单且分析速度快,在一些简单的漏洞分析工具中仍然采用了流不敏感的分析方式,例如Cqual。

;基础概念

流敏感的分析

流敏感的分析考虑程序语句可能的执行顺序,通常需要利用程序的控制流图(controlflowgraph,CFG),根据分析的方向可以分为正向分析和逆向分析。

;基础概念

路径敏感的分析

路径敏感的分析不仅考虑语句的先后顺序,还对程序执行路径条件加以判断,以确定分析使用的语句序列是否对应一条可实际运行的程序执行路径。成熟的漏洞分析工具中所采用的数据流分析往往采用流敏感或路径敏感的分析方式。

;基础概念

;原理细节

代码建模:漏洞分析系统在代码建模过程中应用一系列的程序分析技术获得程序代码模型。根据分析对象的不同,可以将源代码/中间代码转换为抽象语法树/三地址码;依据流分析手段的不同,可将代码转换为流控制图或调用图

程序代码建模:为满足分析程序代码中语句或者指令的语义的需要,漏洞分析系统通常将程序代码解析为抽象语法树或者三地址码等中间表示形式。

漏洞分析规则:漏洞分析规则是检测程序漏洞的一步。漏洞分析规则描述“当分析到某个程序的某个指令语义时,漏洞分析系统该作出的处理”。

;原理细节

静态漏洞分析:数据流分析将程序代码模型作为分析对象,将漏洞分析规则作为检测程序漏洞的依据,数据流分析可以看做一个遍历程序代码进行规则匹配的过程。之后采用任意一种流分析方式,通过规则匹配的手段,分析指令语义,寻找可能的漏洞。根据选取的流分析方式的不同,分析的规模和精度也可能产生不同。

结果处理:为保证漏洞分析结果的准确性,使用数据流分析方法检测程序漏洞得到分析结果常常需要经过进一步分析处理。这一过程包括漏洞确认,漏洞可靠性分析等步骤。

;举例分析

;举例分析

针对数据流分析过程,首先针对各函数进行词法语法分析,生成AST,获取内部控制流:

;举例分析

其次分析程序调用关系:

;举例分析

漏洞规则

v被分配空间==V.start

v.start:{kfree(v)}==v.free

v.free:{*v}==v.useAfterFree

v.free:{kfree(v)}==v.doubleFree

在分析函数contrived_caller前,假定函数的参数w、x和p都被分配了空间,变量w和p的状态是start。由于变量x不是指针变量,不用记录它的状态。w和p处于start状态将作为函数comrivecLcaller的前置条件。

;举例分析

具体分析过程:

在BB1中,认为BB1的前置条件和函数ccmtrived—caller的前置条件是相同的。变量p被释放,它的状态变为free。变量p、w和x作为函数contrived的参数,函数contrived被调用,我们将分析函数contrived的代码。

首先,将函数contrived的前置条件记为p处于free状态,w处于start状态。BB1的前置条件和函数contrived的前置条件是相同的,BB1未改变变量的状态,它的后置条件和前置条件相同。

;举例分析

具体分析过程:

然后,我们分析BB2。在BB2中,BB2的前置条件为P处于free状态,w处于start状态。变量w被释放,将w的状态记为free。变量p的值赋给q,将q的状态记为free。基本块的后置条件为p、q和w处于free状态。

对于BB3,变量的状态未发生变化,其前置条件及后置条件和BB2的后置条件是一样的。但是通过分析路径条件,可以发现不存在BB2到BB3到BB4这样的路径。关于路径条件的分析,将在符号执行中介

文档评论(0)

bookljh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档