(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf_第1页
(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf_第2页
(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf_第3页
(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf_第4页
(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf_第5页
已阅读5页,还剩72页未读 继续免费阅读

(计算机科学与技术专业论文)未验证输入安全漏洞检测系统的设计与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

t , 广。 j 独创性( 或创新性) 声明 本人声明所呈交的论文是本人在导师指导下进行的研究工作及取得的研究 成果。尽我所知,除了文中特另t l g i 以标注和致谢中所罗列的内容以外,论文中不 包含其他人已经发表或撰写过的研究成果,也不包含为获得北京邮电大学或其他 教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任 何贡献均已在论文中作了明确的说明并表示了谢意。 申请学位论文与资料若有不实之处,本人承担一切相关责任。 本人签名: 1 7 tj 朝:冱盆:! 主:! 篁 一 关于论文使用授权的说明 学位论文作者完全了解北京邮电大学有关保留和使用学位论文的规定,即: 研究生在校攻读学位期间论文工作的知识产权单位属北京邮电大学。学校有权保 留并向国家有关部门或机构送交论文的复印件和磁盘,允许学位论文被查阅和借 阅;学校可以公布学位论文的全部或部分内容,可以允许采用影印、缩印或其它 复制手段保存、汇编学位论文。( 保密的学位论文在解密后遵守此规定) 保密论文注释:本学位论文属于保密在一年解密后适用本授权书。非保密论 文注释:本学位论文不属于保密范围,适用本授权书。 本人签名: 导师签名: 日期:芝1 2 i 遗:2 :! 三 日期:2 里里全:! 皇:! 兰 l 北京邮电大学硕j j 学位论文 摘要 未验证输入安全漏洞检测系统的设计与实现 摘要 随着社会信息化的不断深入,以软件为核心的应用系统规模和复 杂性也越来越大。随之而来的是软件故障率的不断增加,由于软件故 障而造成的经济损失也呈现快速上升的趋势。而在软件故障中,软件 安全漏洞的不断涌现和网络攻击行为的不断增多,使得对于软件安全 性的测试也逐渐成为人们关注的焦点。 另一方面,当前软件设计及开发人员对安全问题普遍缺乏正确、 足够的认识,导致软件本身有很多潜在的缺陷,同时也对外暴露了大 量可供攻击者入侵或破坏的安全漏洞。因此,对软件进行安全性测试 是软件交付前必不可少的一项工作。 本文首先介绍了当前软件测试的相关概念及软件安全性测试的 发展现状,然后对c + + 语言中存在的安全漏洞进行了分类解释和形式 化描述,接下去详细阐述了c + + 语言未验证输入类安全漏洞检测系统 的设计和实现,并给出系统的实验数据和实验结果分析。 最后,总结了一年来的研究和开发工作,并对后期工作进行了展 望。 关键字软件测试安全性测试静态分析安全漏洞 j d a t a 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 ea p p l i c a t i o ns y s t e ms c a l ew i t h t h ec o r eo fs o f t w a r ei sg e t t i n gl a r g e ra n dl a r g e ra n dt h ec o m p l e x i t yi s i n c r e a s i n gq u i c k l y f o l l o w e db yac o n t i n u o u si n c r e a s ei nf a i l u r er a t eo f s o f t w a r e ,s o f t w a r ed e v e l o p m e n tc o s t sa n de c o n o m i cl o s s e sc a u s e db y s o f t w a r ef a i l u r ea l s os h o wr a p i d l ya s c e n d i n gt r e n d a n dt h ec o n s t a n t e m e r g e n c e o fs o f t w a r e s e c u r i t yf a u l t s a n dc y b e r a t t a c k sm a k e st h e s o f t w a r es e c u r i t yt e s t i n gb e c o m i n gt h ef o c u so fp u b l i ca t t e n t i o n o nt h eo t h e rh a n d t h el a c ko fc o r r e c tu n d e r s t a n d i n ga n ds u f f i c i e n t k n o w l e d g eo ns o f t w a r es e c u r i t yr e s u l t si nal o to fp o t e n t i a ld e f e c t sw i t h i n s o f t w a r ea n de x p o s e sal a r g en u m b e ro fs e c u r i t yv u l n e r a b i l i t i e sf o rt h e a t t a c k e r s t h e r e f o r e s o f t w a r es e c u r i t yt e s t i n gi sa ne s s e n t i a lw o r kb e f o r e d e l i v e r y t h i sa r t i c l ef i r s tb r i e f l yd e s c r i b e dt h ec o n c e p t sa n dt h em a i nm e t h o d s o fs o f t w a r et e s t i n ga n dd e v e l o p m e n ts t a t u so fs o f t w a r es e c u r i t yt e s t i n g , a n dt h e ni n t r o d u c e dt h ec l a s s i f i c a t i o na n df o r m a ld e s c r i p t i o no fc + + l a n g u a g es e c u r i t yv u l n e r a b i l i t i e s a f t e rt h a t ,t h ep a p e rd e t a i l e dt h ed e s i g n a n d i m p l e m e n t a t i o n o f t e s t i n gs y s t e m f o rt a i n t e dd a t a s e c u r i t y v u l n e r a b i 】i t i e s f i n a l l y ,t h ep a p e rs u m m a r i z e dt h er e s e a r c ha n dd e v e l o p m e n tw o r k o ft h ep a s ty e a ra n dp r o s p e c t e dt h ew o r ki nt h ef u t u r e k e yw o r d s :s o f t w a r et e s t i n g s e c u r i t yt e s t i n g s t a t i c a n a l y s i s s e c u r i t yv u l n e r a b i l i t y 瞎 目录 第一章绪论1 1 1 选题的背景、目的和意义1 1 2 本文的主要研究内容2 1 3 本文的组织结构2 第二章软件测试理论及现状研究4 2 1 软件测试相关概念4 2 1 1 软件测试理论的发展4 2 1 2 软件测试过程模型5 2 1 3 软件测试主要方法9 2 2 软件安全性测试技术1 5 2 2 1 软件安全性测试技术1 6 2 2 2 安全性测试方法比较2 3 2 3 小结2 4 第三章c + + 安全漏洞分类及模式研究2 5 3 1c + + 安全漏洞的分类2 5 3 1 1 输入验证和表示法2 5 3 1 2a p i 的滥用2 6 3 1 3 安全功能部件2 6 3 1 4 时间和状态2 7 3 1 5 错误处理2 8 3 1 6 低质量代码2 9 3 1 7 封装2 9 3 2 安全漏洞模式研究及形式化描述3 0 3 2 1 未验证输入类安全漏洞3 0 3 2 2 滥用a p i 安全漏洞3 2 3 2 3 安全功能部件安全漏洞3 3 3 2 4 低质量代码安全漏洞3 4 3 3 小结3 6 第四章c + + 未验证输入类安全漏洞检测系统的设计与实现3 7 4 1 未验证输入类安全漏洞的定义3 7 4 2 未验证输入类安全漏洞检测系统概要设计3 8 4 2 1 未验证输入类安全漏洞流程图3 8 l 北京邮电大学硕:l 学位论文目录 4 2 2 系统总体架构图 6 2 6 4 6 6 6 7 9 0 o 3 6 2 6 7 7 8 8 9 0 l 3 4 4 4 4 5 5 5 5 5 5 5 6 6 北京邮电大学硕i :学位论文 第一章绪论 第一章绪论 本章主要对论文的选题背景和目的进行简要的介绍,同时对本文的主要章节 进行了简单的描述,并对论文的结构进行了简单的勾勒。 1 1 选题的背景、目的和意义 随着人们对计算机的需求和依赖的与日俱增,计算机系统的规模和复杂性也 急剧增加。与此同时,计算机出现故障导致系统失效的可能性也在逐渐增加。而 由于计算机硬件技术的进步,元器件可靠性的提高,硬件设计和制造技术的成熟, 硬件故障相对显得次要了,软件故障正逐渐成为导致计算机系统失效的主要因 素。 而软件故障可能造成巨大的经济损失,甚至危及人的生命安全。千年虫这一 众所周知的软件故障使得全世界付出了数亿美元的代价去更换或升级类似程序, 特别是金融、保险、军事、科学和商务领域,花费了大量的人力、物力对已有的 各种程序进行检查、修改和更新:1 9 9 1 年的美国爱国者导弹在海湾战争中对抗 伊拉克飞毛腿导弹的过程中,由于软件的故障误杀了2 8 名美国士兵;i n t e l 奔腾 处理器芯片中浮点除法的软件故障曾使i n t e l 公司的名声严重受损,并用4 亿多 美元来支付更换芯片的费用 程序是一个逻辑体,软件故障都是人为造成的。而由于人的主观认识常常难 以完全符合客观事实,与工程关系密切的人员之间的协作也不可能完美无缺。因 此,对于软件来说,无论采用什么样的技术和方法,软件中的故障是不可避免的。 即使是著名公司的商用软件,也会存在这样或那样的故障,只是故障率和危害程 序不同而已。这就需要用测试的方法来发现其中的软件故障,在软件将会使用前 发现潜在的问题,以尽可能的避免由软件故障带来的损失。 随着人们对软件质量的日益重视和软件工程的不断发展和成熟,软件测试在 软件开发过程中的地位也越来越重要。在知识的软件公司中,软件测试人员在整 个软件开发团队中的人数比例往往高达3 0 6 0 i 。如在b o r l a n d 公司,针对不同 的产品有不同的测试人员,专职测试人员大约有5 0 6 0 人,测试人员占研发人数 的3 0 - - 4 0 。在总的时间分配上,软件测试也占有相当大的比例。图灵奖获得者 f r e d e r i c ke b r o o k sj t 曾公开过他使用多年他使用多年的软件开发进度安排的经 验:1 3 设计,1 6 编码,1 4 构件测试和早期系统测试,1 4 系统测试【2 1 。 软件测试的目的是以尽可能少的时间和人力去发现并改正软件中潜在的各 种故障或缺陷,提高软件的可靠性。为此,可以使用多种测试方法。根据是否关 l 北京邮电人学硕1 :学位论文第一章绪论 注软件结构和算法,可以选择黑盒测试或白盒测试;根据是否执行被测试软件, 可以选择静态测试或动态测试;根据测试的不同阶段,可以使用单元测试,集成 测试,系统测试和验收测试;根据软件测试的内容,可以使用功能测试,性能测 试,安全性测试,负载测试,压力测试,回归测试,易用性测试,a l p h a 测试, b e t a 测试等方法。可以依照测试需求和其各自适用的场合,来选用不同的测试方 法。 而软件安全性问题与普通的软件故障相比,有更大的隐蔽性。软件的安全性 漏洞一般情况下并不会轻易暴露出来,但一旦当有着高深技术的黑客发现了软件 系统中的不健壮的地方,就会针对这样的漏洞发动攻击。攻击的结果轻则导致服 务不能正常使用,重则导致系统崩溃。这一切都可归结于软件设计及开发人员对 安全问题普遍缺乏正确、足够的认识,使得软件本身存在大量潜在的缺陷,同时 也对外暴露了大量可供攻击者入侵或破坏的安全漏洞。 解决软件安全问题的根本方法是提高软件从业人员的素质,增强其安全意 识,对其进行针对性培训。但错误是不可避免的,或早或迟程序中总会有地方出 错而导致出现非预期的结果。因此,对于软件安全性的测试对于保障软件系统的 安全性是必不可少的一环。 1 2 本文的主要研究内容 当前,以软件安全性测试为代表的软件测试正被越来越多的公司和行业所重 视,特别是航空、航天、电信、医疗、金融等以安全为第一要务的领域。而找到 一种高效的软件故障测试技术是应对目前软件规模不断扩大和对软件的质量要 求不断提高的必经之路。在研究中,作者重点关注的内容是:如何将自动化应用 于软件测试的各个阶段,将人力从重复费时的劳动中解脱出来。本文着重研究了 软件的安全性检测技术,并尝试用代码静态分析的方法去发现尽可能多的软件安 全漏洞。主要完成工作如下: 1 安全漏洞模式研究。总结、归纳安全漏洞模式,分析并用有限状态自动 机的方法形式化描述各类安全漏洞模式; 2 设计并实现未验证输入类安全漏洞检测系统: 3 将本系统与业内领先的静态分析软件进行横向的比较,分析误报率和漏 报率等重要技术指标。 1 3 本文的组织结构 本文的组织结构如下: 第一章:介绍论文的背景和主要内容; 2 北京邮电大学硕卜学位论文 第一章绪论 第二章:简要介绍了软件测试的相关知识,重点介绍了当前软件安全性测试 的主流技术和方法,并对各种安全性测试的技术特点进行了比较; 第三章:对安全漏洞进行分类和解释,并用形式化方法描述了各类安全漏洞 模式; 第四章:设计并实现未验证输入安全漏洞检测系统: 第五章:将系统与业内领先的同类软件进行对比实验; 第六章:对已完成的工作进行了总结,并对未来的工作进行了展望。 3 斌, 北京邮电大学硕:l 二学位论文第二章软件测试理论及现状研究 第二章软件测试理论及现状研究 软件测试是对软件需求分析、设计规格i 兑明和编码的终审,是保证软件质量 的关键步骤。出于不同的测试需求,逐渐衍生出了各种各样的软件测试方法。本 章首先简要的介绍了当前主流的流行的软件测试技术,并对软件安全性测试的主 要方法及其技术特点进行了较为详细的介绍和分析。 2 1 软件测试相关概念 软件测试从2 0 世纪中期出现至今,已经经历了长足的进步,各种高效的软 件测试技术也不断涌现。本节对软件测试的相关概念进行简要的介绍,然后较为 详细的介绍了当前发展较为成熟的测试方法。 2 1 1 软件测试理论的发展 2 0 世纪5 0 年代,英国著名的计算机科学家图灵给出了软件测试的原始定义: 测试是程序的正确性证明的一种极端实验形式。但在那个时期,程序比较简单, 规模较小,一般只有几百到几千行源代码,测试者可以简单的根据程序的功能进 行测试,测试用例一般在随机选取的基础上,吸取测试者的经验或是凭直觉判断 出某些重点测试区域。软件测试在软件开发中的作用并没有受到应有的重视,测 试方法和理论的发展也相对缓慢。 直到2 0 世纪7 0 年代,随着计算机硬件技术的进步和同趋成熟,软件在整个 系统中的地位越来越重要,软件的规模和复杂性也大大增加。软件质量问题在世 界范围内带来了一系列灾难性事件,软件可靠性问题面临前所未有的危机,从而 给软件测试工作带来的更大的挑战,测试的意义逐渐被人们认识,软件测试的研 究开始受到重视,软件测试的方法和理论进入了快速发展期。 软件测试理论迅速发展的同时,各种软件测试方法也应运而生。例如,h u a n g 提出了程序插装的概念,使被测试程序在保持原有逻辑完整性的基础上,插入“探 测仪 ,以便获取程序的控制流及数据流信息,从而可以计算测试的覆盖率。 h o w d c n 和c l a r k e 等人将符号执行的概念引入软件测试,提出了符号测试方法, 并且建立了d i s s e t 等符号测试系统。d e m i l l o 提出了基于程序变异的测试方法, 使传统的测试技术领域增加了新的成员一一错误驱动测试。o s t e r w e i t 和f o s d i c k 等人首先引入了数据流测试方法,通过对数据流的静态分析以发现程序中隐藏的 缺陷。 软件测试的概念也出现了一定的变化,但仍有一定的分歧。根据软件测试的 4 北京邮电大学硕j 二学位论文 第二章软件测试理论及现状研究 侧重点不同,主要有三种描述1 3 】: 定义2 11 9 8 3 年,i e e e ( 国际电子电气工程师协会) 提出的软件工程标准 术语中给软件测试下的定义是:“使用人工或自动手段来运行或测定某个系统的 过程,其目的在于检验它是否满足规定的需求或是弄清楚预期结果与实际结果之 间的差别。 该定义包含了两方面的含义: ( 1 ) 是否满足规定的需求。 ( 2 ) 是否有差别。 如果有差别,说明设计或实现中存在故障,自然不满足规定的需求。因此, 这一定义非常明确地提出了软件测试以检验软件是否满足需求为目标。 定义2 2 软件测试是根据软件开发各个阶段的规格说明和程序的内部结构 而精心设计一批测试用例,并利用这些测试用例去执行程序,以发现软件故障的 过程。该定义强调寻找故障是测试的目的。 定义2 3 软件测试是一种软件质量保证活动,其动机是通过一些经济有效的 方法,发现软件中存在的缺陷,从而保证软件质量。 上述三种观点实际上是从不同角度理解软件测试,但不论从那种观点出发, 都可以认为软件测试是在一个可控的环境中分析和执行程序的过程,其根本目的 是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷,提高软件 的质量。 2 1 2 软件测试过程模型 软件测试是与软件开发紧密相关的一系列有计划的活动,不同的开发模型要 求不同的测试过程。下面结合开发模型介绍两种常用的软件测试过程模型。 1 软件测试过程v 模型 v 模型是2 0 世纪8 0 年代后期提出的,旨在改进软件开发的效率和效果,是 最具有代表性的测试模型。v 模型是软件瀑布模型的变种,它不再把测试看作是 一个事后的弥补行为,而是一个与开发同等重要的过程,反映了测试与分析、设 计、编码的关系。其结构图如图2 - 1 所示,图中左半部分描述了软件开发的过程, 右半部分描述了与开发过程相对应的测试活动。 5 北京邮电大学硕 :学位论文第二章软件测试理论及现状研究 :圃一一_ _ 一_ 一一一一” 圊 图2 - 1 软件测试过程v 模型 v 模型非常明确地了测试的不同级别,清晰地展示了软件测试与软件开发 之间的关系。 单元测试的主要目的是根据详细设计设计说明书来检测每个单元模块 是否符合预期的要求,主要检查编码过程中可能存在的各种错误。 集成测试的主要目的是根据概要设计说明书来检测各个模块是否已正 确地集成在一起,主要检查各模块与其他模块接口之间可能存在的错 误。 系统测试的目的主要是根据需求分析来检测系统作为一个整体在预定 的环境中是否能够正常有效地工作,主要检查软件与系统定义不符合或 与之矛盾的地方。 v 模型每一测试阶段的前提和基础是要与开发阶段的文档相对应。但测试与 开发文档之间很少有完美的一对一关系。例如,需求分析的文档常常无法为系统 测试提供足够的信息,系统测试通常还需要概要设计甚至详细设计文档的部分内 容。针对v 模型的不足,又演化出其他几种测试过程模型。 2 软件测试过程w 模型 w 模型由两个v 型结构组成,分别代表测试与开发过程,其结构图如图2 2 所示。其中开发过程位于图的左边,测试过程位于图的右边。每一个开发过程对 应是一个测试过程,如果开发行为是定义或编写各种文档,那么相对应的测试行 为则是对这些文档的静态检测。w 模型形象地说明了软件测试与开发的关系, 体现了测试贯穿于整个开发过程的思想。从w 模型很容易看出测试的对象不仅 仅是程序,需要和设计阶段形成的文档同样是软件测试的对象。 6 北京邮电人学硕+ i :学位论文 第二章软件测试理论及现状研究 匝圈 匿i 窭堕! 至兰竺篓竺苎竺兰型 亘 亘 譬口罡霉 覃翠 臣习匿因 叵叵 图2 2 软件测试过程w 模型 w 模型也有自己的局限性。在w 模型中,开发、测试活动都保持着一种前 后关系,只有上一阶段结束,才可以正式开始下一阶段的工作,因此无法支持迭 代软件开发模型。 不论哪一种软件测试过程模型,都充分体现出软件测试与软件开发的密切相 关,在软件生命周期中占据十分重要的地位,是软件开发的重要组成部分。 3 软件测试过程h 模型 两个测试过程模型,都没有很好地体现测试流程的完整性。为了解决以上问 题,提出了h 模型。它将测试活动完全独立出来,形成一个完全独立的流程, 将测试准备活动和测试执行活动清晰地体现出来。软件测试过程活动完全独立, 贯穿于整个产品的周期,与其他流程并发地进行,某个测试点准备就绪时,就可 以从测试准备阶段进行到测试执行阶段。软件测试可以尽早的进行,并且可以根 据被测物的不同而分层次进行。其结构图如2 3 所示: 7 座: 北京邮电人学硕i :学位论文第一二章软件测试理论及现状研究 图2 3 软件测试过程h 模型 示意图演示了在整个生产周期中某个层次上的一次测试“微循环 。图中的 其他流程图可以是任意开发流程。例如,设计流程和编码流程。也可以是其他非 开发流程,例如,s q a 流程,甚至是测试流程本身。只要测试条件成熟了,测 试准备活动完成了,测试执行活动就可以进行了。 h 模型揭示了: 1 ) 软件测试不仅仅指测试的执行,还包括很多其他的活动; 2 ) 软件测试是一个独立的流程,贯穿产品整个生命周期,与其他流程并发 地进行; 3 ) 软件测试要尽早准备,尽早执行; 4 ) 软件测试是根据被测物的不同而分层次进行的。不同层次的测试活动可 以是按照某个次序先后进行的,但也可能是反复的; 4 软件测试过程x 模型 x 模型也是对v 模型的改进,x 模型提出针对单独的程序片段进行相互分 离的编码和测试,此后通过频繁的交接,通过集成最终合成为可执行的程序。x 模型的左边描述的是针对单独程序片段所进行的相互分离的编码和测试,此后将 进行频繁的交接,通过集成最终成为可执行的程序,然后再对这些可执行程序进 行测试。通过集成测试的成品可以进行封装并提交给用户,也可以作为更大规模 和范围内集成的一部分。多根并行的曲线表示变更可以在各个部分发生。如图 2 - 4 所示。 8 匿至 , 北京邮电大学硕:b 学位论文第二章软件测试理论及现状研究 j 程序片段l | 、 1 。- - - - - - - - - - - - - - - - - - j 、 l 测试设计l r 一1、 一 一 、 叵、- 匝 j 亘 陌司 i。j 亘 匝 匝。 ,7 _ 一匾 , , l 执仃测试l 集成圈 图2 4 软件测试过程x 模型 x 模型还定位了探索性测试,这是不进行事先计划的特殊类型的测试,这一 方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。但这样 可能对测试造成人力、物力和财力的浪费,对测试员的熟练程度要求比较高。 2 1 3 软件测试主要方法。 软件测试是一项复杂的系统工程,从不同的角度考虑可以有不同的划分方 法,对测试进行分类是为了更好的明确测试的过程,了解测试究竟要完成哪些工 作,尽量做到全面测试。按是否需要执行被测软件的角度,可分为静态测试和动 态测试;按是否关注程序结构和算法,可分为白盒测试和黑盒测试。下面分别对 这两种分类的测试方法进行简要的介绍。 2 i 3 i 静态测试 所谓静态测试( s t a t i ct e s t i n g ) 就是不实际运行被测软件,而只是静态地检查 程序代码、界面或文档中可能存在的错误的过程。静态测试又可分为代码走查 ( w a l k t h r o u g h ) ,代码审查( i n s p e c t i o n ) ,技术评审( r e v i e w ) 。 代码走查:开发组内部进行的,采用讲解、讨论和模拟运行的方式进行的查 找错误的活动。 9 北京邮电人学硕上学位论文第二章软件测试理论及现状研究 代码审查:开发组内部进行的,采用讲解、提问并使用编码模板进行的查找 错误的活动。一般有正式的计划、流程和结果报告。 技术评审:开发组、测试组和相关人员( q a 、产品经理等) 联合进行的,采用 讲解、提问并使用编码模板进行的查找错误的活动。一般有正式的计划、流程和 结果报告。 静态测试可以由人工进行,充分发挥人的逻辑思维优势,也可以借白盒测试 工具自动进行。经验表明,使用人工测试能够有效地发现3 0 7 0 的逻辑设计 和编码错误。 自动化的静态测试技术,主要是对代码的机械性、程序化的特征分析方法, 包括控制流分析、数据流分析、接口分析、表达式分析。 2 1 3 2 动态测试 静态测试就是不执行被测软件,而只是静态地检查程序代码或文档。而动态 测试通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健 壮性等性能,这种方法由三部分组成:构造测试实例、执行程序、分析程序的输 出结果。 因此,配置程序的运行环境和设计一组高效的测试用例是在动态测试前必须 完成的工作。而测试用例的设计则是其中的关键步骤。 测试用例( t e s tc a s e ) 是为测试设计的数据。测试用例由测试输入数据和与 之对应的预期输出结果两部分组成。测试用例的格式为: 【( 输入值集) ,( 输出值集) 1 下面重点介绍动态的白盒测试方法和黑盒测试方法。 2 1 3 3 白盒测试技术 白盒测试方法也称为结构测试或者逻辑驱动测试。它是根据软件产品的内部 工作过程,检查内部成分,以确认每种内部操作符合设计规格要求。白盒测试把 测试对象看作一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信 息来设计或选择测试用例 程序的状态来了解实际的 ,主要用于完成软 盒测试的基本原则 模块所有判断的每 和一般条件下至少 北京邮电大学硕 :学位论文 第_ 二章软件测试理论及现状研究 按照白盒测试的基本原则,“白盒法是穷举路径测试。在使用这一方案时, 测试必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程 序的独立路径数是天文数字,但即使每条路径都测试了,仍然可能有错误。第一、 穷举路径测试决不能查出程序是否违反了规范,即程序本身是个错误的程序;第 二、穷举路径测试不可能查出程序因遗漏路径而出错;第三、穷举路径测试可能 发现不了一些与数据相关的错误。 白盒测试的主要方法有语句覆盖测试、分支覆盖测试和路径覆盖测试等。 1 ) 语句覆盖测试 语句测试是最简单的结构性测试方法之一。它要求在测试过程中,除了观察 程序的输入、输出的正确性之外,还要观察程序中的语句是否都得到了运行,只 有程序中的所有语句都到了运行,才能称语句测试是充分的。在控制流图中,要 求所有语句都被运行的充分必要条件是覆盖图中的所有节点。因此,语句测试的 充分准则( 语句覆盖准则) 可以定义为:让t 为程序p 的一个测试数据集,g p 为p 的控制流图,l t 为与t 相对应的g p 中的完整路径的集合。 测试数据集t 称为语句覆盖充分的,当且仅当l t 覆盖了g p 中的所有节点。, 让n o d e ( l t ) 为路径集合l t 中所覆盖的g p 中的节点的集合,n g 是g p 中所 有节点的集合,则语句覆盖测试的覆盖率定义为: 语句覆盖测试的覆盖率一 n o d 两e r ( l t ) ( 2 矗 疗6z 。l , 除了不可行的完整路径所对应的语句之外,对一般的程序来说,语句覆盖的 充分性是容易被满足的。对一般的程序设计人员而言,当完成一段或一个程序后, 进行充分的语句覆盖测试是必要的。 求解一元二次方程方程的程序如下所示: v o i dm a i n 0 f l o a ta , b ,c ,x l ,x 2 ,m i d ; s c a n f ( “f ,f ,f ,& a ,& b ,c ) ; i f ( a ! = o ) m i d = b 宰1 - 4 幸a 毫c ; i f ( m i d o ) x 1 = ( - b + s q r t ( m i d ) ) ( 2 幸a ) ; x 2 = ( 一b s q r t ( m i d ) ) ( 2 幸a ) ; 1 1 北京邮| 乜人学硕一l 学位论文第二章软件测试理论及现状研究 p r i n t f ( “t w or e a lr o o t s n ”) ; e l s e i f ( m i d = - - o ) x l = - b 2 幸a ; p r i n t f ( “o n er e a lr o o t i l ”) ; e l s e x l = 一b ( 2 宰a ) ; x 2 = s q r t ( 一m i d ) ( 2 幸a ) ) p r i n t f ( “t w oc o m p l e xr o o t s n 劢 p d n f ( “x l = f ,x 2 = f l l ”,x l 毒2 ) ; l 选择三个测试用例 2 、5 、3 , 1 、2 、1 , 4 、2 、1 就能覆盖所有的节点, 也就是说,这三个测试用例对语句覆盖来说是充分的。 2 ) 分支覆盖测试 语句覆盖测试是最基本的覆盖测试技术,但就检测软件的错误而言,这是远 远不够。在求解一元二次方程方程的例子中,虽然三个测试用例能保证所有语句 都被执行,但并不能保证a = o 这条分支被测试。因此,一些更强的覆盖测试技术 自然就被提出来了。分支测试要求在软件测试过程中,不仅观察软件输入、输出 的正确性,还要观察软件执行过程中,是否所有的分支都得到了执行。只有当所 有的分支都得到了测试,该测试才被认为是充分的。在控制流图模型中,分支表 现为图中的一条有向边,因此,分支测试的充分性准则( 分支覆盖准则) 定义为: 测试数据集t 称为分支覆盖充分的,当且仅当l t 覆盖了g p 中的所有有向边。 让e d g e ( l t ) 为路径集合l t 中所覆盖的g p 中的有向边的集合,e g 是g p 中 所有边的集合,则分支覆盖测试的覆盖率定义为: 分支覆盖测试的覆盖率一h e d g 证e i ( r l r ) i x 1 0 0 北京邮电人学硕。t :学位论文第二章软件测试理论及现状研究 选择四个测试用例 2 、5 、3 , l 、2 、l , 4 、2 、1 , 0 ,2 ,1 ) 就能覆盖 所有的分支,也就是说,这四个测试用例对分支覆盖来说是充分的。 3 ) 路径覆盖测试 对任意给定的程序,程序的执行是:先给定输入,然后沿着不同的路径走向 输出。因此,人们自然就想到了路径测试技术。路径测试技术是上面所给出的测 试技术的强化。它不仅要求软件测试过程中观察输入、输出的正确性,而且要求 观察程序运行的整个路径,要求程序的运行覆盖所有的完整路径。路径覆盖准则 的定义如下:测试数据集t 称为路径覆盖充分的,当且仅当l t 覆盖了g p 中的 所有完整路径。让e p ( g p ) 为控制流图中的所有完整路径的集合,则路径覆盖 测试的覆盖率定义为: r 路径覆盖测试的覆盖率。百= 型l x l 0 0 4 )妒( g v l 路径覆盖准则虽然是要运行每一条路径,但1 0 0 路径覆盖率并不能保证程 序的正确性。例如,某个分支i f ( x = 0 ) ,如果将其中的“= 遗漏,这种错误未 必能检测出来。但路径覆盖准则需要的路径数目对许多程序来说往往是天文数 字。例如,对于相互连接的3 2 个双分支的程序,其分支的数目仅为3 2 个,但路 径的数目却是2 3 2 个。因此,对一般的程序来 兑,要达到1 0 0 的路径覆盖率几 乎是不可能的。再者,判断不可行路径也是非常困难的,而程序中往往存在大量 的不可行路径,这也是路径测试不太实用的主要原因。因此,实际使用时往往采 取路径测试的一些简化测试技术。 2 1 3 4 黑盒测试技术 黑盒测试技术也称功能测试或基于规格说明的测试。黑盒测试对软件已经实 现的功能是否满足需求进行测试和验证。黑盒测试完全不考虑程序内部的逻辑结 构和内部特性,只依据程序的需求和功能规格说明,检查程序的功能是否符合它 的功能说明。所以,黑盒测试是在软件接口处进行,完成功能验证。黑盒测试只 检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收 输入数据而产生正确的输出信息,并且保持外部信息( 如数据库或文件) 的完整 性。 理论上讲,采用黑盒测试技术并不需要提供程序的源代码,在有些情况下, 由于用户不能或者不愿意提供源代码的情况下,黑盒测试是必须的方法。 黑盒测试方法包括等价类划分法、因果图法、正交实验设计法、边值分析法、 判定表驱动法等。这些方法大都来源于其它不同的学科理论和工程实践,并不是 软件测试技术所独有的,但在软件测试技术中却能发挥很好的效果。 1 3 北京邮电人学硕l :学位论文第二章软件测试理论及现状研究 等价类划分法 等价类划分法是一种典型的黑盒测试方法,它完全不考虑程序的内部结构, 只根据程序规格说明书对输入范围进行划分,把所有可能的输入数据,即程序输 入域划分为若干个互不相交的子集,称为等价类,然后从每个等价类中选取少数 具有代表性的数据作为测试用例进行测试。 在使用等价类划分进行测试时,首先应在分析需求规格说明的基础上划分等 价类,再根据等价类设计出测试用例。软件不能只接收有效、合理的数据,还要 经受意外的考验,即接收无效的或不合理的数据,这样获得的软件才能具有较高 的可靠性。因此,在考虑等价类时,应注意区分两种不同的情况: ( 1 ) 有效等价类:合理、有意义的输入数据构成的集合,可以检验程序中 符合规定的功能、性能。 ( 2 ) 无效等价类:不合理、无意义的输入数据构成的集合,可以检验程序 中不符合规定的地方,对于具体的问题,无效等价类至少应有一个, 也可能有多个。 常用等价类划分原则有以下几方面: ( 1 ) 按区问:如果规格说明规定了输入条件的取值范围或值的数量,则可 以确定一个有效等价类和两个无效等价类。 ( 2 ) 按数值:如果规格说明规定了一组输入数据,而程序要对一个输入值 分别进行处理,则可为每一个输入值确立一个有效等价类,针对这组 值确立一个无效等价类,它是所有不允许输入值的集合。 3 ) 按数值集合:如果规格说明规定了输入值的集合,则可确定一个有效 等价类和一个无效等价类( 该有效值之外) 。 ( 4 ) 按限制条件或规则划分:拖过规格说明规定了输入数据必须遵守的规 则或限制条件,则可以确立一个有效等价类( 符合规则) 和若干个无 效等价类( 从不同角度违反规则) 。 ( 5 ) 细分等价类:等价类中的各个元素在程序中的处理若不相同,则可将 此等价类进一步划分成更小的等价类。 在确立了等价类后,可按表2 1 的形式列出所有划分出的等价类表: 表2 - 1 等价类划分表示例 输入条件有效等价类无效等价类 在设计等价类的测试用例时,应同时考虑有效等价类和无效等价类测试用例 的设计。根据等价类表设计测试用例,具体步骤如下: ( 1 ) 为每个等价类规定一个唯一的编号; 1 4 北京邮电人学硕二l 学位论文第二章软件测试理论及现状研究 ( 2 ) 设计一个新的测试用例,尽可能多地覆盖尚未被覆盖的有效等价类, 重复这一步,直到测试用例覆盖了所有的有效等价类。 ( 3 ) 设计一个新的测试用例,使其覆盖并且只覆盖一个还没有被覆盖的无 效等价类。重复这一步,直至测试用例覆盖了所有的无效等价类。 例如,某程序实现输入3 个边长( 设为a 、b 、c ) ,判断能否构成三角形, 对该程序考虑等价类划分法。满足测试三角形构成条件程序的等价类划分如表 2 2 所示: 表2 2 满足测试三角形构成条件程序的等价类划分 输入条件有效等价类无效等价类 ( 1 ) 边长a , b ,c 限制 a 0 或b 0 或c 0a 0 或b b 或b + c aa + b = c 或a + c d i r = o p e n d i r ( i t e r a t o r - b u c k e t _ n a m e ) ; 4 i f ( i t e r a t o r - d i r = ln u l l ) 5 s w i t c h ( e r r n o ) 6 c a s ee n o e n t : 7 b r e a k ; 北京邮电人学硕一l :学位论文第三章c + + 安全漏洞分类及模式研究 8 1 9 c a s e0 : 1 0 s t r u c ts t a td i r s t a t ; 1 1 1 2 i f ( s t a t ( i t e r a t o r - b u c k e t _ n a m e ,& d i r s t a t ) = = o ) 1 3 1 4 b r e a k ; 1 5 ) 程序代码中采用o p e n d i r 0 和s t a t 0 同时操作于同一个文件,但是黑客可能 会以极快的速度移走该文件,将导致这两个操作不能按程序员预计的行为作用于 同一个文件上。 这类错误的竞争条件产生的原因是:一个给定的资源在时间检测和时间利用 之间存在漏洞的时间窗口,这意味着在使用的状态下,检查的状态可能不再为真。 3 1 5 错误处理 在错误处理上产生的错误也是非常常见的。和滥用a p i 一样,错误处理相关 的漏洞也分为两类:没有有效的处理错误( 或几乎没有处理) :错误处理时给攻 击者提供了太多的信息 例如: i n tw r i t e _ d a t a ( v o i d ) c o n s tc h a r 书f i l e n a m e = ”h e l l o t x t ”; f i l e 宰f = f o p e n ( f i l e n a m e ,”w ”) ; i f ( f = = n u l l ) | ih a n d l ee r r o r | f p r i n t f ( f , ”h e l l o ,w o r l d n ”) ; a b o r t 0 ;1 o o p s ! d a t am i g h tn o tb ew r i t t e n ! | r e t u mo ; c 提供了一些程序终止的函数,如e x i t o , 从m a i n 函数返回,还有_ e x i t 0 , a b o r t 0 。下面是对应不同的终止函数的一些特性。 北京邮l 乜人学硕:学位论文 第二三章“+ 安全漏洞分类及模式研究 表3 - 1 终止函数特性 f u n c t i o nc l o s e sf i l ed e s c r i p t o r sf l u s h e sb u f f e r sd e l e t e st e m p o r a r yf i l e sc a l l sa t e x i t ,f u n c t i o n s - 孽。:暑! , u r s p e d f i e d u p s p e c i f i e du n s p e c i f i e d n o 一三z i : j :t :强- e y e su n s l :e c i f i e du r 善仁e :i e d n 0 x 土= 艺量;锰摹j y e sy e s y e sy e s 偿沁mf r 。m z l i n ; v e ;y e sy e sy e 从表3 - 1 可以看出,使用a b o r t ( ) 函数退出时,文件描述符、缓冲区、临时文 件都可能处于不确定状态,因此就不能确定操作是否完成,如数据是否被写入文 件中。因此,可以用e x i t o 代替a b o r t 0 确保i o 缓冲区中的数据已经存在与文件 描述符当中,并且文件描述符会被j 下确的关闭。 3 1 6 低质量代码 代码质量低下会导致不可预测的行为。对用户的来说意味着可用性不高,对 攻击者来说意味着给

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论