




已阅读5页,还剩76页未读, 继续免费阅读
(计算机应用技术专业论文)基于静态分析的缓冲溢出漏洞检测研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 随着计算机技术的普及和h t e m e t 的飞速发展,信息安全问题日益突出,信息 系统面临着前所未有的安全挑战和日益增多的威胁。其中,基于缓冲区溢出漏洞 的攻击方式在当前和过去的几十年内被广泛采用,并可能长期存在。 缓冲区溢出问题源于c c + + 等高级语言相应的安全缺陷以及编程者的疏忽。 其解决方法可分为攻击行为发生时的实时保护,和攻击行为发生前针对程序代码 的漏洞发现和检测。前者由于实现代价较高且容易演化为拒绝服务攻击,其应用 受到了限制,而后者则成为当前研究的重点,相关技术得到了深入的探讨和发展, 并取得了许多成果。但它们具有以下不足:( 1 ) 早期检测工具仅作词法分析,存 在较多的误报;( 2 ) 一些工具通过在源码中添加注释的方法进行分析,自动化程 度受到限制;( 3 ) 许多检测方法依赖于一些通用的代码分析工具,检测效率不高。 针对现有方法的不足,本文提出了一种针对c 源码中缓冲溢出漏洞的静态检 测方案。其设计目标包括( 1 ) 针对漏洞的词法、语法、语义特征,分层次实现检 测器的功能模块,使漏洞特征提取更充分;( 2 ) 检测器的实现环节和执行过程均 不依赖于其它的通用代码分析工具,以避免与漏洞检测无关的语义分析开销。 基于以上设计目标,本方案提出并实现了一种c 的等价文法:漏洞特征文法, 并借助编译器生成工具y a c c 构造出一个对漏洞形式化特征敏感的语法分析器; 以该分析器为框架,配合漏洞信息表示和漏洞判定等工作,最终实现了一个完整 的漏洞检澳l 工具原型。 由于这种等价文法实现了漏洞形式化特征与普通c 语法的分离,因此,由它 生成的语法分析器具有对缓冲区溢出漏洞敏感的特点,从而使漏洞信息收集工作 比较可靠和准确;另外,这种基于漏洞特征的文法分解为整个方案提供了一个形 式化框架,保证了后期语义分析的针对性,并降低了算法设计的复杂度;由于方 案并不依赖于已有的一些通用代码分析工具,从而使项目实施过程具有一定的灵 活性。 最后的实验结果证明;该检测工具有较好的检测准确性,并对一些较隐蔽的 漏洞形式具有检测能力。 关键词:缓冲区溢出,静态检测,等价分划,文法 a b s t r a c t w i t l lm ep r c v a l e n c eo fi n f o 衄a t i o nt e d m o l o g ya i l dt l l ed e v e l o p m e n to f i n t e r l l 鸭 s y s t e ms e “d t yi sb e c o m i n gl l o tt o p i c m 0 r ea n dm o r cc o m p u t e rs y s t 锄sf a c et h eb i g c h a l l e n g co fa l ik i n d so fa 仕a d ( s h lm el a s t 押e 1 1 哆y e a r s ,b u f 陆o v e r n o w sh a v eb e e i l l h em o s tc o 枷nf b r mo fs e 吼】r i t y 1 n e r a b n i 劬a n dw i l le x i s tf o ral o n gt i m ei nt l l e f i l t i 鹏 1 kb u 饪ho v e m o wp r o b l e mi s 咖i c a lo fo l dp r o 掣a 埘m i n gl a n g l l a g e s ,s u c ha s c c + + ,a n di s 、v o 础m e db yp r o 伊a m m e r s n e 百i g e l l c e t h em e m o d so fr e s o l v m gt 1 1 i s p r o b l e ma r eg c n e r a l l yd i v i d e di n c o 铆ol d n d sa tp r e s e n t :d y n a l i l i cd e t e c 吐n i ga tn mt i m e , a 1 1 ds t a t i ca n a l y s i sb e f o r e 甜a c bt a l 【ep l a c e t h ed y n a n l i cd e t e c 血gt e n d st oc a u s ed o s a t t a c l ( s ,a n di t sr e a l i z a l i o ni sv e r yd i 伍c l l l t a tp r e s e i l t ,s t a t i ct e c l l l l i q u e sa r ec a t c h i n g m a l l yr e s e a r c h e r s a t 删o i l ,a n ds e 、惯a ls t a t i ca n a l y s i st 0 0 1 sh a v eb e e i ld e 、,e l o p e d b u t t 王1 e yh a v es o m es h o r t a g e si n c l u d e s :a ) d o i n gl e ) 【i c a la i l a l y s i so n 耽b ) n e c d i n g m 枷a 1 一i n s e n e dc o m m c l l t s ,a n dc ) d 印e n d i n go no l h e fc o d ea n a l y z i i l gt o o l s 1 1 1 i sm e s i sp r o p o s c das 伽cd e t c c t i n gm e t l l o d ,w 1 1 i c ha i n a sa t :( a ) d e 鲫g s e p a r a t em o d u l e sf o rm ed e t e c t o rc o r r e s p o n d 如gt ot h e l l n e f a b i l i 妒sl e x i c a l ,s y n t a x a n ds e m 姐t i cp r o p 酬e s ,a i l d ( b ) b c i n gi n d 印e n d e n to f o t l l e ft o o i s f o rm e e t i n gt h i sa i m ,l h e 】1 1 1 e r a b i l i t i e s - c h a r a c t e r i s t i c 擎a m m a f ( c se q u i v a l e n t ) i sd e 丘n e d ,a n dac o m p i l e rb e i n gs e i l s i t i v et ob u 丘薛o v e m l n - l n c r a b i l 衔e si s c o n s 仃u c t e dd e p e n m n go nt 1 1 ey a c c b a s e do nt h ec o m p i l e ra n do m e rm o d m e s ,aw h o l e d e t e c t o ri sr e a l i z e d d 1 1 et om e i m p l 锄e n 伽o n o f s 印a r a 血g 仉1 h l e r a b i l i t i e s f o 皿a l i z e d c h a r a c t e r i s t i c s 舶m 渊o ncs y n t a ) 【,t l l e 1 n 嘲b i l i t i e s c h a r a c t c r i s e c 黟锄m a ri t s e l f h a sm ec h a r a c t e r i s t i co fb e i n gs e n s i t i v et ob u 饪b f - o w 删nv 1 1 l n e 船b i l m e s t h e r e f b r e i n m cf o r e p a no fm et 0 0 1 sw o d d n gn o w 也ec o l i 劬go f 1 ne 船_ b i l i t i e s c h a r a c t e r si s e x a c ta n dr c l i a b l e m o r e o v t 1 1 e 鼬姗m a rd e c o m p o s i 矗o nb a s e do n l n 咖b i l i t i e s c h a r a c t e r i s t i c se n s u r e st 1 1 a tt h e1 a t e fs e i i l 枷ca n a l y s i s g o a li sd e a r o w n i i l gt 0m e i n d e p e n d e n c eo fo t h e rs t a t i ca i l a l y z i n gt o o l s ,t h ei 1 i l p l e m c n t a t i o no f1 h ea p p r o a c hi s f l e x i b l e a b s l r a c t t h ec x p e r i m e n t a lr c s l l l t si n d i c a t em a t 也et o o lh a sp r e 是f a b l ed e t e c t i n ga c c i | r a c h a 1 1 dt 1 1 ec a p a b i l i t yo f d c t e c 缸gs o m ei n c o n s p i c l l o u s l l n e r a b i l i t i e s k e y w o r d :b u f f 打o v e m o w ,s t a t i cd e t e c t m 岛e q u i v a l e n c ep 耐i t i 0 1 l ,乒a m m a r i 独创性声明 本人声明所星交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。 签名: 日期;j e 7 年朗夥日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关都门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 日期:如7 年尹月哆日 第一章绪论 第一章绪论 早在7 0 年代初,缓冲区溢出问题就被认为是c 语言数据完整性模型的一个可 能后果。在初始化、复制或移动数据时,c 语言并不支持内在的数组边界检查,这 种设计虽然提高了代码的执行效率,但也可能导致数据的越界访问。在随后的几 十年间,缓冲区溢出的利用技术和相关研究迅速发展起来,其带来的影响及后果 极其深远和严重,h e m e t 和各种计算机系统面临着前所未有的安全威胁。 本章首先简要回顾缓冲区溢出问题的发现、发展和利用的历史,随后讨论溢 出防护措施的研究现状、技术分类、特征以及存在的一些不足。最后介绍了论文 的总体结构和拟开展的工作。 1 1 课题研究背景及现状 1 1 1 缓冲区溢出及利用的历史 下面是有关缓冲区溢出问题的一些重大历史事件: 1 9 8 8 年,m o r r i s 蠕虫病毒利用、,瓤和s u n 机器血g e r d 中的缓冲区溢出漏 洞使h l t 锄e t 上1 0 2 0 的计算机陷于瘫痪; 1 9 8 9 年,s p a 肋r d 提交了一份关于运行在机上的b s d 版u n 的 f i n g c r d 的缓冲区溢出程序的技术细节的分析报告,这引起了一部分安全人 士对这个研究领域的重视; 1 9 9 6 年,舢e p h o n e 给p h m c k m a g a z i e 杂志撰写了题为“s m a s h i n g t h es a t c k f o rf i l n 柚dp r o f i t ”的文章,这篇文章清楚地阐述了i j 肌x 系统中栈的结构 和如何利用基于栈的缓冲区溢出。e p ho n e 的贡献还在于给出了如何写 开一个s h e l l 的e x p l o i t 的方法,并给这段代码赋予s h e l l c o d e 的名称; 受到舢c p ho n e 的文章的启发,m e m e t 上出现了大量的文章讲述如何利 用缓冲区溢出和如何写一段所需的e x p l o i t 。自此,人们不断在大量系统 软件和应用程序中发现了缓冲区溢出漏洞; 2 0 0 1 年7 月,名为“c o d e r e d ”的蠕虫病毒利用微软i i s w 曲s e r v e r 中的 缓冲区溢出漏洞使3 0 0 ,0 0 0 多台计算机受到攻击; 2 0 0 3 年1 月,“s l 糊c r ”蠕虫利用微软s q l s e r v c r 2 0 0 0 中的缺陷,使得 电子科技大学硕士学位论文 韩国和日本的部分h t e m e t 崩溃,中断了芬兰的电话服务,并使美国航空 订票系统,信用卡网络和自动柜员机运行缓慢; 2 0 0 3 年蔓延的“冲击波”病毒利用了w m d a w s 系统的d c o mr p c 缓冲 区溢出漏洞;2 0 0 4 年5 月爆发的“网络天空”、“振荡波”病毒,以及2 0 0 5 年8 月被称为历史上最快利用微软漏洞进行攻击的“狙击波”等病毒。 以上事件的出现并非偶然,根据c e r l c c ( c 0 m p u t e re m e f g e n c yr e s p t c 姗c o o d i n a t i o nc c n t e r ) 的统计,几乎所有日常使用的软件都存在这样那样的缺 陷。且随着软件复杂度的提高,当前软件产品中的问题代码也越来越多2 】,缓冲 区溢出问题日益尖锐。 1 1 2 现有防护措施分类及特点 面对越演越烈的安全威胁,缓冲区溢出防护技术的研究工作也在不断深入并 取得了许多可喜的成果,相关的技术手段更加丰富和完善。 目前,针对缓冲区溢出的防护措施一般有:( 1 ) 程序员良好的编程习惯和软 件工程方法的有效实施;( 2 ) 非执行的缓冲区;( 3 ) 数组边界检查;( 4 ) 程序指 针完整性检查等【l 】。这些措施中,除去人为因素外大致可分为两大类:( 1 ) 漏洞检 测和发现;( 2 ) 攻击发生时的动态防护。 1 1 2 1 攻击发生时的动态防护 当针对漏洞的攻击行为发生时,能够及时感知并阻止,从而保证系统的安全。 前面所描述的四种防护措施中,非执行的缓冲区技术、数组边界检查和指针 完整性检查等均属于动态防护的范畴。下面是采用动态防护技术的代表性工具: l i b s a f c 和m v e r i f y 【3 】【4 1 ; 通过拦截已知有问题的库函数调用来防止缓冲区溢出的发生。 s t a c k g l l a r d1 5 】【6 】和s t a c k s h i e l d 川: 它们都是g n uc 编译器的扩展工具,用于检测函数调用的返回地址是否正常。 s t a c k g u a f d 的做法是:在缓冲区和返回地址间添加一个“c a n a r y ”字,通过检查 “c a n a r v ”值是否被修改来实现溢出的判断。s t a c k s h i e l d 是s t a c k g u a r d 的改进,它 将函数返回地址存放在其它地方,并在函数调用返回前将它恢复。 r a d : r a d 【8 】与之前的s t a c ks h i e l d 非常类似。也用一个额外的栈,每当函数调用时 2 第一章绪论 压栈,当函数返回时,比较返回地址和这个额外的栈的栈顶所记录的值是否一致。 p r o 口o l i c e 【9 】【l o 】: 改变栈的分配结构,不管源程序中各个变量的声明顺序,把它们都放在低端 地址,把返回地址和基指针放在高端地址,这样,即使溢出也不会修改到高端地 址出存放的返回地址。 上面列举的检测工具都有实现代价较高、且容易转化为拒绝服务攻击的特点, 这也是运行期缓冲区溢出动态防护技术所普遍存在的缺点。 1 1 2 2 漏洞的检测和发现 在编码阶段,或软件投入运行之前,通过各种检测手段发现并修正漏洞是一 件有意义的工作【1 1 1 。下面对相关技术进行讨论,并分析现有工具的一些特点和不 足,这将是本文研究内容的起点。 根据所采用的技术手段,漏洞检测又可以进一步分为静态检测和动态检测两 种: 动态检测:精心设计一组测试数据 1 2 j ,通过调试或模拟软件的一次运行来 分析程序的特性,测试漏洞是否存在。 动态检测技术针对目标代码进行完全黑箱式的分析:通过随机生成不同长度 的字符串对目标代码的执行进行测试。该方法可以发现一些软件中的溢出漏洞, 但对潜在漏洞的搜索是强力性和无策略的;由于执行路径一般不可能完全遍历, 就存在潜在的漏洞不能被发现;另外,该方法最终给出的仅是一种判断,漏洞的 具体位置不能确定。目前,代表性的工作较少,已知的有威斯康星大学b a 哟n p m i n 凹等人开发的f u z z 工列1 3 1 。 静态检测:在不执行代码的前提下,通过程序静态分析来发现源码或目标 代码中可能存在的漏洞【1 4 】【1 5 1 。 得益于开放源码系统的推广和相关技术的积累,缓冲区溢出漏洞的静态检测 技术成为当前的一个重要研究方向。 静态检钡4 是一种代码审计行为【阍,通过扫描和分析源代码或目标代码,对缓 冲区溢出发生的模式进行识别,从而发现并定位漏洞。典型的检测工具和成果包 括: g 唧工具: u m x 上一个简单的词法分析工具,可以对源代码进行一些词法扫描和分析工 电子科技大学硕士学位论文 作,从而可以搜索源码中可能存在的对一些不安全库函数的调用。 r r s 4 : i t s 4 【1 7 】基于漏洞模型结构的数据库,使用词法分析技术对源码进行模式匹 配。这类检测技术的特点是实现简单、算法效率高,但是由于没有考虑到语法和 语义层次的信息,容易出现漏报和错报的情形。 f 1 a w 右n d e ra n dr a t s : 这两个工具的实现思路与r r s 4 类似,都是对源程序进行词法分析,都有一个 漏洞数据库,通过比较t o n s ,找到潜在的错误。 l c l i n t ( s p l i n t ) : l c l i “1 9 】 2 0 】【2 1 是一种使用规范来检查代码的安全性工具。同一般的程序分析 工具不同,l c “n t 借鉴了程序验证系统 2 2 1 的一些功能,可以验证程序与一套规范 之间的一致性,而这套规范恰好反映了编程者自身对程序的要求和意图。为了便 于分析并提高效率,该工具要求手工加入注释,然后根据这些注释进行语法分析, 并生成语法树。 d a v i dl a r o c h e l l e 【2 3 】等在l c l i m 的基础上提出了一种改进方案,它更加强调注 释语句的描述能力。通过在源代码和标准库中添加注释语句,对函数调用构造了 一组前置条件和后置条件( 约束) ,然后通过约束分析( 约束分析是程序分析技术 之一,a j k e e n 【2 4 】等人曾对此做过较为详细的介绍) 来判断缓冲区溢出漏洞是否出 现。 。 d a v i dw i 盟e r 【2 5 】【2 6 】【2 7 】在他的博士论文中将缓冲区溢出的检测转化为整数区间 分析问题。其基本原理是:将任何缓冲区s 抽象为一个整数对( a 1 1 0 c ( s ) ,1 e n ( s ) ) ,分 别代表该缓冲被分配的大小以及该缓冲当前的大小。分析的重点是确定任何字符 串操作对该整数对的状态改变。l 肋( s ) 在目标系统的开发过程以及最终的运行阶段,均不依赖通用的代码分析工 具,从而保证方案实现时的灵活性,并避免通用工具导致的与漏洞检测无 关的语义分析工作; 论文的主要工作包括: 提出并完整实现了一种c 的等价文法。由于该文法具有对缓冲区溢出漏洞 特征敏感的特点,故称之为漏洞特征文法; 从集合论角度证明了该文法的可行性以及对漏洞形式化特征的检测能力; 以漏洞特征文法为基础,通过编译器生成工具y a c c 构造出目标系统的功 能框架。 设计实现了与上述框架相配合的漏洞判定算法,从而使词法、语法和语义 分析工作分工明确。其中,漏洞词法和语法特征的检测由漏洞特征文法实 现,漏洞语义特征分析及漏洞判定由直接编码实现。 本文的章节安排如下:第一章,简要回顾缓冲区溢出问题的历史,介绍现有 的防护措施、分类及特征,阐明课题在该领域的研究起点以及所作的主要工作; 第二章,介绍缓冲区溢出的原因、对典型漏洞攻击形式和手段进行总结;第三章, 提出了一种静态检测方案,并给出了方案的设计日标以及检测工具的功能框架; 第四章,针对现有静态检测工具的一些缺点,分析了漏洞特征的表示问题,并提 出了漏洞特征描述充分形式化的设计目标;介绍了一种c 等价文法( 漏洞特征文 法) 的构造过程,并讨论了该文法在语法阶段对漏洞的敏感性,后期漏洞语义分 析的针对性和局部性等特征;第五章,基于漏洞特征文法,介绍了检测工具的设 计过程,描述了相应的核心数据结构、关键算法以及具体实现时需特别留意的一 些细节;第六章,介绍漏洞检测实验,验证方案的有效性和工具原型的检测性能; 第七章,总结本文工作,提出方案的优点和不足,并展望今后的工作。 6 第二章缓冲区溢出概述 2 1 缓冲区溢出原因 第二章缓冲区溢出概述 除了人为因素外,缓冲区溢出主要源于现有系统的内存管理机制、进程的内 存分配和结构布局,以及a c + + 编译器存在的非安全类型等诸多技术问题。由于 商业和历史的原因,它们已经很难得到彻底解决。 2 1 1 进程虚存空间管理机制 图2 1 是l i n u x 系统中进程的虚存结构。它代表了当前绝大多数操作系统对进 程虚地址空间的管理和布局方法,而其中的许多特征是缓冲区溢出的必要条件: 栈由高地址向低地址增长; 栈可执行; 堆内存分配的链表结构。 图2 - ll m “中进程的虚存结构 7 电子科技大学硕士学位论文 栈由高地址向低地址增长,而缓冲区的增长方向恰好相反当缓冲区写操作 一旦溢出时,就有覆盖栈中已存在数据的可能。另外,由于在进程地址空间中栈 可执行,栈中的缓冲区本身成为攻击代码的最佳存放地点。这些因素都为溢出的 发生提供了前提。 2 1 2 非类型安全语言 类型安全语言强调内存访问的安全性和可靠性( 此处的类型安全特指内存类 型安全) 。而c 等非类型安全语言则更看重执行效率和编码的简练性,它可以执行低 级的内存直接访问,以及无边界检查的指针运算。 在c 语言中,指针和数组越界不保护是缓冲区溢出的根源和直接原因。 2 1 3 其它原因 在一些高级语言提供的标准函数库中,有些函数的实现不够安全,如c 语言 中的s t r c a t ( ) ,s t r c p y ( ) ,s 州n t f ( ) ,v s p 血t f ( ) ,b p y ( ) ,g c t s ( ) 和s c a n f ( ) 等 在编写程序时,一旦由于疏忽对这些函数进行了不合适的调用,就会引起溢出的 发生。 2 2 缓冲区溢出攻击原理及手段 利用缓冲区溢出进行攻击的手段和方式很多,根据溢出发生的地点可分为栈 溢出和堆溢出两种。 2 2 1 栈溢出 当某一函数被调用时,会在栈顶为该函数分配一个数据结构( 栈帧) 【3 7 】【3 8 】。 该数据结构具有固定的布局,总是包含函数返回地址等重要数据,以及一些局部 变量。图2 2 描述了一个函数被调用时对应的栈帧,其中包含一个局部定义的字符 缓冲区变量b u 骶r 。 8 第二章缓冲区溢出概述 栈 增 长 方 向 高地址 低地址 a r 9 2 a r g l e e b p b u 丘打 图2 - 2 栈帧结构 由于对缓冲区的操作( 比如字符串的复制) 都是从内存低址到高址的,而内 存中所保存的函数调用返回地址恰在该缓冲区的上方( 高地址) 这是由栈的 特性决定的,从而为覆盖函数的返回地址提供了条件。当我们有机会用大于目标 缓冲区大小的内容来向缓冲区进行填充时,就可以改写函数保存在函数栈帧中的 返回地址,从而使程序的执行流程随着我们意图而转移。 基于栈的溢出攻击普遍采用执行流程跳转技术【3 9 【删【4 1 】【4 2 l 。这种攻击能够改变 程序的执行流程,进而执行任意代码。例如,攻击者可以利用这段代码启动一个 s h e l l ,该s h e n 具有和被攻击者相同的权限。如果被攻击进程有超级权限时,则整 个系统将彻底暴露给入侵者【4 3 】【螂。 这种攻击方式的实现一般包含以下步骤: 在攻击对象的进程地址空间中安排攻击代码( s h e l lc o d e ) : 1 ) 植入法:攻击者通过网络,设置环境变量等手段,将一段实施攻击的指令 序列复制到被攻击程序的某一缓冲区中。该缓冲区可以在栈、堆或者b s s 段中,一 般比较常见的情况是直接存放在溢出缓冲内( 栈中) ; 2 ) 利用已经存在的代码:攻击所需的部分或全部代码如果已经存在于地址空 间中,此时可以直接利用。比如:攻击代码要执行“e x 耐s h ,) ”时,所需的代 码已经在l i b c 库中了,剩余的工作就是设法计算出“e x e c ”函数的地址,并为其构 造一个参数即可。另外,可以设法在动态链接库中找到j m p c a l le s p 等特殊指令, 电子科技大学硕士学位论文 用该指令间接跳转到攻击代码的位置执行。 控制程序转移到攻击代码; 改变程序控制流的最直接方法就是覆盖函数调用的返回地址,一般情况下, 它的附近有一个可以溢出的缓冲区,通过向该缓冲复制过量数据( s h e l lc o d e 的起 始地址) 即可实现程序执行流程的跳转。 2 2 2 堆溢出 在d a t a ,b s s ,和h e c p 中溢出的情形,通称为堆溢出【4 5 】【徊。相对于栈溢出, 堆溢出攻击的难道较大,一般对攻击目标的内存数据组织有特殊的要求。并且需 要结合其它技术手段,如: 函数指针改写 如果被攻击程序在堆中先后定义了一个b u 仃c r 和一个函数指针,则堆缓冲区填 充数据时就有可能覆盖之后的函数指针,从而改变该函数指针的值进而改变程序 执行流程。 v t a b l e 改写 在c + + 中,编译器为每一个包含虚函数的d a s s 建立起v t a b l e ,v t a b l e 中存放 的是虚函数的地址。编译器也在每个d a s s 对象的内存区放入一个指向v t a b l e 的指 针( v p 蛐,v p 仃的位置随编译器的不同而不同,v c 放在对象的起始处,而g c c 放在 对象的末尾。如果能改写、,p t r ,使其指向一个精心构造的函数表,则该表指向的攻 击代码就有机会被执行。 库函数本身的漏洞 以诚d o w s 系统为例,执行n ,d d e t e 操作或者w 蹦3 2a p i 函数 h e a p a l l o c m e a p f r e e 来动态分配内存时,都将最终调用n t d l l d l l 中的 r n a l l o c a t c h e a 肛f r e e h e a p 函数。由于h e a p 区中的双指针链表结构,以及 r a n o c a t e h e a p r t l f r e e h e a p 函数的执行特点,攻击者有可能获得写入非法数据的 机会,进而引起程序执行流程的非法跳转。 2 3 本章小结 本章主要介绍了缓冲区溢出的基本原理和导致漏洞出现的各种因素,并分析 了常见的缓冲区溢出攻击手段和过程。它们是进行漏洞检测的基本依据。 l o 第三章检测方案 第三章检测方案 在绪论部分,我们针对现有静态检测工具的一些不足提出了目标系统的设计 目标。按照这些目标的要求,本章给出方案实施的基本思路,并确定目标系统的 功能构成和框架。 3 1 设计思路 对于一个漏洞检测工具,漏洞特征的收集和漏洞判定是其必备的两大功能。 其中,前者是整个检测工作的基础和依据,它负责在c 代码中鉴别出字符缓冲的 名字、大小、可能导致溢出的不安全写操作等内容。其能力的强弱直接影响到漏 洞判定的准确性和可靠性。为了保证漏洞特征收集的充分性和完整性,我们放弃 漏洞特征数据化的表示方式,而采用在算法中直接描述漏洞特征的方法,这是由 漏洞特征自身的复杂性决定的:漏洞特征包含词法、语法、语义成分,对它们的 描述无法完全依赖于数据形式,而通过设计一些算法贝q 可以胜任该任务。 问题归结为这些算法该如何设计。它即实现对c 源码的语法分析功能,同时 具有对漏洞特征的检测能力。显然,直接编码实现过于复杂。为此,我们提出以 下设计思路: 定义一个c 的等价文法,要求该文法实现漏洞形式化特征与普通c 语法 的分离描述; 使用i 翩1 】【下的编译器生成工具y r a c c 将该文法转化为一个语法分析器, 该分析器工作时可保证那些有漏洞特征的句型沿独立的路径进行归约,从 而实现漏洞形式化特征的提取和检测; 基于该语法分析器进一步设计漏洞判定算法,最终实现完整的漏洞检测工 具。 以上设计思路避免了漏洞特征提取的不充分以及直接编程可能引入的人为因 素,方案实施的前期并不直接进行算法设计,而是使用上下文无关文法来描述漏 洞的形式化特征( 词法和语法特征) ,并基于该文法生成一个语法分析器。这样的 分析器即具有漏洞特征发现的功能。上述过程可由图3 1 表示。 电子科技大学硕士学位论文 含有漏 洞形式 化特征 描述的 c 等价 文法 编译器 生成工 具 y a c c 3 2 方案框架及特征 3 2 1 目标系统的结构 对漏洞 特征敏 感的语 法分析 器的c 源代码 图3 1 方案设计流程 c 编译器 漏洞语义 分析及判 定算法 漏洞检 测器 按照方案的设计目标,目标系统的功能框架将按照漏洞词法、语法和语义特 征的检测工作进行分层次设计。各部分应分工明确且具有针对性。 为此,可将目标系统划分为两大模块: 漏洞特征收集模块 漏洞信息描述、登记和漏洞判定模块。 漏洞特征收集模块负责实现漏洞词法特征和语法特征的检测工作。其主要由 一个词法分析器和一个语法分析器构成。一方面,它针对检测目标执行完整的c 词法、语法分析:另一方面,它也进行漏洞形式化特征的收集工作。 从漏洞特征收集模块的设计过程看,相关工作主要是词法分析器和语法分析 器的构造。借助l e x 和y a c c 工具,构造过程可转化为词法规则和语法产生式的 设计问题。 词法规则的设计可以参考a n s ic 的相应部分,因此并不复杂。而由于语法分 析器需具备对漏洞形式化特征的检测功能,其实现方法是整个检测方案讨论的重 点,本文将在下一章单独讨论。 。 漏洞信息描述、登记、漏洞判定模块负责对漏洞的语义特征进行分析,并最 第三章检测方案 终给出漏洞是否出现的判定结果。 该模块借鉴约束分析、整数区间分析等现有较成熟的方法进行设计。其构成 包括: 漏洞信息的描述和登记:主要工作是设计合理的数据结构对漏洞信息进行 描述,以满足漏洞判定工作的需要; 漏洞判定:根据各阶段收集到的漏洞信息,通过约束求解给出最终的判定 结果。 整个目标系统的功能框架以及设计过程中各实体间的关系如图3 1 所示。 整数区间表示 的缓冲区属性 自定义不安全 函数约束集 口 二= 不安全函数 调用关系图 口 二二二三 图3 - 2 功能框架及实体关系 3 2 2 目标系统的预期特征 漏 洞 判 定 约 束 分 析 检测结果 不安全串操作 库函数约束集 本方案的设计重点偏重于漏洞特征收集模块,旨在提高漏洞检测前期工作的 准确性,同时为整个检测工具提供一个形式化的框架。由于漏洞特征文法和这种 形式化框架的引入,使整个目标系统出现了许多新的特点: 在漏洞特征文法中,由于实现了漏洞特征的充分形式化表示( 书写产生 电子科技大学硕士学位论文 式) ,从而使词法、语法和语义工作分工明确,有助于算法实现的准确性; 使漏洞特征描述更合理,从而提高检测工具的性能。 由漏洞特征文法构造的语法分析器为整个检测工具提供了一个形式化的 框架。从方案实施角度看,文法的构造工作都是形式化的( 产生式的定义、 分解、重构) ,从而可以保证开发过程的可靠性,避免直接编码引起的一 些人为因素。 在漏洞特征文法设计过程中,由于实现了漏洞特征描述与普通c 语法的分 离,从而保证了语义分析工作( 漏洞信息登记、查询,漏洞判定等) 的针 对性。从检测工具的执行过程看,除了语法分析是全局性的以外,语义分 析工作仅在程序的特殊点( 漏洞语法成份得到归约时) 进行,从而避免一 些不必要的语义工作。而从方案实现过程来看,对语义的编码工作也可以 仅在整个文法的个别产生式处进行。 3 3 本章小结 本章提出了目标系统的设计思路,关键思想是引入一种既与c 文法等价,同 时又对漏洞特征具有检测能力的上下文无关文法。基于该文法,本章给出了方案 的设计框架和功能划分,并讨论了目标系统预期的一些特征。 1 4 第四章漏洞特征文法构造 第四章漏洞特征文法构造 本章提出并实现一种c 的等价文法:漏洞特征文法。该文法将普通c 文法进 行等价分划,使得对漏洞形式化特征的描述从c 语法中分离。由该文法构造的语 法分析器在工作过程中,可以保证那些具有漏洞特征的句型有独立的归约路径, 因此可以实现对漏洞语法特征的检测。 4 1 漏洞特征描述 对漏洞特征的充分分析和正确表达是漏洞检测工作的基础,本节分析c 语言 中栈缓冲区溢出漏洞的特征,为检测工作提供依据。 缓冲区溢出漏洞隐含在正常的d c + + 源码中,形式也多种多样,但从编译角 度看,它总包含词法、语法和语义成份m 。以下面的程序片断为例: c h a rb u m 1 0 0 】,b l l 舵 2 0 0 】; s 仃c p “b u m ,b u 丘2 ) ; 程序中,保留字c h a r ,变量名,常量,函数名,运算符等构成了漏洞的词法 成份;而字符缓冲的定义语句和非安全函数s 仃c p y 的调用语句都是漏洞出现的必 要语法成份;非安全函数调用与字符缓冲之间的依赖关系无法由上下文无关文法 描述,属于漏洞的语义成份。 上面例子虽然是最简单的情况,但直观上说明,不管漏洞出现的形式如何千 变万化,总可以用适当的词法、语法和语义来描述。 4 1 1 漏洞词法成份 保留字、标识符、常量以及运算符是c 语言中的基本词法成份。如果把它们 看作一个t o k e n 的集合,则可能导致栈缓冲溢出漏洞的词法成份是该集合的子集: 保留字;c h a r ( 仅考虑字符缓冲) ; 标识符:任意合法标识符( 参与字符缓冲的声明,不安全类型定义,不安全 函数定义等) ; 。 常量;任意常量( 参与字符缓冲的声明或指针运算) ; 电子科技大学硕士学位论文 运算符和声明符;“ ”和“】”( 参与字符缓冲的声明) ; “ ”( 参与字符指针的声明) ; “+ ”,“一”,“+ + ”,“一一”,“= ”等运算符( 参与缓冲区地址的运算) ; “( ”,“) ”( 参与不安全函数声明和定义) ; c 标准库中的不安全串操作函数名: 如:g e t s ,f 毫t s ,行e a d ,s c a n f ,v s c a n f v s c a n f ,g e t c h a r ,f 窑e t c ,r e “,s 仃印y , s 佃a c p y ,s t r c a t ,s 由m c a t ,s p r i n t f ,s n p d n t f v s p r i n t f ,m e m c p y ,m e m m o v e ,m e m s e t 等。 以上词法成份是缓冲区溢出漏洞出现的必要条件。因此,当它们出现时,需 做进一步的语法、语义分析进行判定;而它们不出现的地方,漏洞将必然不会发 生。 事实上,下面的漏洞语法特征描述,正是以这些词法成份为基础进行的。如 果用产生式表示漏洞语法规则,则以上t o k e n 必然出现在语法树的末端。 4 1 2 漏洞语法成份 前面已经描述,漏洞的词法成份仅是漏洞出现的必要条件,仅在词法一级对 漏洞特征进行分析,显然是不充分的;同时,分析工作就必然失去针对性,出现 大量的误报情况,r r s 4 和r a t s 工具就属于这种情况。为了精确描述,有必要从 语法角度分析漏洞特征。 首先观察几个含有溢出漏洞的程序片断: 片断l : v o i d f h i l o c h a rb u 珥l o o 】,x ; g e t s ( b u ; ) 片断2 : v o i d 缸l l o 第四章漏洞特征文法构造 d l a r b u f f 【l o o 】; f i | n 2 ( b u 固; v o i d 如n 2 ( c h a rb u f f l ) c h a rb u 忽 2 0 0 】; s 脚y ( b u f f l ,b 硼臣) ; ) 从以上两个片断可以直观看出,漏洞的出现依赖于两大关键因素:字符缓冲 的定义,以及对字符缓冲的不安全写操作。而两者都是可以用上下文无关文法描 述的,属于漏洞的语法成份。 进一步分析发现,片断1 中,字符缓冲的定义与不安全串操作局部于同一个 函数体,而片断2 中,两者并不在同一函数体中,有一个参数传递的关系。因此, 具有字符数组参数的函数定义,也属于漏洞的语法成份。 结合漏洞词法特征,推广我们的直观观察,可以归纳出漏洞的语法成份。为 此引入漏洞语法单元的定义: 。 定义:漏洞语法单元是漏洞特征中除语义成份外的文法描述,这种文法描述 一般以一组产生式的形式存在。 c 中的栈溢出漏洞语法单元包括: 1 1 所有局部串变量的定义( 函数体内的自动变量或函数参数,包括字符数组 和字符指针) ; 2 ) 不安全的类型定义( 含字符数组的结构体、联合体) ; 3 ) 通过t y p c d e f 定义的不安全类型( 字符数组、字符指针等的类型重定义) ; 4 ) 非安全函数定义( 指含有字符指针参数的函数) ; 5 ) 串不安全操作库函数的调用。 可以看到,当这些漏洞语法单元所对应的终结符串出现时,语法分析器可以 从形式上进行鉴别,但无法判断漏洞是否真正存在。进一步的判定工作只能由语 义分析来实现。 1 7 电子科技大学硕士学位论文 4 1 3 漏洞语义 当漏洞语法单元出现时,并不能完全判定一个漏洞的出现。因为一个完整的 漏洞特征隐含着这些漏洞语法单元问的依赖关系,这种关系无法用上下文无关文 法描述。这属于漏洞特征的语义部分。 v o i d 缸1 0 c h a rb u 珥1 0 0 】,x ; g e t s ( b u 哟; 再次观察上面的程序片断l ,之所以出现缓冲区溢出漏洞,不仅在于该函数中 有字符缓冲的定义和不安全库函数的调用,更重要的是,所定义的缓冲和作为函 数参数的缓冲是同一个实体。这种属性间的相等关系只能由语义分析来完成。 除了这种上下文依赖关系以外,漏洞语义特征还包括各种漏洞单元的属性, 如字符缓冲的名称、大小、不安全的自定义类型名称、缓冲大小等。 4 2 文法构造的目标 i t s 4 等以词法分析为基础的检测工具之所以不能准确判定漏洞,原因是不做 或只做少量的语法分析,从而导致漏洞特征收集不充分,并且导致后继漏洞语义 分析和判定工作也失去了依据。 本章将要构造的文法,其目标正是要实现漏洞形式化特征的充分、准确检测。 它一方面要完成对漏洞语法单元检测和提取的任务,另一方面,还为后继漏洞语 义分析提供全局性的形式化框架,是实现目标系统的重要基础。 4 3 基于等价分划的漏洞特征文法生成 首先,普通的c 语法分析器是无法胜任漏洞检测任务的。分析a n s ic 文法可 以发现,那些具有漏洞特征的句型和其它不具有漏洞特征的句型往往有相同的归 第四章漏洞特征文法构造 约路径。因此,在语法分析器工作期间,当某个句型归约为一个非终结符时根本 无法判断该句型是否具有漏洞特征。 另一方面,使用上下文无关文法可以对4 1 节中定义的漏洞语法单元进行精确 描述,并且基于该文法描述可以生成一个识别它们的语法分析器。但这种分析器 也无法实现漏洞检测。这是因为,漏洞语法单元是c 完整语法的子集,仅能识别 子集的分析器显然是不能工作的。 因此,问题归结为如何构造这样一种分析器: 能够识别c 文法的所有句型( 与c 文法的等价性) 可以将漏洞语法单元与其它普通句型区别对待( 对漏洞的敏感性) 其设计思路是:在c 文法中,将那些与漏洞语法单元有关的产生式进行分解 和重构。当最终分析器工作时,使得具有漏洞特征的句型沿一条独立的路径进行 归约,换言之,当某个非终结符串沿该路径归约时,就必然可以判定它是一个具 有漏洞特征的句型。 4 3 1 文法规则等价分划的集合描述 为了实现上述思路,我们从集合论角度对上下文无关文法进行一些分析,为 后面的等价分划找到依据。 产生式与集合运算的等价性 从集合论的角度看【4 耵,文法规则中的任意非终结符定义了一个终结符串的集 合;“i ”等价于集合的“并”运算;终结符或非终结符的顺序书写等价于集合的 笛卡儿积运算。 以下面的文法规则为例: e x p c x po pe x p i ( e x p ) i n u n l b e r o p 一+ 卜i + i 可以给出文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 开学第一课心理健康教育
- 2023年都市情感行业洞察报告及未来五至十年预测分析报告
- 高低压考试试题及答案
- 建筑制图基础A电大考试试题及答案
- 2025年热障涂层项目分析及研究报告
- 建筑水暖考试试题及答案
- 空乘妆容考试试题及答案
- 叉车常识考试试题及答案
- 河源社工考试试题及答案
- 电力二建考试试题及答案
- 小学生摄影课件
- 2025(标准)承包清工劳务合同协议书范本
- 儿童口腔科诊疗与护理
- 半导体semi F81 中文版
- 铁路安全知识进校园
- 课题开题报告:现代产业学院内部治理结构研究
- 公司员工培训计划表格模板(按类别分类)
- 合伙入股协议合同范本
- 2025年重庆市合川区事业单位招考聘用乡村振兴人才高频重点模拟试卷提升(共500题附带答案详解)
- TNAHIEM 133-2024 家用和类似用途饮用水处理装置用矿化滤芯
- 2025年陕能榆林清洁能源开发有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论