




已阅读5页,还剩69页未读, 继续免费阅读
(计算机科学与技术专业论文)基于源码分析的软件安全测试技术研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京邮也大学硕上学位论文 基于源码分析的软件安全测试技术研究 摘要 随着计算机网络的发展,软件的安全性成为备受关注的一个方 面。越来越多的软件因为自身存在的安全漏洞,成为黑客以及病毒攻击 的对象。软件测试是验证软件正确性以及检测软件故障的重要和必要 手段,在软件生存期中占有重要地位。软件测试的效率和覆盖率对 软件开发的成功起决定性因素。 本文首先对当前软件测试方法和测试工具进行总结,指出传统 软件测试方法在测试效率和覆盖率上存在的缺陷。针对静态测试, 进一步分析当前主要研究方法和测试工具。 然后,本文指出基于缺陷模型的静态测试具有测试效率高、对 复杂逻辑测试效果好等特点。然后介绍了基于缺陷模型的静态测试 方法,并对软件的缺陷模型进行了分类总结。 最后,本文针对c + + j a v a 这两种广泛使用的开发语言,对其存 在的安全漏洞缺陷进行分析和总结。并对本文所依赖软件项目 d t sc p p 系统进行介绍,并详细介绍了c + + 语言中缓冲区溢出、竞 争条件和数组越界等三个模型在项目中的测试流程、算法和测试结 果。 关键字:软件测试静态分析测试模型安全漏洞 北京邮电大学硕士学位论文a b s t r a c t t h er e s e a r c ho ns o f r w 7 a r es e c u r i t y t e s n n gb a s e do ns t a ct e s n gm e t h o d a b s t r a c t a sc o m p u t e rn e t w o r kd e v e l o p i n g ,t h es e c u r i t yo fs o f t w a r eh a sb e e n p a i dm u c ha t t e n t i o nt o m o r ea n dm o r es o f t w a r eh a sb e e na t t a c k e db y c o m p u t e rv i r u so rh a c k e r sb e c a u s e o fi t sv u l n e r a b i l i t i e sa n dd e f e c t s s o f t w a r e t e s t i n g i san e c e s s a r ya n d i m p o r t a n tw a yt ov e r i f y t h e c o r r e c t n e s so ft h es o f t w a r e f i r s t l y , t h i sp a p e ri n t r o d u c e sc u r r e n ts t u d yo f s o f t w a r et e s t i n ga n dt e s t i n gt o o l sa th o m ea n da b r o a d t h e nt h i sp a p e r p o i n t e do u tt h ed i s a d v a n t a g eo ft r a d i t i o n a ls o f t w a r et e s t i n gm e t h o d s s e c o n d l y t h i sp a p e rf o c u s e do nt h es t a t i ct e s t i n ga n a l y s i s t h i sp a p e r i n t r o d u c e dt h es t a t i ct e s t i n gm e t h o db a s e do nt e s t i n gm o d e l ,s u m m a r i z e s a n dc l a s s i f i e st h e s em o d e l s t h e nt h i sp a p e rp o i n t so u tt i i ea d v a n t a g eo f t h i st e s t i n gm e t h o d ,s u c ha st e s t i n gs o u r c ec o d ef a s ta n dp e e r i n gi n t o m o r eo fap r o g r a m sd a r kc o r n e r sw i t hl e s sf u s st h a nd y n a m i c a n a l y s i s f i n a l l y , t h i sp a p e rs u m m a r i z e sa n dc l a s s i f i e st h es e c u r i t yd e f e c t sa n d v u l n e r a b i l i t i e so fc + + a n dj a v ap r o g r a m m i n g l a n g u a g ef r o mt h ea s p e c to f a t t a c k e dr e a s o n s ,a n di n t r o d u c e st h ec o m p o n e n t sa n dw o r kf l o wo f d t s c p ps o f t w a r es y s t e m t h e nt h i sp a p e rf o c u s e do nt h ew h o l et e s t i n g p r o c e s so ft h r e ev u l n e r a b i l i t i e s ,c a l l e db u f f e ro v e r f l o w , a r r a yo u t - o f - b o x a n dr a c ec o n d i t i o ni nc + + p r o g r a m m i n gl a n g u a g e k e yw o r d s :s o f t w a r et e s t i n gs t a t i ca n a l y s i s t e s t i n gm o d e l s e c u r i t yv u l n e r a b i l i t y 1 i 独创性( 或创新性) 声明 本人声明所呈交的论文是本人在导师指导下进行的研究工作及取得的研究 成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不 包含其他人已经发表或撰写过的研究成果,也不包含为获得北京邮电大学或其他 教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任 何贡献均已在论文中作了明确的说明并表示了谢意。 申请学位论文与资料若有不实之处,本人承担一切相关责任。 本人签名: 盘丝也日期:卫篮:垄:! 互 关于论文使用授权的说明 学位论文作者完全了解北京邮电大学有关保留和使用学位论文的规定,即: 研究生在校攻读学位期间论文工作的知识产权单位属北京邮电大学。学校有权保 留并向国家有关部门或机构送交论文的复印件和磁盘,允许学位论文被查阅和借 阅;学校可以公布学位论文的全部或部分内容,可以允许采用影印、缩印或其它 复制手段保存、汇编学位论文。( 保密的学位论文在解密后遵守此规定) 保密论文注释:本学位论文属于保密在年解密后适用本授权书。非保密论 文注释:本学位论文不属于保密范围,适用本授权书。 本人签名: 导师签名: 日期:五乒玉止 日期: 北京邮电人学硕卜学位论文第l 章软件测试技术研究背景 第1 章软件测试技术研究背景 1 1 软件测试研究背景 软件测试是验证软件正确性以及检测软件故障的重要和必须的手段,在软 件生存期中占有突出的重要地位【l j 。根据b o e h m 的统计,软件开发总成本中, 用在测试上的开销要占3 0 到5 0 1 2 j 。如果把维护阶段的测试工作也考虑在 内,有人估计软件工作有5 0 的时间和5 0 以上的成本花在测试工作中。虽然 软件测试在软件开发过程中一直处于重要地位,但是由于软件以及软件错误的 复杂性,同时由于开发技术的不断发展,包括从传统的面向过程到面向对象编 程方式的发展,人们对软件测试的认识一直都是在变化的。早在2 0 世纪5 0 年 代,英国著名计算机科学家图灵就曾给出了软件测试的原始定义:软件测试是 正确性确认试验方法的一个极端形式。1 9 8 3 年,i e e e 组织给软件测试的定义 为:“使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是 否满足规定的需求或者是弄清楚预期结果与实际结果之间的差别。 1 2 软件测试方法研究背景 软件测试可以减少软件缺陷数目和降低软件缺陷密度,从而提高软件的可 靠性,增加用户的使用效率。为了检验开发的软件能否符合规格说明书的要 求,软件测试工作可以采用不同的策略。这些策略的区别在于它们表明了不同 的出发点、不同的思路以及采用不同的手段和方法。根据不同的软件测试策 略,目前研究的软件测试方法主要分为: 、按照是否需要执行被测软件: 1 动态分析方法 动态分析,就是通过运行软件来检验软件的动态行为和运行结果的正确 性。在运行期针对确定的可执行路径检测,拥有变量和别名的准确信息,因而 是一种精确的检测方法。动态分析由于了解运行值可以在分析成本不高的情况 下得到准确的分析结果,但是它的分析结果往往依赖特定的输入、调度和执行 路径。动态方法只能检测特定执行的结果,因而容易出现漏报等问题。一般的 动态方法都是不可靠分析,有的动态分析也会产生软件缺陷漏报。动态分析看 到的是问题本身而非征兆。 】 北京邮电大学硕士学位论文 第l 章软件测试技术研究背景 2 静态分析方法 静态分析不编译或者运行程序,而是通过对程序源代码进行分析从而发现 其中的错误。静态分析的目标不是证明程序完全正确,而是在程序运行之前尽 可能多的发现其中隐含的错误。静态分析方法可以自动地提取软件的行为信 息,从而检测出软件中的安全漏洞。和其它程序分析方法相比,该方法具有自 动化程度高、检测速度快以及代码覆盖率高等优点。 二、按照测试是否针对系统的内部结构和具体算法: 1 黑盒测试方法 黑盒测试又称功能测试,是基于用户说明书的测试。黑盒测试可以检测程 序功能上和性能上的问题。但是黑盒也有其自身的局限性,如不能对程序特定 部位进行测试等等。 2 白盒测试方法 白盒测试又称结构测试,是基于程序的测试。要求对被测试的程序进行一 定程度的覆盖。但是,即使是覆盖率达到1 0 0 ,也不能保证把所有的错误都列 举出来。 这些测试方法并不是独立于其他的测试方法,它们互相都是相互交叉,相 互依赖的。 三、按照测试在系统开发中的作用t 1 单元测试 单元测试是对软件中的基本组成单元进行测试,如模块、过程、函数或 类。主要包括的方法有静态测试方法、动态测试方法、黑盒测试方法和白盒测 试方法。 2 集成测试 集成测试是在单元测试的基础上,对两个或两个以上单元集成在一起构成 的子系统所进行的测试。一般包括自顶向下、自底向上、三明治集成测试方法 和大爆炸集成测试方法。 3 系统测试 面向软件性能的系统测试方法,包括性能测试、压力测试、容量测试和 2 北京邮电大学硕上学位论文第1 章软件测试技术研究背景 健壮性测试。 面向用户使用的系统测试方法,包括恢复性与备份测试、安全性测试、 兼容性测试、可安装性测试、可用性测试、g u i 测试、文档测试以及配置测 试。 1 3 软件测试工具分类 测试管 理工具 静态ll 动态 测试ll 测试 - i - 具ll1 - 具 鬻1工具r 、 专用测试 工具 图1 - 1 测试工具分类图 根据测试种类的不同,软件测试工具也进行了不同的分类。上图为软件 测试工具分类图。 1 3 1 白盒测试工具 白盒测试工具一般是针对代码进行测试,测试中发现的缺陷可以定位到代 码级,根据测试工具原理的不同,可分为静态测试工具和动态测试工具。 3 甑黼t。一i;l黻t一耥撇一。,一姚枞 北京邮电大学硕上学位论文第l 章软件测试技术研究背景 1 3 1 1 静态测试工具 静态测试工具直接对代码进行分析,不需要运行代码,也不需要对代码编 译链接,生成可执行文件。静态测试工具一般是对代码进行语法扫描,找出不 符合编码规范的地方,根据某种质量模型评价代码的质量,生成系统的调用关 系图等。静态测试工具的代表有t e l e l o g i c 公司的l o g i s c o p e 软件、p r 公司的 p r q a 软件、m a c a b e 公司的m a c a b e 等。 l o g i s c o p e 【4 j 是支持嵌入式实时操作系统的白盒测试工具包,它对c c + + 、 a d a 及j a v a 语言的软件源代码进行静态,内置标准的编码规则检查,支持 m i s r a ,可以测试语句覆盖率、分支覆盖率、p p p 覆盖率和m c d c 覆盖率。 1 3 1 2 动态测试工具 动态测试工具的一般采用“插桩 的方式,向代码生成的可执行文件中插 入一些监测代码,用来统计程序运行时的数据。其与静态测试工具最大的不同 就是动态测试工具要求被测系统实际运行。动态测试工具的代表有c o m p u w a r e 公司的d e v p a r t n e r 软件、r a t i o n a l 公司的p u r i f y 系列、n u m e g a 中的 b o u n c e c h e c k e r 等。 例如,p u r i f y 5 l 工具能自动定位内存相关错误,在错误发生并造成破坏之前 进行修正,这些错误包括数组越界检测、非法指针操作、未初始化内存访 问、内存分配错误以及内存泄漏等。 1 3 2 黑盒测试工具 黑盒测试工具适用于黑盒测试的场合,黑盒测试工具包括功能测试工具和 系统测试工具。黑盒测试工具的一般原理是利用脚本的录制和回放,模拟用户 的操作,然后将被测系统的输出记录下来同预先给定的标准结果比较。黑盒测 试工具可以大大减轻黑盒测试的工作量,在迭代开发的过程中,能够很好地进 行回归测试。 黑盒测试工具的代表有i b mr a t i o n a l 的t e a m t e s t 、r o b o t ,c o m p u w a r e 公司 的q a c e n t e r 、m i 公司的w i n r u n n e r 等工具,另外,专用于系统测试的工具包 括有m i 公司的l o a d r u n n e r 、i b mr a t i o n a l 的q u a n t i f y 、r a d v i e w 公司的 w e b l o a d 、m i c r o s o f t 公司的w e b s t r e s s 等工具。 4 北京邮电大学硕士学位论文第1 章软件测试技术研究背景 例如,b a d r u n n e r 【6 】用来进行性能测试、压力测试、模拟多用户、定位性能 瓶颈。其功能包括:创建虚拟用户、创建真实的负载、定位性能问题、重复测 试保证系统发布的高性能、e j b 的测试、支持无线应用协议、支持媒体流应 用、完整的企业应用环境的支持。使用l o a d r u n n e r 完成测试一般分为四个步 骤:虚拟用户产生器创建脚本、中央控制器来调度虚拟用户、运行脚本、分析 测试结果。 1 3 3 测试管理工具 测试管理工具用于对测试进行管理。一般而言,测试管理工具对测试计 划、测试用例、测试实施进行管理,并且,测试管理工具还包括对缺陷的跟踪 管理。测试管理工具的代表有m i 公司的t e s t d i r e c t o r 、r a t i o n a l 公司的 t e s t m a n a g e r 、c o m p u r e w a r e 公司的q a d i r e c t o r 、t r a c k r e c o r d 等软件。 例如,t e s t d i r e c t o r 7 是m i 公司的一个用于规范和管理日常测试项目工作、 集中实施、分布式使用的专业的测试项目管理平台软件。它将管理不同开发人 员,测试人员和管理人员之间的沟通调度,项目内容管理和进度追踪。包括的 功能有:测试需求管理、制定测试计划、安排和执行测试、缺陷管理、用户权 限管理、项目信息管理以及分布式访问。 1 3 a , 专用测试工具 专用测试工具是用于某一专门应用领域或某些特殊用途的测试工具,针对 w e b 应用的有w o r k b e n c h 、w e ba p p l i c a t i o ns t r e s st o o l ( w a s ) 、m i 公司的 a s t r a 系列;数据库测试工具t e s t b y t e s 以及嵌入式测试工具t e s tr e a l t i m e 、 c o d e t e s t 等。 例如,t e s t b y t e s 8 】是用于自动生成测试数据,通过点击式操作确定需要生成 的数据类型( 包括特殊字符的定制) ,并通过与数据库的连接来自动生成数百万 行正确的测试数据,可以提高数据库开发人员、q a 测试人员、数据仓库开发 人员、应用开发人员的工作效率。 1 3 5 测试辅助工具 这类工具跟测试过程相关,帮助测试人员更有效地进行测试。如s m a r t d r a w 用于绘制u c m l ,进行负载压力测试需求分析,有助于测试前的准备工作; 5 北京i i i | j 电大学硕士学位论文第1 章软件测试技术研究背景 s d e m o 将测试过程中的操作录制成可执行文件文件,并回放出来,可以避免一 些偶尔才出现的错误。 6 北京邮r i 三人学硕上学位论文第2 章静态分析软件测试技术 第2 章静态分析软件测试技术 2 1 传统软件测试方法的缺陷 一个成熟的测试技术应该具备下列特性【9 j : 1 成熟的故障模型。 是指故障模型的准确性、完备性。所谓准确性是指故障模型所描述的故障 能准确的描述软件中实际存在的故障;完备性是指故障模型能描述软件中存在 的全部或大多数故障。 2 成熟的测试算法。 要存在一个自动算法,该算法能快速的产生检测模型中的故障。该算法的 计算复杂性一般要在多项式复杂性以内。 假设s 是任意软件,f 是s 中任意的故障集合,f = f l ,f 2 , - - - , f n ,a 是一个 测试算法。a ( s ,f ) 是应用算法a 所检测的s 中的故障c 。掣1 0 0 集 合,a ( s ,f ) _ c f 。被定义为a 检测s 中故障集合f 时的故障覆盖 率。 根据软件测试的目的,软件测试可以分为以发现软件错误为目的和以验证 软件性能为目的。我们称非面向故障模型的测试为传统的软件测试,之所以如 此,是因为软件测试必然要走面向故障模型测试这条路。传统软件测试的研究 已经发展了3 0 余年,就检测软件中的故障而言,目前已经形成了许多测试算 法,但这些算法普遍存在如下问题。 1 无故障模型。 测试模型要么基于软件的功能、要么基于软件的结构。很显然,功能 和结构和故障是没有必然联系的。因此非面向故障模型的测试是难以保证 测试效果。有可能测试程序花费了很大的代价,但测试效果并没有提高多 少。 2 测试效果的不确定性。 a ( s ,f ) 是不确定的,一般来讲,故障的检测效果只能用概率来统 计。例如1 0 0 的语句覆盖测试可以检测7 0 8 0 的错误,但对每次测试 来讲,能检测那些故障则是不确定的。 3 难以检测小概率故障。 设d 是s 的定义域,n 是d 中能检测故障f i 的元素个数,则f i 被检测 的概率可定义d ( 五) 一尚为。所谓小概率故障是指d ( f i ) 比较小的 北京邮电大学硕士学位论文第2 章静态分析软件测试技术 故障,由于在传统测试方法中,由于生成测试用例的随意性,所以难以 测试这种故障。 4 无法检测模型故障。 例如存储器泄漏故障,必须采用专门的技术有针对性的进行测试, 否则是难以测试的。 一般来讲,传统软件测试的效果是靠经验来估计的。对质量要求较高的软 件来说,仅用这种方法是不行的。 2 2 静态分析测试原理分析 静态检测使用静态分析技术,如前文所述,直接分析程序的源代码,通过 词法分析、语法分析和静态语义分析,检测程序中潜在的漏洞。目前,静态分 析主要有以下几种检测方法: 2 2 1 模型检测 模型检测是一种验证有限状态的并发系统的方法,基本思想是对于有限状 态的系统构造状态机或者有向图等抽象模型,再对模型进行遍历以验证系统的 某一性质【1 1 】。模型检测的难点在于如何避免状态空间爆炸。为此人们提出了多 种方法。其中符号化模型检测方法是将抽象模型中的状态转换为逻辑公式,然 后判定公式的可满足性。还可将模型转化成自动机,同时将需要检查的公式转 换为一个等价的自动机,再将此自动机取补。这两个自动机的积构成了一个新 的自动机,则判定模型是否具有某一属性的问题就转换成检查这个新自动机能 接受的语言是否为空。 模型检测在硬件检测和协议验证方面已经有了很好的应用,然而对于软件 检测,由于软件本身具有的高复杂度,该方法只能针对程序中的某一方面特性 构造抽象的模型进行检测。 2 2 2 符号执行 符号执行测试是一种静态的白盒测试技术。符号执行是一种符号化定义数 据,并为程序每条路径给出符号表达式,对特定路径输入符号,经处理输出符 号,从而判断程序行为是否错误,达到分析错误目的【1 2 1 。 符号执行的主要思想是使用符号值( 如变量的名称) ,而不是实际的数据来 8 北京邮电大学硕二 学位论文第2 章静态分析软件测试技术 代表程序输入,并在执行过程中产生关于输入符号的代数表达式。符号执行每 一步的状态包括三个内容: 路径条件 。程序计数器 。程序变量的符号值 路径条件p c ( p a t hc o n d i t i o n ) 是基于程序变量的布尔型表达式,是由输入变 量符号值和程序中间变量符号组成的不等式的集合,它积累程序每一步输入必 须满足的约束。当程序满足这些约束的时候,程序就会按照p c 所描述的路径 运行。程序计数器定义了下一个要执行的语句。将符号执行每一步的状态结合 起来就会产生一p c 树( 符号执行树) ,它可以完整刻画出程序走过的所有路 径。符号执行测试技术在静态执行代码的同时对中间变量进行替换,将所有的 中间变量替换成由初始输入变量组成的表达式。这样,当程序执行完全部的源 程序后,就得到很多的不等式组。源程序有多少条路径,就有多少个不等式 组,每一个不等式组对应了一条路径。由于不等式组中的变量全部为初始输入 变量,所以其解空间就是满足当前路径的测试用例集合。如果不等式组的解空 间不存在,则说明当前路径不可达。因此,将测试用例生成问题变成了约束求 解问题。 2 2 3 类型推断 程序语言的类型系统,包括一套定义类型的机制,一套有关类型等价、类 型相容和类型推理的规则。在将运算符作用于运算对象,执行赋值,或者把实 际参数传递给子程序时,都存在着类型是否合适的问题。类型推断是一个处理 过程,其目的是保证每个操作都是针对一组数目正确,类型合适的对象进行, 以保证操作的有效性。 类型推断可以检查类型错误,选择合适的操作,根据情况确定必要的类型 转换【1 3 】。类型推断方法具有简单、高效的特点,非常适合软件安全漏洞的快速 检测。已有的采用类型推断方法检测的安全漏洞主要有c 程序中的格式化字符 串漏洞、操作系统内核中的权限检查【1 4 1 ,以及操作系统内核中不安全的指针使 用等。 2 2 4 数据流分析 数据流分析是一项编译时使用的技术,它能从程序代码中收集程序的语义 9 北京邮电人学硕上学位论文 第2 章静态分析软件测试技术 信息并通过代数的方法在编译时确定变量的定义和使用。数据流分析被用于解 决编译优化、程序验证、调试、测试、并行、向量化和串行编程环境等问题。 数据流分析是通过对变量构造定义一引用对来实现的。 数据流分析在安全检测中有着广泛的用途。应用数据流分析技术,如,检 测c c + + 程序中的多种安全漏洞,检测c 程序中的数组越界漏洞,程序安全时 态属性进行部分验证等等。 2 2 5 约束分析 约束分析方法将程序分析过程分为约束产生和约束求解两个阶段,前者利 用约束产生规则建立变量类型或分析状态之间的约束系统,后者对这些约束系 统进行求解【1 5 】。 约束系统可以分为等式约束、集合约束和混合约束三种形式。等式约束的 约束项之间只存在相等关系。集合约束把每个程序变量看成一个值集,变量赋 值被解释为集合表达式之间的包含关系。混合约束系统由部分等式约束和部分 集合约束组成。 约束分析在安全检测中的应用也很广泛。文献【1 6 1 利用集合约束方法检测c 程序中的缓冲区溢出漏洞。 2 2 6 写入程序编译扩展发现安全漏洞 写入程序编译扩展发现安全漏洞( m c ) ,是美国斯坦福大学的k e na s h c r a f t 和d a w s o ne n g l e r 提出的一种静态测试方法。在这个方法中,程序员写入与 编译器相关的系统规范的扩展,来检验他们的代码错误。这个方法发现了 l i n u x 和o p e n b s d 中超过1 0 0 个安全漏洞,其中5 0 多个导致了核心修补。这个 方法一个特别的特征是当我们错过应该检测的代码动作时,这个方法会自动进 行检测。 m c 发现安全漏洞是通过一个范围检测器和其他两个检测器。范围检测器是 当从不被信任的文件中读取的整数在没有被检查的情况下被用于危险的方式的 时候发出警告。这个检验器证明了这个方法的有效性。另外两个检验器证明了 这个方法的普遍性。其中第一个当从不被信任的文件中读取的端点被反引用时 发出警告。第二个当用户引起内核中的非安全性错误,可能对系统产生恶意的 攻击时发出警告。 1 0 北京邮电大学硕上学位论文第2 章静态分析软件测试技术 一、静态检测安全属性的系统和语言 静态检测安全属性的系统和语言( m e c a ) 是由杨军峰等人提出1 1 8 】的。 m e c a 是一个批注系统,它是一个与灵活的,强功能的批注传播框架耦合的可 扩充的批注语言。 m e c a 由一个发射器、一个检索器、一个批注传播器和一个或更多的检验 扩展组成。发射器使用一个修订好版本的g c c 3 1 来分析被检验的系统的源代 码和它的抽象语法树的相关批注。抽象语法树是序列化的并且与调用图表和包 含所有函数指针分配的文件一起堆放在下一步处理过程的危险上。检索器检索 到这些树并用抽象语法树对每个函数建立一个控制流图。c f g 是与全局调用图 表相关联的,然后通过传播器进行处理。传播器在整个全局调用图表中传播批 注,然后在上面运行已经给定的检验扩展。 m e c a 把现有的技术与一些新颖的技术结合起来,具有一个简单且强功能 的批注原语,使用静态分析来检测故障批注。 二、静态分析方法总结 静态分析方法往往基于程序的一定的抽象表示【1 9 l ,建立程序的数学模型, 然后对此数学序模型求解。从而确定源代码是否会进入不安全的状态或者产生 不安全的行为。其中抽象语法树、控制流图、有限自动机以及有向图是常用的 抽象表示方法。 2 3 静态软件安全测试工具综述 程序安全测试类工具主要分为以下几类: 一、词汇语法类工具 这类工具是安全测试工具中最简单的一类工具,通过程序的词法和语法的 分析,对源代码进行静态分析,通过模式匹配找出特定的函数中可能导致安全 问题的缺陷。 这类测试工具主要代表有【9 1 : r a t s ( r o u g ha u d i t i n gt o o lf o rs e c u r i t y ) ,可以检查c c + + 、p e d 、p h p 和p y t h o n 语言; p s c a n ,u n i x 平台上检查c 函数中面n t f 风格的格式化字符串问题。 二、约束分析类工具 这类工具是通常是利用解析树产生的约束,也可以利用代码中添加注释, 对源代码进行分析,检查出可能的导致安全问题的缺陷。 北京邮电大学顾士学位论文第2 章静态分析软件测试技术 这类测试工具主要代表有: b o o n ( b u f f e ro v e r r u nd e t e c t i o n ) ,用于u n i x 平台c 语言测试工具; c q u a l ,c 语言测试工具。 三、 扩展编译类工具 这类工具是通过程序员根据对安全规则的理解,把规则和注释写入到源程 序中并传播,对编译器进行扩展,并对编泽后的程序进行分析。 这类测试工具主要代表有: x g + + ,查找l i n u x 和o p e n b s d 中的内核缺陷; m c ( m e t ac o m p i l a t i o n ) ,查找c 程序中的缺陷。 四、模型检测类工具 这类工具一般是对程序构造有限状态模型,通过检查该模型找出是否存在 违反特定安全规则的问题。 这类测试工具主要代表有: s l a m ,微软公司的测试工具; b l a s t ( b e r k e l e yl a z ya b s t r a c t i o ns o f t w a r ev e r i f i c a t i o nt 0 0 1 ) ,c 语言的 模型检测工具; m o p s ,u n i x 平台的c 语言测试工具。 表2 - 1 安全测试工具比较 工具类型优点缺点或困难 词汇语法简单且易于实现,通常嵌入编译 检测局限性比较大,局限在词 法与语法级别,且误报率比较 类工具器中在软件开发过工程中使用 高 约束分析能够依据不同的规则对不同的系受到规则描述机制的局限,只 类工具统进行分析,发现潜在错误能分析特定类型的错误 扩展编译 减少了程序员对编译的了解,可复杂系统的编译扩展需要 以隐藏在执行过程中不易理解的m e t a l 经验,需考虑完全性, 类工具 规则,降低了误报率和测试开销m c 原型的实现还有些笨拙 模型检测可以分析各类属性,更善于发现分析成本昂贵,很难适用到大 类工具系统的复杂行为 规模的实际应用 1 2 北京邮电大学硕士学位论文 第2 章静态分析软件测试技术 2 4 静态测试存在的问题 静态检测另外一方面的缺点是性能不足 z o l 。静态检测的精确度同运行时间 和空间消耗成正比,因此,提高检测质量的同时会增加运行成本。 静态检测技术衡量的2 个重要指标为: 漏报率( f a l s en e g a t i v er a t e ) 误报率( f a l s ep o s i t i v er a t e ) 降低其中之一的同时往往会造成另外一个指标的增高。 2 5 基于缺陷模型的静态代码分析 2 5 1 研究意义 基于模型的软件测试技术是针对软件中的一些常见的软件模型而提出的一 种测试技术,如故障模型、安全模型、死锁模型等。与形式验证试图证明整个 软件没有故障不同,基于模型的软件测试技术首先提出软件模型,然后通过检 测算法进行检测,如果检测算法是完全的,则能够从软件中排除该类故障模 型。 近年来,基于模型的软件测试技术得到快速的发展,大量的软件测试工具 被研制出来从而可以自动地检测软件中的故障。在对一些大型商业软件和开源 软件的测试中发现了大量的以前测试没有发现的软件故障和安全隐患。例如, s d v 在对w i n d o w s 操作系统1 2 6 个使用多年的驱动程序测试中发现了6 5 个故 障,包括1 2 个严重故斟2 l 】;e x p l o d e 在一些常用的文件存储系统系统发现了 大量的严重故障;m c 在l i n u x 、o p e n b s d 和x o ke x o k e m e l 软件中发现了近 5 0 0 个故障f 2 2 l 以及1 0 0 多个安全漏洞。f i n d b u g s 在e c l i p s e 、j 2 s e 和j b o s s 等开 源软件中发现近5 0 0 个故障嘲和以及1 0 0 多个安全漏洞f 2 4 】。在n a s a 以及神舟软 件的测试中,基于模型的软件测试技术都得到较好地应用。近年来,本项目和 国外合作利用基于模型的静态分析测试工具对i b m 、h p 、b o e i n g 等知名企业 的已经长期运行的数百万行商业代码进行测试和分析,发现了数百的故障。 基于缺陷模型的软件测试,具有以下优点l 2 5 j : 1 工具自动化程度高以及测试效率高。在内存为1 g 、c p u 为1 8 g 的p c 机上,f i n d b u g s 对e c l i p s e 、j 2 s e 和j b o s s 等开源软件进行分析,所耗 北京邮电大学硕士学位论文第2 章静态分析软件测试技术 时间不超过6 5 分钟,其中,对j 2 s e 中的r t j a r 分析,该程序包有1 3 0 8 3 个类,约4 0 m 大小,所耗时间只需4 5 分钟。 2 基于模型的软件测试技术往往能发现其他测试技术难以发现的故障。上 面举的例子都是对经过测试且长期使用程序进行测试得到的结果。 2 5 2 软件模型分类 当前,研究人员已经提出了各种各样的软件故障漏洞模型分类方法。在文 献【2 6 1 中,b i s h o p 对已有的漏洞分类方法进行了深入的分析,并且得出的一个重 要结论:不存在最好的漏洞分类方法,不同的分类目的就会有不同的最优分类 方法。 本文对软件故障模型进行的分类,是根据软件故障模型研究现状,导致软 件漏洞的原因以及项目需要所进行的分类。本文中的每一种分类方法,在 d t sc p p 软件系统中都有所对应的软件故障模型检测状态机。 2 5 2 1 故障模型 该类模型主要是会引起错误的常见软件模型,应该尽量避免。如内存泄漏 故障( m l f ) 、使用空指针故障( n p d f ) 、数组越界故障( o o b ) 、非法计算类 故障( i l c f ) 、使用未初始化变量的故障( u v f ) 、不完备的构造函数故障 ( i c f ) 以及操作符异常故障( o a f ) 等。 表2 2 是本文所依赖软件测试系统d t sc p p 给出了对3 1 9 7 3 0 2 行、美国生 产的c + + 程序4 类故障的测试结果【2 刀。可以看出,该四类故障总的故障密度为 0 4 8 k l o c ,也就是说,大约2 0 0 0 行c + + 的代码有1 个故障。 表2 - 2r e a s o n i n g 公司测试工具i q a 的测试结果 故障类型 m l fn p d fo o b fu v f 故障数目 5 6 13 8 01 6 74 5 3 1 4 北京邮电人学硕:l 学位论文第2 章静态分析软件测试技j r 2 5 2 2 安全漏洞模型 该类模型为他人攻击软件提供可能。而一旦软件被攻击成功,系统就可能 发生瘫痪,所造成的危害可能更大。因此,此类漏洞应当尽量避免。此类漏洞 主要有缓冲区溢出漏洞模型、被感染数据漏洞模型、竞争条件漏洞模型以及风 险操作、随机数漏洞模型等。从所统计的数据来看,在上述所给出的故障类型 中,其故障密度一般在1 个故障1 2 k l o c 。因此,测试这些故障是很有价值 的。 2 5 2 3 差性能模型 该模型在软件动态运行时效率低下,因此建议采用更高效的代码来完成同 样的功能。这类模型主要包括调用了不必要的基本类型包装类的构造方法、空 字符串的比较、拷贝字符串、未声明为s t a t i c 的内部类、参数为常数的数学方 法、创建不必要的对象以及声明未使用的变量及方法等。 2 5 2 4 并发故障模型 该模型主要是针对程序员对多线程的编码机制不十分了解,对各种同步的 方法、存储器模型和虚拟机的工作机制不是很清楚,而且由于线程启动的任意 性和不确定性使用户无法确定所编写的代码具体何时执行而导致对公共区域的 错误使用,如死锁等【捌。 2 5 2 5 代码国际化模型 该模型主要是在语言进行国际化的过程中,可能造成本地设置和程序需求 不符的情况,造成匹配错误。 1 5 北京邮电大学硕二e 学位论文第2 章静态分析软件测试技术 2 526 不良习惯模型 该模型主要是由于程序员编写代码的不好习惯所造成的一类错误。包括文 件的空输入,垃圾回收的问题,类、方法和域的命名问题,方法调用,对象序 列化,域初始化,参数传递和代码安全性问题等。 2 527 易诱骗代码模型 该模型主要指代码中容易引起歧义的、迷惑人的编写方式。比如无意义的 比较,永远是真值的判断,条件分支使用相同的代码,声明了却未使用的域 等。 1 6 北京邮电大学硕士学位论文 第3 章代码安全漏洞 第3 章代码安全漏洞 3 1 软件安全研究背景 近些年来,随着计算机网络的迅速发展和软件的广泛应用,软件的安全性 已经成为备受关注的一个方面,渐渐融入我们的生活,成为关系到金融、电 力、交通、医疗、政府以及军事等各个领域的关键问题。尤其在当前黑客肆 虐,病毒猖獗的网络环境下,越来越多的软件因为自身存在的安全漏洞,造成 黑客以及病毒攻击的对象,给用户带来严重的安全隐患。软件的安全漏洞,可 以使他人达到以非法手段受到获取用户系统的控制权或窃取机密数据的目的。 软件安全漏洞,越来越引起社会的注意。软件安全性已成为一个越来越不容忽 视的问题,提起它,人们往往会想起一连串专业性名词:“系统安全性参数”、 “软件事故率”、“软件安全可靠度”、“软件安全性指标”等等,它们可能出现在 强制的规范性文档中的频率比较多,但却不一定能在开发过程中引起开发者的 重视。几乎每一个程序员都或多或少的在项目维护时遭遇过自己软件的安全性 b i ,g 。 3 2 软件安全漏洞分类 软件安全漏洞主要分类【冽,【刈有返回值泄露,对象变量合并,垃圾回收器访 问权限设定,方法存储静态域问题以及有关域的相关问题等几类问题。 下面对这几类问题分别加以阐述: 3 2 1 数值泄露 数值泄露有返回值泄露和s t a t i c 方法中数组泄露等。 返回值泄露是指返回一个与存储在对象域中的易变对象的相关值时可能泄 漏该对象的内部表示。如果实例被不受信任的代码访问,和对易变对象的未受 限制的修改将威胁程序安全性或一些重要性质。 s t a t i c 方法中的数组泄露指的是公共静态方法返回与类的静态域中的一个数 组相关内容。任何调用这个方法的代码都可以自由的修改这个基本的数组。 1 7 北京邮电大学硕士学位论文第3 章代码安全漏洞 3 2 2 对象变量合并 代码将与外部的易变对象相关的内容存储到对象内部中。如果实例被不受 信任的代码访问,或对对象的不受限制的改变,将威胁安全性和其他一些重要 性质。在很多情况下,存储一个对象的复本是一种更好的方法。因为可能有其 他外部引用可以通过访问外部对象来访问内部信息。 3 2 3 垃圾回收器访问权限 一个类的垃圾回收器修饰符应该是p r o t e c t e d ,而不应该是p u b l i c 的。 对于一个类,垃圾回收器应该是保护访问的,如果是p u b l i c 的,可能会被 攻击,导致错误的释放空间现象发生。并且,不建议使用垃圾回收器,如果必 须释放系统资源时,最好自己编写代码,因为无法确定垃圾回收器释放资源的 时间。 3 2 4 方法存储静态域问题 代码存储异变对象的相关信息到静态域中。如果对异变对象进行不受限制 的修改,可能会导致系统安全性的威胁。 使用s t a t i c 关键字的目的: 只想用一个存储区域来保存一个特定的数据: 需要一个特殊的方法,它没有与这个类的任何对象关联。 所以将其他对象存储到对象的静态域中的时候,可能导致特定数据被访 问,或者为该对象增加关联,产生安全漏洞。 3 2 5 有关域的相关问题 有关域的相关问题主要有域的非f i n a l 问题,可变数组域,可变h a s h 表, 域与接口问题等。 域的非f i n a l 问题是如果一个对象中的域为f i n a l ,说明我们不能改变这个变 量的指向,否则该变量域可能被恶意代码所更改,或者由于被其他成员的异常 修改导致安全漏洞。 s t a t i c 方法中的数组泄露指的是公共静态方法返回与类的静态域中的一个数 组相关内容。任何调用这个方法的代码都可以自由的修改这个基本的数组。 可变数组域指的是与数组关联的f i n a l 静态域可能被恶意代码访问,或者受 到其它p a c k a g e 成员的异常影响。这些代码可以自由的修改数组中的内容。 可变h a s h 表是与h a s h 表关联的f i n a l 静态域可能被恶意代码访问,或者受 1 8 北京邮电大学硕士学位论文 第3 章代码安全漏洞 到其他p a c k a g e 成员的异常影响。这些代码可以自由的修改h a s h 表中的内容。 3 3 程序设计语言存在的安全漏洞 每种特定的程序设计语言,都存在跟自身语言编译和解释系统相关的安全 漏洞。下面针对目前软件领域广泛使用的j a v a 和c + + 语言,针对语言自身的安 全漏洞进行分析。 3 3 1 j a v a 语言安全漏洞分析 j a v a 是由s u n 公司开发的一种跨平台的、适合分布式计算环境的面向对象 编程语言。s u n 公司的白皮书中对j a v a 的定义是,j a v a 是一种具有“简单、面 向对象、分布式、解释型、健壮、安全、体系结构中立、可移植、高性能、多 线程和动态等特性的语言。从狭义角度讲,j a v a 是一种编程语言。从广义角 度讲,j a v a 不仅仅指编程语言本身,还包括一个客户机,服务器模式下的开发和 执行环境。因此,j a v a 语言的安全性也包含了两个方面的内容。首先,j a v a 是 种安全的平台,在此平台上,用户可以安全地运行j a v a 程。其次,它提供了 用j a v a 编程语言实现的安全工具和服务。 本文只讨论j a v a 源代码中可能存在的安全漏洞问题。根据引起安全攻击的 原因,我们将j a v a 源代码的安全漏洞进行如下分类: 3 3 11 未验证的输入 一些没有验证的输入,直接作为函数的参数进行调用。如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购买液压拖车合同范本
- 帮带宠物出境合同范本
- 合伙开火锅店合作协议书2篇
- 高压注水泵房配电设备维修技术协议3篇
- 考勤工作心得体会怎么写(范文10篇)
- 指导性案例的题目及答案
- 八月一日讲话参考
- 旅游行业活动策划攻略
- 2025年事业单位工勤技能考试考试题库及参考答案
- CN222980410U 一种静簧与线圈架装配结构及拍合式继电器 (四川宏发电声有限公司)
- 初中班级管理课件
- 【课件】+有理数的减法(第2课时+有理数加减混合运算)(教学课件)数学人教版2024七年级上册
- 2025年电信项目管理工程师考试试题
- 《高速铁路动车组辅助设备维护与检修(第2版)》课件 任务三四 CRH380B型动车组车门系统
- 单梁吊培训课件
- 2025教师暑期政治培训心得体会
- 2025至2030中国纳米纤维材料行业产业运行态势及投资规划深度研究报告
- 2025-2030中国蒸压加气混凝土(AAC)行业运行态势与未来前景展望报告
- DZ/T 0263-2014地面核磁共振法找水技术规程
- T/QX 006-2023工业设备水射流清洗质量验收规范
- 电信局实习协议书
评论
0/150
提交评论