




已阅读5页,还剩109页未读, 继续免费阅读
(计算机系统结构专业论文)需求驱动的软件安全缺陷自动测试生成.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 作为软件质量保证的重要手段,软件测试发挥着其他方法不可替代的作用, 设计和生成有效的测试数据是影响软件测试质量的关键因素之一。软件安全缺 陷检测,是信息安全领域的核心问题。以软件安全缺陷的分析检测问题为主线, 研究了需求驱动的自动测试生成方法,主要内容如下: 1 软件安全缺陷的手工分析 自动测试生成方法的研究,离不开对安全缺陷的手工分析时积累的大量宝 贵经验。在手工分析安全缺陷的基础上,研究了缺陷模式的表示方法,并以一 个例子详细介绍了安全缺陷的手工分析方法。 2 需求驱动的软件安全缺陷自动测试生成方法 目标是自动产生能够触发安全缺陷的测试输入。与普通的测试策略相比, 这里并不一味地追求覆盖率,其测试行为是需求驱动的。通过分析补丁信息和 缺陷模式,确定需要覆盖的缺陷语句或路径,然后再通过正向的符号执行或者 是逆向的回溯的方法,排除误报,生成触发安全缺陷的输入。需求驱动体现在 两个方面,一方面,测试策略是需求驱动的,即只覆盖存疑的安全缺陷语句或 路径;另一方面,测试生成是需求驱动的,即在测试生成时执行尽量少的路径, 采用的方法主要有按需调度、按需回溯、按需展开等。安全缺陷的自动测试生 成,是跨过程的,需求驱动方法的引入,大大减轻了路径爆炸问题的影响。 3 需求驱动的安全缺陷自动检测系统设计与原型实现 系统基于p h o e n i x 编译器框架、g c c 编译器和z 3 约束求解器,可同时支持 w i n d o w s 平台和l i n u x 平台源代码的安全检测,具有良好的扩展性。原型系统 已被用于对若干开源软件的缺陷检测,验证了一批已公开安全缺陷。在补丁信 息的指引下,找到了未公开的绕过补丁修补位置再次触发缺陷的可执行路径及 输入。验证了需求驱动的自动测试生成方法的可行性和有效性。 关键词:自动测试生成软件缺陷检测需求驱动符号执行白盒测试 a b s l 残虻t a b s t r a c t s o 亿v a r et e s t i l l gi st 1 1 ep 曲a r yt e c h l l i q 鹏t 0i r i l p r o v er e l i a b i l 畸o fs o 小a r e d e s i 曲ga n dg e n e r a t 由ge 丘缸v et e s tc a s e si so n eo ft h ei m p o r t a mf 缸o r st 0m e q u a l i 哆o fs o f b 讯t e s t i i l g o nn l e 锄m y s i sa n dt h et e s t i l l go fs o f h v a r es e c u r i 够 d e f e c t s ,也er e s e a r c ho fad e m a 工l d d r i v e n 机l t o m a t e dt e s tg e n e r a t i o ni sc a r r i e do u t t h em a i l lc 0 n t e n _ t so ft h ed i s s e n a t i o ng oa sf o u o w s : 1 t h em a n u a l l ya n a l y s i so fs o 凤忸es e c 嘶t ) rd e f e c t s t h er e s e a r c ho ft h em e t l l o do f 踟幻m a t e dt e s tg e n e r a l i o nc 锄0 tb es e p 撇t e d 舶m 也ev a l u a b i ee x p e r i e n c e so ft h e 删m l l a l i ya n a l y s i so fs o f 时a r es e c u r i 够d e f e c t s t h ed i s s e 九撕o np r e s e n t sad e s 嘶p t i o nm e t h o do fd e f tm o d e lu s i l l gm em 如u a l l y 删y s i so fs o n ,a r es e c u r i t ) rd e f e c t s ,a n d 觚e x a i l l p l et 0d e t a i l e d l yi i l 订o d u c et h e m a n 珑l n ya n a l y s i sm e t l l o do fs o m 琵es e c u r i t ) rd e f e c t s 2 d e m a n d 一“v e ns o r w a r es e c u r i 够d e f e c ta u t o m a t e dt e s tg e n e r a t i o n a u t o m a t e dt e s tg e n e r a t i o no fs o f h a r es e c u r i 哆d e f e c t sa i m sa ta u t o m a t e d g e n e m t i o no ft e s ti n p 鹏w 陆c hc a nt r i g g e rs e c 嘶t ) rd e f e c t s t h et e s t i n gs 仃a t e g yd o e s n o tc o n c e 曲眦eo nc o v e r a g er a t ea l o n e 舔g e n e 脚s o 胁a r et e s t sd o i tc a nb e d e t e n n j l l e db ya 1 1 a i y z i l l gs o f t w a r ep a t c h e sa 1 1 dd e f e c tm o d e l sw h e l e rs o m ed o u b t 如l s 眦e m e n t so rp a t h sa r ec o v e r e d a n dt 1 1 e nt e s ti i l p u t s t r i g g e r i n gd e f e c t sc 锄b e g e n e r a t e db y f o r w a r d s ) ,n 曲o l i c e x e c u t i o no rr e v e r s eb a c 姗池gm e t h o d d e m a n d 一“v e nr e n e c t si n 铆oa s p e c t s 0 no n ea s p e c t ,t e s ts 缸a t e g yi sd e m a l l d 埘v 呱 m a ti s ,0 1 1 l yn e e d i n gt oc o v e rt h ed o u b t 如ld e f 宅c t i v es t a t e m e n t s o nt h eo t h e ra s p e 鸭 t e s tg e n e r a t i o ni sd e m a i l d 一“v e 皿t h a ti s ,a sf e wp 砒sa sp o s s i b l ea r ee x p l o r e di 1 1 恤 t e s tg e n e r a t i o np r o c e s s ,m a i l lm e t l l o d su s e di 1 1w h i c ha r eo n d e m a l l d s c h e d u l i l l g , o n d e m a n db a c i 抵l ( i n g ,o n d e m a i l de x p 砒l s i o 玛e t c a u t o m a t e dt e s tg e n e 阳t i o no f s e c u r i t ) rd e f e c t si si n t e 巾r o c e d u r a la n dd e m a n d 一“v e nm e t h o ds h o u l dg r e a u y m i t i g a t et 1 1 ep a t he x p l o s i o np r o b l e m 3 d e s i g na n dp r o t o t y p e 曲p l e m e n t a t i o no fad e m a l l d d 矗v e na u t o m a t i ed e 诧c t d e t e c t i o ns y s t e m ad e m a r l d d r i v e na m o m a t i cd e f e c td e t e c t i o n p r o t o t y p es y s t e mh a sb e e n i i l l p l e m e n t e d t h es y s t e mi s b a s e do nm ep h o e l l i x c o m p i l e r 丘锄e w o r k ,g c c c o m p i l e ra i l d z 3s o l v e r i i l a d d i t i o i l t l l e s y s t e m h a l sb e e n d e s i g l l e d a sa c r o s s - p l a t f _ 0 r r ns c a l a b l ea n 甜y s i s 觑l i l l e w o r k ,w m c hc a i la n a l y z et l l es o u r c ec o d e so n a b s 仃a c t b o t hw m d o w sp l a t f o ma i l dl i r n p l a t f o m t h ep r o t o t ) ,p es y s t 锄l 碰i b e e nu s e dt 0 c h e c ks o m eo p e ns o u r c es o f t w a r e s t h es e v e r a l l p u b l i c i z e ds e c u r i 哆d e f e c t s a r e v e r i f i e d u n d e rt l l eg u i d a l l c eo ft 1 1 ep a t c h 血f 0 m a t i o n ,i t 血d s 眦p u b l i c i z e d e x e c u t i o np a 血sa 1 1 di n p u t sw t l i c hc a l l t r i g g e r l e d e f e c t i v es t a t e m e l l t s a g a i n b y p a s s i n gt l l ep a t c h 蚴e m e d t s i ts h o w st 1 1 ef e a l s i b i l 时a n de 能c t i v e n e s so ft 1 1 e d e m a n d 埘v e na u t o m a t e dt e s tg e n e r a t i o n k e yw b r d s :a u t o m a t e dt e s tg e n e r a :t i o n ,s o 凤哪ed e td e t e c t i o 玛d e m a n d - 嘶v 呱 s y l l l b o l i ce x e c u t i o n ,w i l i t e - b o xt e s t i r 培 图目录 图目录 图1 1 论文结构5 图2 1 缓冲区溢出前后的内存映像8 图2 2 用i d a 查看c o n f j i 加- f i l e 函数的流程块图1 6 图2 3 用i d a 查看c o n f - f i n q - f 订e 函数的反汇编码1 6 图2 4 用i d a 查看e t e 珈引用的库l7 图2 5 漏洞的触发流程图1 8 图2 6 在o x 0 8 0 4 8 4 6 0 处下断点。2 4 图2 7 程序执行到o x 4 0 0 a 4 a 7 3 时的栈空间。2 5 图2 8 断点o x 4 0 0 a 4 a c 8 之后的语句块。2 6 图2 91 i b a s t o 5 库的b s s 段。3 1 图2 1 0 用i d a 查看l i b a s t 一0 5 库的段空间分布3 7 图2 1 1 精心构造的配置文件名字c o n f - n 锄e 的结构4 0 图2 1 2n 锄e 变量溢出时的内存映像4 4 图2 1 3 用g d b 调试时弹出的e t e 瑚窗口4 6 图3 1 被测程序模块的控制流图5 0 图3 2 路径覆盖策略的包含关系5 3 图4 1 软件缺陷的b 点和p 点6 0 图4 2 基于补丁信息的自动生成软件缺陷输入方法6 2 图4 3 在c g 图上查找路径的算法6 3 图4 4 一个c g 示意图6 4 图4 5 符号执行算法6 6 图4 6c 语言示例代码6 9 图4 7d b t g 算法7 1 图4 8 过程内分析算法7 3 图4 9 回溯算法7 5 图4 1 0 展开算法7 6 图5 1 系统框架流程图7 9 图5 2c 2 s i 眦1 a t o r 模块的功能7 9 图5 3c 2 s i 加u l a t o r 模块的算法流程8 0 图5 4c 2 s i 肌l a t o r 模块的接口8 0 图5 5g c c 2 p h x 模块的功能8 2 图5 6g c c 2 p h x 模块的前端8 2 图5 7g c c 2 p h x 模块的后端8 3 图5 8 缺陷检测模块的功能8 5 图5 9 缺陷检测模块的调度器算法流程图8 7 图5 1 0 缺陷检测模块的执行器算法流程图。8 8 图5 1 1 缺陷检测模块的调度器和执行器之间接口9 0 图5 1 2 结果显示模块的界面9 1 图5 1 3m a il u t i ls 一0 6 9 0 的c g 图片段。9 2 图5 1 4 一个依赖于函数参数的缺陷9 2 v 表目录 表目录 表5 1o p e n s s l 程序的测试结果9 3 v 论文原创性和授权使用声明 本人声明所呈交的学位论文,是本人在导师指导下进行研究工 作所取得的成果。除已特别加以标注和致谢的地方外,论文中不包 含任何他人已经发表或撰写过的研究成果。与我一同工作的同志对 本研究所做的贡献均已在论文中作了明确的说明。 本人授权中国科学技术大学拥有学位论文的部分使用权,即: 学校有权按有关规定向国家有关部门或机构送交论文的复印件和电 子版,允许论文被查阅和借阅,可以将学位论文编入有关数据库进 行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论 文。 保密的学位论文在解密后也遵守此规定。 作者签名:衽跳 砰月日 第l 章绪论 1 1 研究背景 第1 章绪论 随着现代化网络信息系统的发展,以软件系统为核心的计算机应用已经渗 透到各行各业,在工业、农业、国防和人们的日常生活中起着越来越重要的作 用。随着软件系统的日益多样化、复杂化和大规模化,人们对软件的质量的重 视程度越来越高。作为软件质量保证的重要手段,软件测试在这方面发挥着其 他方法不可替代的作用。 一般意义上,软件测试是为了发现错误而执行程序的过程。其中,设计和 生成有效的测试数据是决定软件测试质量的重要因素之一 1 。测试数据生成可 以被理解为一个抽样过程,即根据相应的测试覆盖标准,采用一定的方法,在 测试数据全集中进行抽样,选取出一批错误敏感( f a u l t s e n s i t i v e ) 的测试数 据,他们具有较高的发现软件错误的可能性。一个有效的测试数据生成方法可 以生成高质量的测试数据,并尽可能降低测试数据的总数,从而降低软件开发 成本。 目前工业界主要靠人工测试( m a n u a lt e s t i n g ) 来提高软件可靠性。实现 自动测试是测试技术的梦想之一 2 。软件自动测试技术,主要分为测试自动化 脚本技术和测试数据自动生成技术等。 测试过程中,有大量的测试行为可以被自动化,测试人员希望能够指定一 些简单的脚本,通过这些脚本信息能够指导测试的自动化进行。t t c n 一3 3 是标 准化的测试行为描述语言,目前已广泛应用在协议测试中,开始在软件测试和 w e b 测试中应用,基本上解决了测试行为自动化的描述问题 4 。 测试数据自动生成可以节省测试时间,降低测试成本,多年来人们已对他 进行了广泛而深入的研究,取得了许多研究成果。但是在深入测试实践中,如 何生成高质量的测试数据,仍然面临诸多困难。 按照被测系统( s y s t e mu n d e rt e s t ) 的内部特性是否对测试人员公开,可 以将测试技术分为黑盒测试( b 1 a c k b o xt e s t i n g ) 和白盒测试( w h i t e b o x t e s t i n g ) 。 黑盒测试即把被测对象看成一个黑盒子,不考虑程序内部的逻辑结构和内 部特性,主要在软件的接口处进行测试,仅从输入输出来判定系统的功能。因 第1 章绪论 此又被称为功能测试或基于规约的测试。在黑盒测试中,由于实际的软件开发 通常缺乏形式化规格说明,测试数据生成一般依赖于人工选择;如果有形式化 规格说明,如u m l 图,则可以从形式化规格自动生成测试数据 5 。 白盒测试把被测对象看成一个打开的盒子,程序内部的逻辑结构和其他信 息对测试人员都是公开的,考虑到系统的实现方式,包括编程风格、控制方法、 源代码等,所以又被称为“结构测试 或是“基于代码的测试”。在白盒测试中, 得益于程序分析与自动约束求解技术的不断发展和现代计算机日益增强的计算 能力,自动测试生成技术又焕发出新的活动 6 ,7 。 1 2 研究现状 本文所研究的测试数据自动生成技术,属于白盒测试的范畴,即测试对象 是有源代码的,但是出于历史等原因,并没有形式化的规格说明。 随着软件安全问题的日益严重,各种白盒测试方法也相继出现。h u a n g 提 出程序插装( p r o g r 锄i n s t r u m e n t a t i o n ) 概念,在保持被测程序原有逻辑完整性 的基础上,插入“探测仪 ,以便获取程序的控制流及数据流信息,并可得到测 试的覆盖率 8 。r o b e r t 、j 锄e s 、c 1 a r k e 等人把符号执行技术引入软件测试领 域,建立了e f f i g y 符号测试系统 9 ,1 0 。h o w d e n 对路径测试进行了深入的分 析,提出了系统功能测试和代数测试等概念 1 1 。o s t e r w e i l 和f o s d i c k 等人 首先引入了数据流测试方法,该方法通过对数据流的静态测试找出程序中潜藏 的错误。后来h o s o y a 等人在数据流测试方法中加入了变量值域分析,使数据流 方法检测的错误类型更多。r a p p s 和w e y u k e r 提出了数据流测试准则家族 1 2 , 弥补了分支测试和全路径测试之间的差别。 在软件测试过程中,如何精选少量的测试数据,对软件系统进行有效的测 试,是软件测试研究的关键问题。作为人工测试的重要补充,测试数据自动生 成技术可以极大的提高软件测试的效率,因而是软件测试的研究热点之一。 随机测试 1 3 1 6 是随机的产生大量的测试输入。其优点是生成效率高,可 扩展性好。其缺点,一是产生大量的冗余测试输入,即多个测试输入在测试对 象中的执行路径是相同的;二是覆盖率低,发现软件缺陷的概率极其小 1 4 。 虽然符号执行技术在软件测试中的应用,最早于1 9 7 5 年就提出来了 9 ,1 0 , 1 7 ,但受限于当时的计算机计算能力和应用,并没有产生大的影响。2 0 0 0 年 以后,随着现代计算机的计算能力日益强大,符号执行技术开始在自动测试生 成领域广泛应用 1 8 2 4 ,以解决人工测试和随机测试的局限性。在符号执行 中,具体输入被替换成符号输入:赋值语句的执行,会升级程序状态;分支语 2 第l 章绪论 句的执行,会产生一个基于符号输入的约束;最后,将所有的符号约束联立起 来进行求解,得出具体输入,该输入一定和符号输入执行的是同样的路径。不 同的符号执行会生成不同的输入,这些输入绝不会冗余;同时,可以对程序的 每个执行路径进行符号执行,生成测试输入,从而提高覆盖率。但是,纯粹的 符号执行,可扩展性不强。对于大的或者是复杂的程序,处理和求解约束信息, 计算上很难处理。 2 0 0 5 年,贝尔实验室的p a t r i c eg o d e f r o i d 和斯坦福大学的d a w s o ne n 9 1 e r , 分别独立提出了符号执行和具体执行相结合的方法 2 5 ,2 6 ,又称为c o n c o l i c t e s t i n g 【2 7 】。只要一个操作的右值有一个是符号的,就进行符号执行;否则, 进行具体执行。具体执行的引入,可以简化约束,弥补约束求解器能力的不足。 但其可扩展性仍然不强,难以解决路径爆炸问题。因此,解决自动c o n c 0 1 i c t e s t i n g 的可扩展性问题,变成学术界的研究热点之一 2 8 3 4 】。 p a t r i c eg o d e f r o i d 和r u p a km a j u m d a r 等人,还提出了基于语法的自动生 成复杂数据结构输入的方法 3 5 ,3 6 ,力求解决被测系统是编译器等具有复杂 语法输入的程序时覆盖率低的问题。另外,针对复杂程序的自动测试生成方法 的研究,如针对数据库 3 7 、防火墙 3 8 、w e b 程序 3 9 ,4 0 、g u i 程序 4 1 、 多线程程序 4 2 ,4 3 、t t c n 一3 测试脚本 4 等,也开始出现。 国内,张健等人较早进行了路径测试方面的研究 7 ,2 2 ,2 3 ,4 4 4 7 ,先 后开发了s i m c 符号执行器、b o n u s 约束求解器等工具,对具有丰富数据类型的 程序的符号执行技术进行了深入的研究。 综上所述,虽然自动测试生成技术近年来有了长足发展,但是仍然面临着 诸多问题,主要表现在两个方面: 测试策略的盲目性。目前的测试策略,大多基于某种形式的覆盖率, 如路径覆盖、语句覆盖等,这就决定测试时会采用深度搜索或者广度 搜索的遍历方法,导致查找缺陷速度慢,效率低。 测试生成时的路径爆炸问题。路径爆炸问题,一直影响着自动测试生 成技术在工业界的大规模应用。路径爆炸问题,指的是测试路径数随 着程序分支的增加呈指数增加。这样,当程序比较大或者比较复杂时, 测试覆盖率会非常低,发现软件安全缺陷的概率就更低了。因此,目 前的自动测试生成技术,主要是针对单元测试。 1 3 研究内容与贡献 本文在广泛调研的基础上,结合软件安全缺陷的手工分析经验,通过对需 3 第1 章绪论 求驱动的自动测试生成技术的研究,一定程度上解决了自动测试生成技术所面 临的困难,并将自动测试生成技术的应用范围从单元测试,拓展到跨过程的测 试,即考虑函数间的情况。本文的研究,不追求程序覆盖率的提高,而是将自 动测试生成方法与软件安全缺陷和补丁特征相结合,自动生成触发软件安全缺 陷的输入。 具体来说,本文的研究内容主要有: 1 软件安全缺陷的手工分析 自动测试生成方法的研究,离不开对安全缺陷的手工分析时积累的大量宝 贵经验。在手工分析安全缺陷的基础上,研究了缺陷模式的表示方法,并以一 个例子详细介绍了安全缺陷的手工分析方法。 2 需求驱动的软件安全缺陷自动测试生成方法 目标是自动产生能够触发安全缺陷的测试输入。与普通的测试策略相比, 这里并不一味地追求覆盖率,其测试策略是需求驱动的。通过分析补丁信息和 缺陷模式,确定需要覆盖的缺陷语句或路径,然后再通过正向的按需符号执行 或者是逆向的按需回溯的方法,排除误报,生成触发安全缺陷的输入。需求驱 动体现在两个方面,一方面,测试策略是需求驱动的,即只覆盖存疑的安全缺 陷语句或路径;另一方面,测试生成是需求驱动的,即在测试生成时执行尽量 少的路径,采用的方法主要有按需调度、按需回溯、按需展开等。安全缺陷的 自动测试生成,是跨过程的,需求驱动方法的引入,使测试策略更有针对性, 大大减轻了路径爆炸问题的影响。 3 需求驱动的安全缺陷自动检测系统设计与原型实现 安全缺陷自动检测,是信息安全领域的核心问题。通过对安全缺陷进行充 分的手工分析,以及对需求驱动的软件安全缺陷自动测试生成方法的深入研究, 本文提出了一种需求驱动的安全缺陷自动检测系统,并已完成设计和原型实现。 技术方案采用m i c r o s o f t 的下一代编译器架构p h o e n i x ,其扩展性很强,可以 插件的形式调用p h o e n i x 支持库对高级语言编译器前端产生的代码中间表示进 行分析、优化和测试。在实际编程和试验之后,发现只在p h o e n i x 编译器架构 中开发插件,对分析算法的实现有很多功能限制,因此在详细研究了p h o e n i x 内部机制后,从底层重构了p h o e n i x 编译器部分功能,有力地支持了上层高级 分析算法的实现。约束求解器采用m i c r o s o f t 的z 3 ,用来判断路径可行性和计 算触发缺陷的输入。另外,系统还被设计成一个跨平台可扩展分析框架,经过 进一步扩展,可以分析l i n u x 平台代码。原型系统已被用于对若干开源软件的 缺陷检测,验证了一批己公开安全缺陷。在补丁信息的指引下,找到了未公开 的绕过补丁修补位置再次触发缺陷的可执行路径及输入。验证了需求驱动的自 4 第1 章绪论 动测试生成方法的可行性和有效性。 本文的主要贡献有: 1 研究了用一阶逻辑布尔值断言来表示安全缺陷模式的方法,并以一个例 子详细总结了安全缺陷的手工分析方法。 2 提出了需求驱动的白盒测试策略,即并不一味地追求覆盖率,而是只覆 盖存疑的缺陷语句或路径,力争找到能够触发安全缺陷的输入。确定测试需求 的方法主要有补丁信息和缺陷模式。通过分析补丁,可以直接得到安全缺陷的 修补语句和缺陷语句,测试时需要生成绕过缺陷修补语句的通达缺陷语句的执 行路径。根据缺陷模式进行过程内分析,可确定含有大量误报的存疑缺陷语句, 测试时需要覆盖这些语句,剪除误报,找到真正的缺陷。 3 提出了需求驱动的自动测试生成方法,即在测试生成时尽量执行少的语 句或路径。对于确定的缺陷语句,。如补丁信息确定的缺陷语句,可采用按需调 度的方法。对于含有大量误报的存疑缺陷语句,参照逆向分析的手工分析方法, 提出了按需回溯的自动测试生成方法。 4 提出了一种需求驱动的安全缺陷自动检测系统,并完成设计与原型实现。 系统基于p h o e n i x 编译器框架、g c c 编译器框架和z 3 约束求解器,可同时支持 w i n d o w s 平台和l i n u x 平台源代码的安全检测,具有良好的扩展性。 1 4 论文结构 本文的结构如图1 1 所示。 图1 1 论文结构 5 第l 章绪论 第1 章阐述自动测试生成技术的研究背景和研究现状,提出本文的研究内 容和主要贡献,最后给出论文的章节安排。 第2 章介绍了常见的安全缺陷及其发掘方法,给出了一种缺陷模式的描述 方法,并以示例的形式,详细介绍了安全缺陷的手工分析方法。 第3 章首先说明实现全路径覆盖的困难,然后介绍基于路径分析的白盒测 试策略,最后介绍基于符号执行的自动测试生成方法。 第4 章首先提出需求驱动的白盒测试策略,在此基础上,提出两种需求驱 动的自动测试生成方法,一种是补丁信息指导的,另一种是按需回溯的。 第5 章介绍了需求驱动的缺陷自动检测系统的设计和原型实现,给出实验 结果,并加以分析。 第6 章对全文的主要工作内容和贡献进行总结,并指出未来的研究方向和 研究问题。 6 第2 章软件安全缺陷 第2 章软件安全缺陷 安全缺陷的自动测试,离不开对安全缺陷的手工分析时积累的大量宝贵经 验。本章介绍了常见的安全缺陷和缺陷发掘方法,给出了一种缺陷模式的描述 方法,并以示例的形式,详细介绍了安全缺陷的手工分析方法。 在当今计算机产业中,各类软件的安全性成为计算机信息系统安全性的重 要保证。软件中潜在的缺陷可能产生错误的结果或促使各种意外行为的发生, 且能够为各种攻击提供了便利的渠道,从而将导致重大的损失。因此,研究软 件中存在的缺陷有利于提高软件产品的质量,从而保障系统的安全性。 软件中的缺陷一般都是由人为的因素造成的,可能是在软件的设计上就存 在有缺陷,也可能是程序员在编写程序时的疏忽导致了缺陷潜藏在程序中。一 些未能预见的与用户或系统组件的相互影响作用,也可能导致软件系统缺陷的 存在。软件缺陷,可能是功能方面的,可能是性能方面的,还有可能是安全方 面的。本文研究的是软件的安全方面的缺陷,即软件安全缺陷,其中比较严重 的安全缺陷,又叫做漏洞,它可以为攻击者所利用,用来进行权限提升等恶意 活动。 2 1 常见的软件安全缺陷 对于任何平台下的任何一个程序,都可能有存在安全缺陷的可能。缺陷种 类繁多,各种缺陷导致的后果也不尽相同。要罗列已知的各类程序缺陷是一件 相当困难的事情,本节介绍常见的三种缺陷类型,以便于缺陷模式的表述。 2 1 1 缓冲区溢出 缓冲区溢出是最常见的安全缺陷类型,包括栈溢出 4 8 、堆未初始化数据 段溢出 4 9 等,广义的还包括格式化字符串漏洞 5 0 等。当一个执行程序试图 在己申请的固定长度的缓冲区的边界以外存储数据时,将导致写在缓冲区边界 以外的数据重写了临近的存储单元,这就是缓冲区溢出。 例如下面这段程序, v o i ds u b 缸1 ( c h a r )n m a i l l ( na 唱c ,c h a r 鹕v ) c h a ra 【4 】; i f ( a 唱c ! = 2 ) r e t 啪1 ; s 仃p y ( 如b ) ;s u b 如n ( 孵v 【1 】) ; p r i n 仃( “s ”,a ) ; r e t l 肺0 ; ) 7 第2 章软件安全缺陷 整个程序由函数m a i n 和函数s u b f u n 组成,其中函数s u b f u n 的输入为字符 串b 。在当输入b 达到9 个或9 个以上的字符( 系统为d e b i a n2 4 1 8 ) 时,就 会出现“s e g m e n t a t i o nf a u l t ”错误。用g d b 调试,当输入是“a a a a a a a a 时, 执行语句“s 仃c p y ( 如) ; 前后的栈空间的内存映像如图2 1 所示。 内存高址 0 x b 踟c c o x b f l j f f d c 8 o x b 筒d “ o ) 【b f f f f d c 0 内存低址 0 ) ( o o o 0 0 0 0 l o x 4 0 0 3 0 e 3 6 o x b 镯自f d b 8 o x b f 箭b 2 4 0 ) 【4 0 0 1 6 5 4 0 r e t e b p a 4 】 e s p 内存高址 0 x b f 葡f d c c 0 x b f 搿d c 8 o x b 筒d “ 0 x b f 掰d c o 内存低址 o x o o o o 0 0 0i o x 4 0 0 3 0 e o o o x 6 1 6 1 6 1 6 l o x 6 1 6 1 6 1 6 1 o x b f 衄c 4 溢出前溢出后 图2 1 缓冲区溢出前后的内存映像 r e t e b p a 4 】 e s p 函数s u b f u n 中定义了一个数组a ,其在栈上分配了4 个字节的空间,其上 的高址空间存储的分别是e b p ( 上一栈帧的栈底地址) 和r e t ( 返回地址) 。当 输入超过4 个字节时,例如字符串“a a a a a a a a ”,共计9 个字节( 字符串末尾还 有个0 ) ,覆盖完数组a 的四个字节后,e b p 的四个字节以及r e t 的第一个 字节也会被覆盖掉。 值得一提的是,缓冲区溢出有时并不会报错。例如上面这段程序,当输入 字符串为4 。8 个字节时,虽然会导致溢出,覆盖掉e b p 的内容,但一般不会报 错;当输入字符串达到9 个字符以上时,除了覆盖e b p 的内容,还覆盖掉了r e t 的内容,才会出现“s e g m e n t a t i o nf a u l t ”错误。由此可见,缓冲区溢出具有 一定的隐蔽性,黑盒测试或者运行时检测等测试方法,有时很难发现此类错误; 只有依靠白盒测试方法,才能比较彻底地发现此类漏洞,根除不可预期的隐患。 2 1 2 运算溢出 运算溢出通常发生在表达式计算中,指的是运算得到的结果超过了一个给 定的寄存器或存储单元所能存储的范围。运算溢出不仅使该存储单元对应的变 量的值出错,而且还可能将溢出的部分存放在其他未知的存储单元中。例如, 在作除法运算时,没有检查除数的值,若该除数可能取值为0 时,则会产生除 o 错误,将导致整数溢出或浮点数溢出。 还有,指针的解引用运算,也会经常出现问题。当一个指针的值为n u l l ( 未 指向某个地址空间) 时,对其的解引用将导致段错误等问题。当使用指针时, 8 第2 章软件安全缺陷 很经常地会出现段错误,大都是因为没有对可能取值n u l l 的指针进行检查导致 的。这种情况虽然简单,但是对于编程者来说,往往没有考虑到程序的所有可 能情况,加之要兼顾程序的执行效率,很容易出现这样的问题代码。还有很多 的存量c c + + 代码,由于编写年代较早,测试不充分,很容易隐藏此类问题。 如下这段代码中,由于对运算的操作数没有做检查,当入口参数a 为0 时, 语句“t = 3 a : 会导致除0 错误;当入口参数b 为n u l l 时,语句“木b a ” 会导致空指针引用。 i n tf u l l ( i n ta ,i n t 柚) i n tt : t = 3 a : i f ( 丰b a ) ) r e t u r n1 : 这些漏洞都具有较强的隐蔽性。可能在正常的调用函数f u n 时,实参不会 是o 或n u l l ,因此漏洞被掩盖。在特殊情况下,此问题就会导致程序崩溃。还 有,在程序修改时,另外一个开发人员在添加对函数f u n 的调用代码时,由于 对函数f u n 的内部实现不了解,函数f u n 的注释又不规范,导致并没有确保调 用实参一定不为0 或n u l l ,从而留下了严重隐患。 2 1 3 资源泄漏 资源泄漏,指的是对程序中不再使用的资源没有释放,使得这些资源不能 够被重新使用。这里的资源主要是内存资源、文件、套接字等。而由于这些资 源都是有限的,当泄露的资源足够多时就将导致内存及程序发生意外的行为。 例如如下程序中, i n ts u b f u n ( ) i n tm a i n ( i n ta r g c ,c h a r 术木a r g v ) d o u b l e _ c h e a p m e m : d o u b l ek : h e a p m e m = m a l l o c ( 1 0 0 0 ) :f o r ( k = 0 :k 0 f r e e f l a g ( m e m ) = = f a l s ec o u n t ( m e m ) 一o f r e e f l a g ( m e m ) = = t r u e 。如果在程序的某个执行状态,已经没有指针指向 该块空间,即c o u n t ( m e m ) = 0 ,而其又没有被释放,即f r e e f l a g ( m e m ) = f a l s e , 则就会产生内存泄漏;如果在程序的某个执行状态,还有指针指向该块空间, 即c o u n t ( m e m ) o ,但是其已经被释放,即f r e e f l a g ( m e m ) = t r u e ,则会产生 空指针引用错误。系统分析时要跟踪指向资源的指针数量,由于牵涉到指针的 别名分析 5 8 ,5 9 ,缺陷查找比较复杂。 2 3 漏洞的手工分析方法 对漏洞的研究,可以从漏洞的基本信息、机理分析、发现思路、利用价值、 研究环境搭建、溢出点定位、程序执行流程分析、程序执行内存空间分析、漏 洞利用技术分析、漏洞利用程序编写、漏洞利用程序测试、测试结果分析、漏 洞调试方法等方面着手。 下面以“e t e r ml i b a s t 库本地缓冲区溢出漏洞 6 0 为例,介绍安全缺陷 的分析方法。 2 3 1 漏洞的基本信息 1 2 第2 章软件安全缺陷 b u g 眦oi d :1 6 3 5 0 受影响系统: l i b a s tl i b a s t0 6 1 l i b a s tl i b a s t0 6 l i b a s tl i b a s to 5 l i b a s tl i b a s t0 4 2 3 2 漏洞的机理分析 l i b a s t ( l i b 删呵o fa s s o n e ds p i 毋n 血g s ) 是一款设计用于e t e r n l 的库。 e t e n nl i b a s t 库不充分过滤用户提交的参数,本地攻击者可以利用漏洞进行缓 冲区溢出攻击,可提升至u 恤p 用户权限。e t e 肌由于对x t 选项所提供的文件名 缺少正确检查,提交超长文件名可导致缓冲区溢出,精心构建提交数据可能获 得咖用户权限。 问题出在c o 垣f m d f i l e 函数,它在进行s 仃c a t 等字符串操作时,并没有进 行长度检查。通过分析1 i b a s t 0 5 的源码,可以定位出错的语句: f i l e 即指向输入的超长文件名,n a m e 是一个s 诅t i c 变量,曲是不为m 几l 的,在执行语句“s 仃c a t ( n a m e ,f i l e ) 时,没有对6 1 e 字符串长度进行检查,导 致了溢出的发生。 1 3 第2 章软件安全缺陷 2 3 3 漏洞的利用价值 该漏洞的利用价值在于:首先这是一个本地溢出漏洞,可以用来提升权限; 其次,这个漏洞是发生在s o 库里的,而且是b s s 段溢出,而非普通的栈溢出, 利用比较困难,具有极高的挑战性和研究价值;再次,e t e m l 是一个图形化程序, 在l i l l u x 环境下对图形化程序的调试分析和普通的命令行程序还有所区别,值 得研究。 2 3 4 漏洞研究平台环境的搭建 根据漏洞的描述信息,选取r e d l l a t8 o 作为操作系统平台,其他应用软件版 本分别是e t e m 0 9 2 1 、l i b a l s t o 5 2 等。安装操作系统r e d l l a t8 o 时,要选择安 装基本的编程调试软件包,如g c c 、g d b 等。 在首次安装e t e 锄一o 9 2 1 时,系统会提示还需要其他软件包,如下所示: 【州 r e d h a :t 8e t e 皿】拌巾m - i v he t e 胁0 9 2 - 1 i 3 8 6 r p 忸 w 锄i n g :e t e 皿一o 9 2 - 1 i 38 6 r p m :v 3d s as i 印a t u 他:n o k e yk e yi db 8 6 9 3 亿c e n 0 r :f a i l e dd e p e n d e n c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 23904-2025无损检测超声表面波检测方法
- 2025年虚拟现实技术职业资格考试卷及答案
- 2025年物理学专业毕业生考试题及答案
- 2025年特殊教育与脑科学考试试题及答案
- 2025年首次创业培训考试题及答案
- 2025年社区服务管理考试试卷及答案
- 2025年诠释学研究考试试卷及答案的归纳
- 2025年企业社会责任管理考试卷及答案的反馈
- 2025年法律风险防范与管理考试试题及答案
- 2025年公共基础知识考试试卷及答案解析
- 2025届高三语文最后一课
- 创新创业创造:职场竞争力密钥智慧树知到期末考试答案章节答案2024年上海对外经贸大学
- 奇妙的易拉罐(幼儿园课件)
- 机电安装支吊架施工方案
- 回弹法检测混凝土强度计算表(自动计算)
- 少儿编程scratch3.0安装使用说明文档
- 行业标准:GB∕T 9254.2-2021 信息技术设备、多媒体设备和接收机 电磁兼容 第2部分:抗扰度要求
- 小班音乐游戏《会跳舞的跳跳糖》原版有声动态PPT课件
- 羽毛球课教学大纲
- YORK(约克)-多联式空调-安装、操作和维护手册
- 装修工程承包合同中英文
评论
0/150
提交评论