




已阅读5页,还剩64页未读, 继续免费阅读
(计算机软件与理论专业论文)二进制代码安全性分析.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 捅要 代码安全在计算机系统中占有重要的地位,针对软件源代码进行安全性分析 的工具和方法大量出现,对加强软件的代码安全起到了很好的作用。然而大量使 用的商业软件是以二进制代码形式存在的,这使得以源代码为分析对象的软件代 码安全分析技术无能为力。二进制代码作为软件的最终表现形式,在现阶段也是 很多软件的唯一表现形式。研究针对二进制代码进行安全性分析的方法和技术是 有意义的。 源代码安全性分析以静态分析为主,而二进制代码安全性分析以动态分析为 主。本文比较全面地分析了以二进制代码为分析对象的代码安全性分析技术面临 的挑战和迎接这些挑战所做的努力和可行的技术方法,介绍了p i n 和v a l 鲥n d 所 使用的二进制动态插装的动态分析技术以及b i t b l a z e 采用的动态f u z z i n g 技术, 着重分析了动态f u z z i n g 技术的不足。在实验的基础上总结了常见的语义结构及 漏洞模式在二进制代码上的表现形式,将动态符号执行技术用于二进制代码安全 性分析,验证其可行性以及与动态f u z z i n g 技术的对比。 二进制代码分析具有很大的困难,常见的漏洞模式在二进制代码上的表现形 式难以确定,尤其是难以精确判断栈上缓冲区的边界;二进制代码提升过程中一 些指令无法解析,甚至会出现跳转地址不合法之类的结构性的错误,使得后续的 分析精确性降低。 本文实现了一个动念符号执行的二进制代码安全性分析的原型工具b a t s ,实 验结果表明将动态分析和符号执行技术结合起束对二进制代码进行安全性分析 是可行的,在符号执行时对潜在漏洞进行充分分析的前提下,可以防止动念 f u z z i n g 技术由于测试不充分造成的漏报。 关键词:二进制分析,符号执行,代码安全,软件安全 a b s t r a c t c o d es e c u r i t yp l a y sav e r yi m p o r t a n tr o l ei nt h es e c u r i t yo fc o m p u t e rs y s t e m s n o w a d a y s ,t h e r ea r em a n ya n a l y s i st e c h n o l o g i e sa n dm e t h o d sb a s e do nt h es o u r c e c o d e sw h i c hh a v ed o n ew e l lt oe n h a n c et h es o f t w a r ec o d es e c u r i t y b u tt h e r ea re m a n yb u s i n e s s s o f t w a r e w h o s es o u r c ec o d e sa r ec l o s e d s o u r c ec o d ea n a l y s i s t e c h n o l o g i e sl o s ei t sp o w e ru n d e r t h i ss i t u a t i o n t h ef a c tt h a tt h eb i n a r yc o d em a yb e t h eo n l ya v a i l a b l ef o r m a to ft h es o f t w a r em a k e st h ea n a l y s i st e c h n o l o g yb a s e do n b i n a r yc o d em o r ei m p o r t a n t n o w a d a y s ,t h es o u r c e c o d ea n a l y s i st e c h n o l o g i e sp u tt h ee m p h a s e so ns t a t i c a n a l y s i sw h i l et h eb i n a r yc o d ea n a l y s i st e c h n o l o g i e sp u tt h ed y n a m i ca n a l y s i s i na m o r ei m p o r t a n tp o s i t i o n w ei n t r o d u c e dt h ec h a l l e n g e si nf r o n to ft h eb i n a r yc o d e a n a l y s i sa n dt h ea c c o r d i n gt e c h n o l o g i e sa g a i n s tt h ec h a l l e n g e s p o p u l a r t o o l ss u c ha s p i n ,b i t b l a z ea n dv a l g d n da n dt h ea n a l y s i st e c h n o l o g i e st h e ya d o p t e da r e a l s o i n t r o d u c e d w ea l s oi n t r o d u c e dt h er e p r e s e n t a t i o no fh i g h l e v e ls e m a n t i cs t r u c t u r e s u c ha sb u f f e r s ,p o i n t e r se ta la n dp o p u l a rb u gp a t t e r n si nb i n a r yc o d e an e w t e c h n o l o g yu s i n gs y m b o l i ce x e c u t i o nw i t hc o n s t r a i n t ss o l v i n g w h i c hi sp o p u l a r l yu s e d i ns o u r c ec o d ea n a l y s i sw a sp r o p o s e dt oa n a l y s i sb i n a r yc o d e si nt h i sp a p e rb a s e do n t h ea n a l y s i sf l a w so fp o p u l a rt e c h n o l o g i e ss u c ha sd y n a m i ca n dd y n a m i cf u z z i n gi n b i n a r yc o d es e c u r i t ya n a l y s i s b i n a r yc o d ea n a l y s i sf o rs e c u r i t yh a sm a n yp r o b l e m s t h e r e i sd if f i c u l t yi n d e d u c i n gt h er e p r e s e n t a t i o no fb u gp a t t e r n si nb i n a r yc o d e ,e s p e c i a l l yt h ea c c u r a t e s i z eo ft h eb u f f e ri ns t a c k t h el o o s eo fp r e c i s i o ni nt h el i f to ft h ec o d ep r e v e n t st h e a c c u r a t ea n a l y s i s ap r o t o t y p et o o ln a m e db a t s ( b i n a r ya n a l y s i s t o o lf o r s e c u r i t y ) w a s i m p l e m e n t e du s i n gd y n a m i cs y m b o l i ca n a l y s i st e c h n o l o g y t h e r e s u l t so fe x p e r i m e n t s s u g g e s tt h a t i t sp r a c t i c a lt oc o m b i n ed y n a m i ca n a l y s i sa n ds y m b o l i ce x e c u t i o n t e c h n o l o g yf o rb i n a r yc o d ea n a l y s i s t h ea d o p t i o no fs y m b o l i ce x e c u t i o ni nb i n a r y c o d ea n a l y s i si su s e f u lt or e d u c et h er a t eo ff a l s en e g a t i v e so f t h ed y n a m i cf u z z i n g k e y w o r d :b i n a r yc o d ea n a l y s i s ,s y m b o l i ce x e c u t i o n ,c o d es e c u r i t y , s o f t w a r e s e c u r i t y 图目录 图目录 图2 1 :r o s e 源代码分析与二进制分析架构1 2 图2 2 :v e xi r 基本块i r s b 12 图2 3 :二进制上的超级基本块1 4 图2 4 :v a l g r i n d 动态插装架构1 5 图2 5 :p i n 动态插装架构一1 6 图2 6 :t e 删架构图l7 图2 7 :v i n e 架构图18 图2 8 :r u d d e r 架构图18 图3 1 :二进制代码栈上缓冲区表示形式2 2 图3 2 :v i n ei r 示例2 4 图3 3 :b a t s 架构及模块划分2 6 图3 4 :b a t s 静态分析模块一2 6 图3 5 :b a t s 分析流程图2 7 图3 6 :动态f u z z i n g 造成的漏报2 9 图3 7 :函数运行时栈帧结构示意图3 l 图3 8 :p r i n t f 函数凋川时栈结构示意图3 3 图3 9 :格式化字符串缺陷识别3 4 图3 1 0 :指针在_ 二进制代码中的表现形式3 6 图3 1 l :p lt 1 ,示例3 7 图3 1 2 :b a t s 符号执行器模块组成及交互3 9 图4 1t 格式化字符串漏洞示例4 6 图4 2 :系统初始化示例4 6 图4 3 :格式化字符串漏洞分析结果4 7 图4 4 :除0 错误的检测结果4 7 图4 5 :堆栈溢山实验源代码4 8 图4 6 :堆栈溢出实验结果4 9 图4 7 :b it b la z e 除0 错误检测流程4 9 图4 8 :b it b l a z e 堆栈溢出检测流程5 0 v 中国科学技术大学学位论文原创性声明 本人声明所呈交的学位论文,是本人在导师指导下进行研究工作所取得的成 果。除已特别加以标注和致谢的地方外,论文中不包含任何他人已经发表或撰写 过的研究成果。与我一同工作的同志对本研究所做的贡献均已在论文中作了明确 的说明。 作者签名:鸯篁鱼窆签字日期:超么竺:鲨 中国科学技术大学学位论文授权使用声明 作为申请学位的条件之一,学位论文著作权拥有者授权中国科学技术大学拥 有学位论文的部分使用权,即:学校有权按有关规定向国家有关部门或机构送交 论文的复印件和电子版,允许论文被查阅和借阅,可以将学位论文编入有关数据 库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。本人 提交的电子文档的内容和纸质论文的内容相一致。 保密的学位论文在解密后也遵守此规定。 田公丌 口保密( 年) 作者签名:盔箕盔 导师签名: 签字同期:丝盥! 玉! 兰妥 签字同期:2 盟! ! ! ! 第l 章绪论 第1 章:绪论 代码安全是计算机安全很重要的一个方面,所有的计算机软件归根结底都是 代码,如果实现代码中存在安全的漏洞,那其他的安全策略则无从谈起,所以计 算机代码安全是整个计算机系统安全的基石。现在保障计算机代码安全的主要手 段是软件测试。黑盒测试需要手工开发大量的测试例,这些测试例大多是根据软 件的设计需求来编写的,脱离代码的实际实现逻辑,这些测试例可以用来检测软 件实现是否符合软件的需求。由于测试例和代码实现并行地来自软件的需求分 析,测试用例与软件实现的具体逻辑相对独立,再加上测试例的数量限制,不可 能覆盖被测软件的所有路径,软件测试在保障软件安全方面作用有限。 另一种保障软件安全的手段专注于软件实现是否存在安全方面的漏洞。这种 方法以软件实现代码为分析对象,或者独立分析,或者作为软件编译过程的扩展, 试图在代码的实现罩找出安全性的漏洞,这也是本文着重分析的方法。 代码安全性分析按照不同的分类标准可以划分为不同的种类,按照分析对象 不同可划分为以下三类: 1 :源代码分析。这种分析方法以软件源代码为分析对象,与编译过程紧密 相关。一般在编译生成的中间语言格式上进行分析,包括数据流分析,控制流分 析,s s a 分析,最弱日i 条件分析,广泛用到格理论,模型检测理论等。源码分析 也可以结合符号执行与约束求解束进行分析,优点是程序的全局信息比较完整, 分析的难度较低,分析精度较好。缺点是很多软件的源代码难以获得,商业软件 的源代码大多不予公开;有些已经长期部署并广泛应用的软件已经找不到相应的 源代码,这种情况限制了源代码分析的可用性。 2 :字节码分析。c ,i a v a 等语言编译后生成的是字节码,而不是二进制的机 器码。如果没有进行过特殊的字节码混淆技术的处理,从字节码可以完整地提升 至源代码,有比较好的结构信息和类型信息,分析难度较低,分析精度较好。但 是这种方法适用于分析c 群,i a v a 等语言的字节码,而对于c c + + 语言或者已经部 署了的c 语言写的程序则无能为力。 3 :二进制代码分析。这种方法与前两种不同,直接以部署的二进制代码为分 析对象,结合反汇编技术进行安全性分析。由于二进制代码是作为软件的最终体 现形式,软件发布必然会带有二进制的执行程序,即使以源代码发布也可以编译 为二进制可执行程序,有广泛的实用性。缺点是二进制程序缺乏一k 层的结构信息 l 第1 章绪论 和类型信息,对二进制代码进行分析的难度大。分析结果相比于源码分析和字节 码分析不够精确。 代码安全性分析按照是否需要执行程序可以分为: l :静态分析。典型的工具是s a t u r n 和f o r t i f ys c a ,采用各种静念的分析方法, 流敏感或者路径敏感的方法对软件进行分析,其中广泛用到符号执行,约束求解 的路径名敏感分析技术。二进制分析的工具如r o s e ,也提供了静态分析二进制代 码的功能,但是其分析能力较弱,精确性上存在较大问题。 2 :动态分析。二进制分析工具中很多都是采用的动态分析方法。该方法获得 运行时信息,分析过程比较简单,分析结果比较准确。但是这种二进制插装的动 态分析方法,每次仅仅分析一条路径上的一次具体输入,无法保证每次分析的都 是不同的路径,这就限制了它面对大的软件时的可扩展性和实用性。动态分析更 适合用来进行一些性能方面的分析,典型的二进制工具有p i n ,v a l g r i n d 等。 3 :动静结合式分析。这种分析方法将上述两种方法结合起来使用,既有静态 分析的可扩展性,也利用了动态分析的精确性。静态分析查找出敏感点以后,用 动态分析的方法来排除或者验证该敏感点。典型的二进制分析工具有b i t b l a z e , 本文所提到的工具原型b a t s ,用的也是动静结合的分析方法。 在源码无法取得的情况下,二进制分析显得尤为重要。但是现阶段对二进制 进行安全性的分析的工作尚处于起步阶段,由于二进制分析特有的困难性和复杂 性,现在尚未出现成熟的分析工具,更多的是靠经验来进行人工分析( 黑客) 。各 种二进制分析的技术和平台不断出现,研究二进制安全性分析有很大的实用价值 和理论价值。 1 1 本文的研究内容和意义 由于计算机和网络越来越深入社会的各个角落,如果确保计算机运行的代码 的安全显得越来越重要。目i j 软件代码安全性分析可分为有源码的潜在漏洞发掘 技术和无源码的漏洞发掘技术,后者又称为二进制代码安全性分析技术。基于源 代码的潜在漏洞发掘技术,有助于在软件发布前发现其中的软件缺陷,提高软件 的安全性。但是我们现在大量使用的是封闭源代码的软件,其源代码很难获得, 发现二进制代码中的安全缺陷,对于防范入侵攻击,提高系统的安全性有重要的 意义。 本文的研究目的是在没有源代码的情况下对二进制可执行程序进行安全性分 析,辅助安全分析人员发现二进制程序中潜在的安全性漏洞。论文的主要研究内 容有: 1 ) 二进制可执行程序缺乏类型信息和结构信息,从二进制代码中推导出必要 2 第l 章绪论 的结构信息,研究常见的安全性缺陷,包括堆溢出,栈溢出,整数溢出, 格式化字符串,空指针引用等在二进制上的表现形式和识别。 2 ) 研究动态符号执行技术在二进制代码安全性分析中的应用。 3 ) 研究二进制代码分析动态符号执行器的设计及原型系统的搭建,实现一个 二进制检测工具原型b a t s 。 1 2 本文的章节组织结构 论文的章节组织结构如下: 第l 章:对论文的研究内容、意义及文章的组织结构进行说明。 第2 章:综述源代码和二进制代码安全性分析技术及其存在的不足。 第3 章:详细论述二进制安全性分析的原型工具b a t s 采用的动态符号执行技术, 设计和实现。 第4 章:b a t s 原型工具实验结果及分析。 第5 章:总结、不足及展望。 第2 章常见的代码安全性分析技术及工具 第2 章代码安全性分析技术 虽然二进制代码安全性分析和源代码安全性分析差别很大,有其自身的特殊 性,复杂性和困难性,但二者存在千丝万缕的联系。源代码安全性分析的技术和 方法现在比较成熟,很多技术经过改进以后可以用于二进制代码安全性的分析。 有鉴于此,本章对源代码安全性分析和二进制安全性分析常见的技术和工具分别 加以介绍,二者可以进行对比,对二进制代码进行的安全性分析也可以借鉴源代 码分析的技术。 2 1 源代码分析技术 源代码分析的分析对象是源代码,一般需要借助于编泽器的前端将源代码转 化成更加简洁的中间语言和相应的内存形式,在中间语言上进行安全性分析。能 够很好支持源码静态分析的编译器包括w i n d o w s 下面的p h o e n i x 编译器架构和 l i n u x 下边的c l a n g l l v m 。这些编泽器架构可以通过编译器前端将源代码转化成 中i 日j 语言的同时保存分析所需的高级语言的结构和类型信息,以便于分析能够尽 可能的精确和简单。源代码安全性分析一般采用静态分析的方法,其中广泛采用 的有错误模式的识别和符号执行技术,由于符号执行技术是一种静态分析中常见 的很有效的路径敏感的分析技术,本文用两节分别来介绍源代码的静态分析技术 和符号执行技术及采用这些相关技术的有代表性的代码分析工具。 2 1 1 源代码静态分析技术 利用静态分析来查找源代码中潜在的缺陷是一种很常见的分析技术,这类比 较有名的静态分析工具包p c l i n t ,f i n d b u g s 等。这一类的静态分析工具需要和相 应高级语言的编译器日、t u 缅- 、l a l 配合使用,更像是编译器的扩展检测模块。这些工具在 源代码经编译器自仃端生成的中i 日j 语言或者中间表示形式a s t 上,结合生成的控 制流图c f g 来进行控制流和数掘流的分析。这类工具大多既可以进行函数内的 分析,( i n t r a p r o c e d u r a la n a l y s i s ) ,也提供函数间分析( i n t e r - p r o c e d u r a la n a l y s i s ) 的功 能。其中p c l i n t 是一个c c + + 源码缺陷检测工具,主要进行一致性检测和较强 的类型检查,也可以进行内存泄漏的检测。缺点是误报率很高,并且需要编程人 员在源码上做标记刁能比较好的进行检测,这是很难接受的。f i n d b u g s 2 7 是i a v a 4 第2 章常见的代码安全性分析技术及t 具 语言的静态分析工具,是个很具代表性的静态分析工具。f i n d b u g s 采用的并非是 非常复杂的静态分析技术,而是主要从人们编程时常见的错误入手,将常见的编 程错误总结为错误模式,在代码中寻找符合错误模式的代码块。它进行的是纯粹 的流敏感分析,却达到了出人意料的效果。f i n d b u g s 得出了几个很有趣的结论: 1 ) 即使是熟练的程序员编写的程序,即使经过了很多测试的代码依然会有很多很 明显的软件缺陷;2 ) 特定的语言都有一些特有的语言属性和a p i ,程序员在使用这 些属性或者a p i 时经常因为缺少必要的小心和检测而产生b u g ;3 ) 即使是简单的 静态分析技术,也可以在软件代码的安全性检测当中起到很好的作用,尤其是对 于与语言属性和特定的叩i 相关的错误模式的检测。文章 6 】表明静态分析的方法 相对于m o d e lc h e c k i n g 这种复杂的方法更加适合检测软件缺陷。 文章 2 6 1 1 2 8 中提到另一种类型的错误模式,与特定工程相关的错误模式。 每个软件项目都会包含大量的历史代码修改记录,包括新增的代码以及为了修改 软件漏洞而添加的代码,其中修补软件缺陷的代码对软件安全检测更加有意义。 因为这些代码既记录了旧的软件缺陷,也记录了软件缺陷修改后的面貌,通过二 者的对比就可以建立软件缺陷的模式。该缺陷的模式是与特定的项目密切相关 的,然后在本项目中检测该错误模式。基于这种思想产生的原型工具b u g m e m 的实验证明这种软件模式可以作为与语言相关的错误模式的重要补充。 查找错误模式的方法在源代码的静态分析工具中广泛应用,但大部分静态分 析工具都是将能检测的错误模式硬编码进工具。这种情形导致发现了新的错误模 式而该工具不能及时检测,造成静态分析工具的可扩展性和适应性不强。文章 3 提出了一种新的观点,将错误模式从工具代码中提取出来,用特定格式的软件漏 洞描述语言进行描述。目的是消除静态检测工具与错误模式的紧祸合关系,使得 二者能够相对独立。软件缺陷描述文件专注于拙述软件缺陷的类型和触发条件, 软件静态分析工具专注于对软件中问代码语义、结构和类型的提取,二者结合完 成软件代码静念分析的任务。当新的软件错误模式被发现后,只需要用软件缺陷 描述语言为新的缺陷模式写一个配置文件即可,这就大大改善了软件代码静态分 析工具的适应性和可扩展性。 2 1 2 符号执行和约束求解技术 2 1 2 。1 符号执行技术介绍 由于单纯的流敏感的静态分析无法满足代码安全分析的需要,越来越多的静 态代码分析工具丌始采用符号执行和约束求解的技术来提高静念分析的精确性。 符号执行由j c k i n g 于1 9 7 6 年提出。符号执行使用符号值,而不是实际数掘 第2 章常见的代码安全性分析技术及t 具 作为输入,将程序变量的值表示为符号表达式,程序的输出是输入符号值的函数。 y 。r e a d ( ) : y = 2 y ; if ( y = = 1 2 ) f a i i s ( ) : p r i n t ( ”o k ”) : 以上述代码段为例,该代码片段读入一个值,如果输入的值与2 的乘积是1 2 的 话则失败。如果这段代码被符号执行,r e a d ( ) 函数返回的为一个符号值,即y 与 一个符号值相关联。程序对符号变量的计算被记录下来,在路径分支点,比如 y = = 1 2 这个点,路径约束被更新,以便记录哪条分支路径被选取执行。在这个例 子中假如路径条件为真,路径约束条件被更新为y 2 - - = 1 2 。如果将路径约束集合 中某个约束条件取反,并利用约束求解器( c o n s t r a i n ts o l v e r ) 来获得一个满足新约束 集合的符号变量赋值集合,则产生了可以沿着对应路径执行的变量的输入。如果 我i l i o n 道在代码执行过程中特定的约束可以产生漏洞,比如代码段中f a i l ( ) 函数的 调用是个漏洞的话,则将这个漏洞约束加入该点的路径约束集合,调用约束求解 器进行求解。如果存在一个输入使得集合中的约束都成立,则证明存在一个具体 输入,使得程序的控制流可以到达该点并且触发该软件漏洞,即我们找到了一个 软件漏洞并且找到了一个触发该漏洞的具体输入。简单说来,符号执行和约束求 解技术就是以符号值代替具体值作为程序输入,程序执行过程中收集相关约束, 在路径交叉点更新记录路径约束,并在可能触发软件漏洞的点更新约束集合;然 后调用约束求解器求解是否存在一个具体值使得程序能够触发这个漏洞。其形式 化描述如下: s :s e t p a t hc o n s t r a i n t ss e t ,i n i t i a l i z e de m p t y w h i l e ( t h e r ei sa n o t h e rb l o c kbt oc h o s e ) a d d t o c o n s t r s e t ( b c o n d i t i o n ) ;l 句约束集合中添加约束 i f ( c o n s t r r e s o l v e ( s ) ) t e s ta v a i l a b l eo ft h ep a t h f o r ( e a c hi n s t r u c t i o nii nt h eb l o c k ) c a l c u l a t e a n d u p d a t e ( i ) ;e x e c u t et h ei n s t r u c t i o na n du p d a t e d t h es y m b o le x p r e s s i o n i f ( ii sap o t e n t i a lb u g ) a d d t o c o n s t r s e t ( b u gc o n d i t i o n ) ; c o n s t r s e r v e r ( s ) ;t e s ti ft h eb u g i sp o s s i b l et ot r i g g e r ) e l s ep o p p a t h c o n s t r ( b c o n d i t i o n ) ;将路径约束弹出集合 ) 6 第2 章常见的代码安伞性分析技术及工具 符号执行的优点很明显,符号执行是路径敏感的。该方法在执行过程中计算 程序变量的符号值,在路径交叉点计算路径条件约束( p a t hc o n s t r a i n t s ) ,调用约束 求解器检测路径是否可达。并在潜在的软件漏洞可能出现的点建立触发潜在漏洞 的约束,调用约束求解器来检测约束是否成立。符号执行技术是路径敏感的,程 序中变量的符号值经过与语句语义相同的符号计算所得,在路径交叉点不进行分 析数据的融合,所以不会出现流分析面临的分析严重不精确的情况。与约束求解 技术相结合,符号执行还可以给出一个实际的输入来验证得到的软件漏洞的真伪 【1 4 。符号执行最大的优点是路径敏感,同时,该技术最大的缺点也来自于路径 敏感。真实程序中存在大量的分支语句,加上循环条件的不确定性,使得真实程 序中存在极其庞大的路径数量,造成路径爆炸问题( p a t he x p l o s i o n ) 。由于符号执 行和约束求解技术是路径敏感的,为了对软件安全性进行充分的检测必须执行完 程序中所有的路径,这对于大型程序而言是很难做到的。现在采用符号执行和约 束求解技术的静态分析工具为了减少系统消耗,往往采取基于深度优先的路径选 取算法,这样会造成符号执行局限于程序中的部分代码,使得路径爆炸问题造成 的测试不充分更加严重。 2 1 2 2 解决路径爆炸问题的尝试 实际代码中往往存在路径的爆炸问题,符号执行进入一个循坏时,往往会在 循环体内部耗费大量的时问。路径爆炸问题是符号执行技术在应用时的面临的最 大难题。路径爆炸问题很大程度上是因为循环的广泛存在,如何对循坏进行快速 有效的分析是解决路径爆炸问题的关键。现阶段对循环进行安全性分析的方法主 要有以下几种: 1 ) 循环有限次展丌 这是一种被广泛采用的处理路径爆炸问题的方法,也是一种简单有效的方法。 这种方法将循环体改写成少数有限次展开的条件分支语句,此时,循环体可以执 行的最大的次数为展丌的深度n ,在s a t u r n 中该深度为3 。当执行完最大的循环 次数时,强制控制流跳出循环体。处理强制跳转离丌循环体时的变量的值的方法 有一下三种: i ) 将循环最后所得的值作为跳出循环体时的值,在后续分析中使用这些 值进行分析,这种方法好处是简单,坏处是造成分析的不精确; i i ) 极端保守的方法,强制离丌循环体时,将循环体内改写的变量的值设为 未知值,即设定为一个新的符号变量。这种方法的思想是由于循环的 复杂性,不再进行精确分析。至于循环会对变量的值进行哪些改写, 这种方法做了最坏的打算,将其值设为任意,这种方法会造成较多的 7 第2 章常见的代码安全性分析技术及工具 误报。 i i i ) i i ) 的方法有一个不好的地方就是将循环涉及到的变量设成任意值后没有 对循环体进行进一步的分析,这可能会引起循环体中潜在漏洞的漏 报。s a t u r n 将循环体涉及的变量设为任意值后会对循环体进行一次符 号执行,以检测循环体内的漏洞,在循环出口处强制跳出循环,以此 时的变量值作为后续分析的值。这种方法会造成循环体内部漏洞的大 量误报 4 】。 2 ) 程序切片及回退式的符号执行 程序切片技术前面已经介绍过,从敏感点进行后向的程序切片,如果可以切 除程序中的循环代码,则会大大减少路径的数量。除此之外,回退式的符号执行 在解决路径爆炸问题时也是很有作用的。 当一个疑似软件漏洞被发现时,分析者总是先查看该疑似漏洞附近的代码, 看是否能够将它从疑似漏洞中排除,如果不能,则再查看更上层的代码。回退式 的符号执行技术利用的就是这种基于排除法的思想。疑似漏洞被发现时,首先在 该疑似漏洞所在的函数入口处丌始进行符号执行,如果不能排除,则从其所在函 数的主调函数入口进行符号执行,这样依次回退地进行符号执行,经过一定次数 的回退式符号执行如果还不能将该疑似漏洞排除,则将其视为一个漏洞。 这种方法可以有效地减少符号执行的路径数量,对于在程序中嵌套很深的疑 似漏洞,用这种基于排除法思想的有限回退式符号执行可以有效地进行检测,虽 然其具有一定程度的误报,但是考虑到分析本身就具有一定的不精确性,这种方 法还是可取的。 3 ) 循环归纳分析 还有一种解决循环路径选择问题的方法是对循环进行特殊的分析,比如数据 流分析,循环语义提取等。文章 1 3 】中介绍了一种对传统的符号执行的一种改进, 成为循环扩展的符号执行( l o o p e x t e n d e ds y m b o l i ce x e c u t i o n ,l e s e ) 。传统的符 号执行被称为单路径符号执 i y ( s i n g l ep a t hs y m b o l i ce x e c u t i o n ,s p s e ) ,这种符号 执行技术每次只是模拟一条路径,符号变量是通过数据流相关的操作计算得到 的。l e s e 通过扩展每次符号执行对循环路径的覆盖从而解决由循坏引起的路径 爆炸问题。l e s e 对依赖于循环的变量( 1 0 0 p d e p e n d e n tv a r i a b l e s ) 进行比s p s e 更加 精细的分析,依赖于循环的变量就是那些经过循环体其值发生变化的变量。l e s e 通过引入一个循环次数变量c o u n t s ,计算依赖于循环的变量与循环次数变量之间 的关系。l e s e 建立循环次数变量c o u n t s 与输入的关系,再通过循环体的分析建 立起输入,循环次数变量,依赖于循环的变量三者之| h j 的约束关系。这样一次 l e s e 执行过程对应的是多条可执行路径,其中的循环次数未定,用循环次数变 第2 章常见的代码安全性分析技术及1 = 具 量c o u n t 表示。这样建立起来的约束关系是经过该循环时所有可能循环次数的变 量间的约束关系,解决了s p s e 面对循环时的路径爆炸问题。我们以一个例子来 对其进行说明,为了论述方便,我们以一个c 语言的源代码 1 2w h i l e ix b ) 3 4 c = c + x : 5 x + + ; 6 7 ) 8 9 1 e 例子进行分析,上图是一个c 语言的包含循环的代码片段,假定x ,b ,c 均为整形 变量,我们以其为例子来说明l e s e 进行循环分析的步骤。 第一步是引入循环次数变量t c ,建立其与依赖于循环的变量之间的约束关系。 在该代码段中就是要分析变量c ,x 与t c 之间的约束关系,每循环一次,x 的值 递增1 。建立经过t c 次循坏时x 与t c 之间的关系x = x + t c ,而通过c = c + x 和x + + 可知每循环一次,c 的值增加一个x 的大小,而x 每次增加1 ,可以分析出经过t c 次循环时c 与t c 之i 日j 的约束关系为c = c + t e * x + t c ( t c i ) 2 ,。如此则建立起了循 环次数变量与依赖于循环的变量之间的约束: x = x + t c ; c = c + t c 宰x + t c 幸( t c + 1 ) 】2 ; 第二步是建立循环次数变量与输入之间的关系,就是建立循环次数与循环条 件谓词中变量之间的关系。在本例子中就是建立t c 与x , b 之i 日j 的约束关系。通过 条件谓词可知当x = b & & t c = 0 或者x b & & t c = b x 。 综合以上两步所得的约束关系可以将原来的循环简化成一个分支语句的约束 关系,当x b 约束成立时,循环的约束关系表示为: t c = b x : x=x 4 - t o ; c=c 4 - t c 宰x4 - t c 木( t c + 1 ) 】2 ; 循环经过这样的分析,通过引入循环次数变量和建立循环次数变量与依赖于循环 的变量之间的约束关系,建立循环次数变量与循环谓词的变量之f n j 的关系,从而 解决了由于循环为题带来的路径爆炸问题。 但是,这种对循环的分析方法面对复杂的循环体时其分析过程也很复杂,可 9 第2 章常见的代码安全性分析技术及工具 以通过循环分析模块对循环的代码段进行静态的特殊分析;另一方面,并不是每 种循环体都能像例子中这样把三者之间的约束关系表达成如此简洁的形式;再 者,对于循环体中调用了m a l l o c ,f r e e 之类对内存堆进行操作的函数时,其分析 更加复杂。 文章【2 】中提到一种新的提高符号执行中语句覆盖率的路径调度算法,可以在 测试后很快提高测试的语句覆盖率。一定程度上缓解了路径爆炸问题对于造成的 测试不充分问题。 2 1 2 3 使用符号执行和约束求解技术的工具 源代码的静态分析中使用符号执行和约束求解技术的代表性工具是s a t u m 和 c o v e r i t y 。c o v e r i t y 是一个商业工具,用于检测c c + + 源代码中潜在的漏洞。s a t u r n 是一个开源的项目,用于对c 源代码进行安全性检测。s a t u r n 利用符号执行技术 主要有两个重要的改进,1 ) 建立函数摘要( f u n c t i o ns u m m a r y ) 以进行函数问的分析 ( i n t e r - p r o c e d u r a la n a l y s i s ) ;函数摘要是指将函数经过第一次分析以后,将其作用 用前条件和后条件的形式加以总结和摘要,以后再调用此函数,不用重新进行符 号执行,而是直接应用函数的摘要即可。采用这种方法,分析的精确性与函数摘 要的建立密切相关,一般情况下不如内联展丌的分析精确。但是函数摘要的方法 可以减少分析的强度,加快分析速度,具有较好的扩展性,对分析大型的软件具 有实用价值。s a t u r n 就是通过从底层逐层建立函数摘要的方式对大型软件进行分 析的。2 ) 对循环和递归的处理,s a t u r n 采取的是将循环展j :( u n r o l l i n g ) 与灾难性分 析( h a v o c i n g ) 两种方法。前者将循环展开有限次数,如果循环可以在这有限次执 行中结束,则分析结束。否则抛弃第一次分析的结果,将循环中出现的变量的右 值全部用未知符号值代替,然后再对循环体进行一次循环分析就强制退出。这种 分析方法是不稳定的,尤其是对于循环体中有指针运算的循环来说更是这样 【4 】【1 4 】 1 5 。对递归函数的处理,s a t u r n 采取了同样的策略。 真实程序中路径爆炸问题的存在,使得路径敏感的符号执行和约束求解技术 的应用主要集中在函数内分析,符号执行和约束求解在用于分析大型程序时必然 要和其他的静态分析方法配合使用,以达到精确性和扩展性的折中。 现阶段利用符号执行技术进行漏洞检测主要用于源代码分析中,二进制代码 分析尚未发现使用符号执行技术进行漏洞检测的工具。 2 2 二进制代码分析技术 大量使用的商业软件都是封闭源代码的,源代码分析的技术和工具无法对商 用软件进行检测。二进制代码分析就是针对无法获得源码的二进制程序进行安全 l o 第2 章常见的代码安伞性分析技术及t 具 性分析。二进制程序缺少源代码级的结构信息和类型信息,加上x 8 6 汇编指令种 类繁多,很多汇编指令具有修改c p u 状态字的副作用( s i d ee f f e c t ) ,因此二进制程序 的分析具有独特的复杂性和困难。现在二进制代码安全性分析技术尚在发展之 中,本节主要介绍二进制程序分析时用到的技术及现有的工具。 2 2 1 二进制程序静态分析 静态分析在二进制代码安全性分析中是必需的,随着二进制代码安全性分析 的深入,静态分析的地位会进一步得到提升,现阶段的二进制代码安全分析中用 到的静念分析技术主要有以下几种: 1 ) 反汇编及代码提升技术。 二进制代码分析虽然以二进制代码为分析对象,但是直接在二进制机器码上 进行分析显然是不现实的。必须将二进制机器码转变成对人们更加友好的形式才 能更好地加以分析。将二进制代码提升至汇编语言后再进行分析是一种最直接的 想法。二进制代码的反汇编工具有商业的i d a p r o ,l i n u x 下边能用的g n ub i n u t i l s 包中的o b j d u m p 工具,还有r o s e 编译器提供的反汇编器。i d ap r o 是d a t a r s e c u e 开发的专业反汇编工具,全称是a n a d v a n c e di n t e r a c t i v em u l t i p r o c e s s o r d i s a s s e m b l e r 。i d ap r o 不仅仅是一个反汇编工具,而且是一个基于反汇编进行二 进制文件分析的平台。提供了各种a p i 接口和s d k ,用户可以根据自己的需求 编写各种插件和i d c 脚本来进行功能的扩充。i d ap r o 是一个基于反汇编后生成 的汇编语言的二进制分析平台,可以很容易地生成函数调用图,控制流图等,也 比较容易进行数据流的分析。o b j d u m p 更多的是作为l i n u x 平台下的反汇编器来 使用的,它几乎可以查看e l f 文件中几乎所有的信息,最大的用处就是使用 o b j d u m p 来反汇编t e x t 节。在本论文设计的原型工具b a t s 中,用到了o b j d u m p 来 查看e l f 文件的p l t 节内容,确定二进制文件所调用的动态库函数名字和地址的 映射。r o s e 架构可以对二进制代码进行分析,文章 7 】,【1 1 阐述对利用r o s e 架构进行二进制代码的分析的技术,c o m p a s s 原型工具用来对汇编程序进行静态 分析,只是对汇编代码中的危险函数调用( u n s a f ef u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025新版网站建设合同3篇
- 代谢产物抗菌谱研究-洞察及研究
- 缓释制剂开发-第1篇-洞察及研究
- 山西省吕梁市石楼县部分学校2024-2025学年八年级下学期第一次月考生物试题(含答案)
- 部门领导安全培训课件
- 广西钦州市第四中学2025-2026学年高三上学期开学考试生物试卷(含答案)
- 2024-2025学年辽宁省朝阳一中联盟校九年级(上)期末数学试卷(部分答案不完整)
- 边防军人课件
- 安乃近滴鼻液与传统疗法比较-洞察及研究
- 车队驾驶员安全培训会议课件
- 佛教协会会议室管理制度
- 传音控股在线测评题
- GB/T 44139.2-2024睡袋的要求第2部分:原材料性能
- JT-T-496-2018公路地下通信管道高密度聚乙烯硅芯塑料管
- 2022年中国大唐集团有限公司招聘考试试题及答案
- 危重患者的抢救制度
- GB/T 18910.41-2024液晶显示器件第4-1部分:彩色矩阵液晶显示模块基本额定值和特性
- 打扫卫生的社会实践报告
- 小学《道德与法治课程标准2022版》测试题
- 信贷审计培训课件
- 服装陈列课件
评论
0/150
提交评论