




已阅读5页,还剩51页未读, 继续免费阅读
(计算机软件与理论专业论文)c程序安全漏洞及检测方法的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 c + + 程序中常见的安全漏洞及其静态检测方法的研究是本论文研究的课题,它 是c c + + 程序安全模式研究的一部分。本文致力于完成c + + 程序中常见的安全漏洞 的查找和分析,以及对这些安全漏洞的静态检测方法的设计和实现,以期达到通 过静态分析检测出c + + 源程序中可能的安全漏洞的目的。 首先,在对c + + 语言和相关文献进行分析研究的基础上,本文从c + + 语言机制 的多个方面提出了多种c + + 程序中常见的安全漏洞,对每种安全漏洞均编写了程序 实例以验证漏洞的存在和危害,撰写了实例的分析和测试报告;接着,根据本课 题安全分析的整体框架和思路,提出对安全漏洞的分类;最后,结合程序分析提 供的接口和信息,在抽象语法树的基础上,论述了安全漏洞的检测方法和设计思 想。 关键字:c + + 安全漏洞安全模式静态检测安全分析 a b s t r a c t t h i sp a p e rd e a l sw i t hc o r f l n 2 0 ns a f e t yv u i n e r a b i l i t i e sa n d t h e i rd e t e c t i n gm e t h o d si n c + + p r o g r a m ,w h i c hi s ap a r to ft h es t u d yo fs a f e t yp a t t e mi nc c + + p r o g r a m t h i s p a p e r i sd e d i c a t e dt o f i n d i n g a n da n a l y z i n gc o n l m o ns a f e t yv u l n e r a b i l i t i e s i nc + + p r o g r a m ,d e s i g n i n g a n d i m p l e m e n t i n g t h e d e t e c t i n g m e t h o d sf o rt h e s e s a f e t y v u l n e r a b i l i t i e s i no r d e rt os t a t i c a l l yd e t e c tp o s s i b l es a f e t y v u i n e r a b i l i f i e si nc + + p r o g r a m b a s e do nt h ea n a l y s i sa n ds t u d yo f 也ec + + p r o g r a m m i n gl a n g u a g ea n dr e l a t e d d o c u m e n t s ,s o m ek i n d so fs a f e t yv u l n e m b i l i t i e sa t ep r e s e n t e di nt h i sp a p e r , w h i c h a r e f r o ms e v e r a lc + + l a n g u a g em e c h a n i s m s f o re a c hs a f e t yv u l n e r a b i l i t y , a t e s tc a s ew i t h s a f e t yv u l n e r a b i l i t yi sp r o g r a m m e d t ov e r i f yt h ep r e s e n c ea n dh a r mo ft h ev u l n e r a b i l i t y , t h e nt h et e s ta n da n a l y s i sr e p o r ti sw r i t t e n s e c o n d ,a c c o r d i n gt ot h ew h o l e a r c h i t e c t u r e a n dt h o u g h t w a yo fs a f e t ya n a l y s i s o ft h e p r o j e c t ,t h e s es a f e t y v u l n e r a b i l i t i e sa t e c l a s s i f i e d f i n a l l y , u s i n g t h ei n t e r f a c ea n dp r o g r a mi n f o r m a t i o np r o v i d e dw i t hb y p r o g r a ma n a l y s i s ,c o m b i n e dw i t hs p e c i f i cn o d eo fa b s t r a c ts y n t a xt r e e ,t h e s t a t i c a l l y d e t e c t i n gm e t h o d s f o rt h e s es a f e t yv u l n e r a b i l i t i e sa n d t h e i rd e s i g na r ea l s od i s c u s s e d k e y w o r d :c + + s a f e t yv u l n e r a b i l i t y s a f e t yp a t t e r n s t a t i cd e t e c t i o ns a f e t ya n a l y s i s 创新- 眭声明 本人声明所呈交的学位论文是我个人在导师的指导下进行的研究工作及取得 的研究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论 文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得西安电子科技 大学或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研 究工作所做的任何贡献均已在论文中作了明确的说明并表示了谢意。 申请学位论文若有不实之处,本人承担一切相关责任。 本人签名:盔盘王l :q g y :至蚍l :i 三 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究 生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学。本人保证毕 业离校后,发表论文或使用论文工作成果时署名单位仍然为西安电子科技大学。 学校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全 部或部分内容,可以允许采用影印、缩印或其他复制手段保存论文。 本人签名: 导师签名 奎建王 苎:悭 日期:2 0 必! i ! 日期:壁! 厶j 第一章绪论 第一章绪论 1 1 研究背景 随着软件技术和网络技术在各个行业的广泛应用,以及以l i n u x 操作系统为标 志的自由软件的大量存在和应用,软件安全,特别是军事领域软件的安全已越来 越受到人们的重视。由于计算机的安全性隐患( 包括无意的和人为的) 大量存在 于软件系统中,如系统入侵、信息窃取、病毒,以及由于程序设计语言和软件程 序自身存在的问题而造成的各种安全漏洞等,使得在软件的使用过程中会发生意 想不到的错误,从而造成重大损失。 对于自主开发的软件,主要通过测试的方法检查所有可能的不安全因素。这需 要对软件的功能、特性等具有深刻了解,并且根据软件特性设计完备的测试集, 但这种方法需要消耗大量的人力和物力。因此,如何能在程序静态不运行时自动 检测出软件源程序中存在的一些安全性问题,避免不必要的损失,成为当前计算 机安全领域中需要研究的一个重要课题。 本文工作源自于“十五”预研课题“软件安全性故障模式分析”。该课题主要研究 被广泛应用的程序设计语言c c + + 的程序分析技术和面向不同领域的软件安全模 式构建技术,最终提供一组与安全分析相关的方法,并研制出一个基于静态分析 的软件系统安全检查工具。该工具相当于一种辅助编译器查错的分析工具,可以 检查出那些表面上符合语法要求,但很可能是潜在的、不易发现的错误,在代码 审查( c o d er e v i e w ) 和软件测试之前发现程序中隐藏的错误,节省测试时间,提高 代码质量,避免不必要的损失。 国内外在软件的安全性分析领域做了大量的研究工作,提出了一些可行的静态 的安全性分析方法,并且构造了相应的软件安全性漏洞的静态检测工具。现有的 静态的安全性分析方法有基于形式化验证的定理证明f t h e o r e mp r o v i n g ) p a “”1 1 0 ”i 和模型检验( m o d e lc h e c k i n g ) i m c m 蜘豳”】l c “q o i t c o r 0 0 1 ,基于词法分析的安全性扫描【” ”】( w 脏0 3 r a t ”1 ,基于语法和简单语义分析的安全性检查肿”】【5 “1 ,以及信息流验证 和检测方法 d e ”7 l 【8 “”1 等。 但是这些方法各有利弊,存在适用范围较小、分析能力和检测能力受限等问题。 目前现存的安全性分析工具多是分析c 、j a v a 语言的,由于诸方面的原因,缺少 分析c 抖语言的工具。 1 。2 课题的方案 本课题确定的研究方案如图1 1 所示。此框架的特点在于它将与安全相关的具 2 e + + 程序安垒滚淀及梭瓤方法躲磷究 体模戏从程序分析中剿离出来,从 嫩以不同的方法解决最适食解决的问题。 圈1 1 简化的蜜企性分析模型 阂为,c + + 是赣褥系统较锌豹圭瀛语言,e 忿+ 潺言在众多领域褥虱了板凳广 泛的应用,同对c c + 十由于其自身的谮言特性,在为汗发人员提供对系统底层( 如 对蠢资,癸莰) 离效瑟活翡藏裁戆力黪霜露,瞧豢来了一警瀣在懿安全往阕熬( 热 内存管理缺陷) 。因此,本文选择c 地十+ 语害编写的源程序作为分析的目标。c 语 言嫠瀑法上怒c + 诿富熬子熊,奉戈褥c ,e + 程露统一当佟e + + 程穿来筵疆。 从图1 1l 可以看出,本课题的安黛分析横型主要商两部分组成:程序分析和安 全努辑。程窿努辑燕整令分辑工螽懿藏溃,逶过怼c c + + t 獬港褥分橇鲑理, 从程序中提取信息,并为安念分析提供使用这些信息的接口。安全分析是整个分 掇王爨懿器端,圭簧是摄援寝全蔽鼷寒竞威辩程痔孛安全潺溪熬检测。 程序分析是安全性检查的基础。根据不同的安全漏洞和对应的蜜全模式,程 痔分叛霹鞋褒溺法、溪法、涟义等强砖级剐上进行。萋予过撵豹传绫程序分叛方 法已经很成熟,如词法分析、语法分析、控制流分析、数据流分析等。 黠于程露分折灼秘突,翅重予以下三令方嚣:害孥抟绂的程痔分辑按零( 特别 是控制流和数据流分析) 向面向对象的程序设计语言扩展;寻求当分析规模和复 杂搜惫裁增加熬壤壤下降低程嶷分爨复杂度鳃方法;磅究与实瑗将不慝的安全 性规则嵌入不同的程序分析巾的方法。 安全分辑是安全性检查的核心。安全分橱的鐾鳃是剥粥程序分耩扶程序源代 码中得到的信息,也可以直横使用从程序滚代码中提取的信息,使用语法分析和 语义分板,势结合从安全漏涌中抽象出的安全规则,检查程序源代码中可能的灌 第一章绪论 在的安全漏洞。 对于安全分析的研究,主要包括以下三方面:安全漏洞的查找、分析,并 编写含有相应的安全漏洞的程序实例,以验证这些漏洞的存在和危害:按照安 全分析的整体框架和思路,结合程序分析提供的接口,提出对安全漏洞的分类, 设计安全漏洞的检测方法:安全分析与安全模式的结合,即如何将安全规则嵌 入到安全分析过程中,以实现对各类安全漏洞的检测。 1 3 论文的主要工作 课题研究“软件安全性故障模式分析”,最终是要研制出一个基于静态分析的软 件系统安全检查工具。根据我们确定的方案,如图1 1 所示,课题的研究主要包括 两方面的内容:程序分析部分;安全分析部分。 程序分析是对源程序进行数据流分析和控制流分析以获取程序中数据流和控 制流信息的一个过程。在软件的安全性分析中程序分析负责提取程序中某些信息, 以便和安全性规则相匹配,发现其中的安全性漏洞。程序分析包括控制流分析, 数据流分析,依赖分析等。程序分析部分还负责为安全分析部分提供可利用的接 口,以方便安全分析部分对程序分析部分生成的信息的使用。 安全分析也对源程序进行不同程度的词法分析,语法分析,和语义分析,从源 程序中获得与安全漏洞直接相关的简单信息,检查程序是否符合与安全漏洞相对 应的安全规则,从而达到对软件系统安全性检查的目的。 本论文所做的工作是课题“安全分析”部分的内容,主要研究内容包括: 1 c + + 程序中常见的安全漏洞的查找;并且对c + + 程序的漏洞查找,侧重于 类的机制( 构造、析构、拷贝构造、赋值、数据成员、成员函数) 、运算符重载、 对象作参数的传递等方面。 2 编写含有相应的安全漏洞的程序实例,对实例进行测试( 以验证这些漏洞 的存在和危害) ,撰写实例的分析和测试报告; 3 在2 的基础上,对安全漏洞进行分析、分类; 4 与安全漏洞对应的安全规则的生成,安全漏洞检测方法的设计和实现。 第二章安全分析 第二章安全分析 2 1 程序分析 在对c + + 源程序进行安全分析( 安全漏洞检测) 前,通常需要对源程序进行程 序分析。程序分析的作用是从源程序中提取安全分析所需的有用信息,为安全分 析提供获得源程序中漏洞及相关信息的接口和方法,以方便安全分析对源程序的 操纵。 程序分析是对源程序进行词法分析、语法分析、语义分析,获得程序中的一些 特定信息,其中比较重要的信息包括控制依赖信息、数据依赖信息、指针别名信 息,相应地,生成控制依赖图、数据依赖图,并最终生成程序依赖图。程序分析 可分为过程内的、跨过程、面向对象的程序分析,它包括传统的程序分析( 即数 据流分析、控制流分析、指针别名分析) 和传统的程序分析技术向面向对象的程 序设计语言的扩展。程序分析可广泛应用于程序的调试、测试、排错、理解、维 护以及并行性检测和复杂性度量等方面。 本课题的程序分析部分采用了一种中间表示的技术,即首先把源程序翻译成 种独立的中间表示,这种中间表示使用一定的数据结构,可以很方便地进行查找; 然后在中间表示的基础上进行程序分析和安全分析。这样做的好处是:有利于重 定目标;还可以降低分析的复杂度和提高分析的效率。在编译器设计中,由于中 间表示和具体的机器特性无关,把用于新机器的后端加到现成的前端上,可以得 到适用于不同机器的编译器。而在程序分析中,通过对各种语言编写不同的前端, 共用同样的后端,可以得到能够分析多种语言的分析工具。在程序分析中使用中 间表示还能大大降低复杂性,减少出错。 经过认真的研究论证,本课题使用了一种常用的中间表示格式:抽象语法树 ( a b s t r a c ts y n t a xt r e e ,a s t ) ,它是语法分析树( p a r s i n gt r e e ) 的简化形式,用 于描述语言结构的自然层次关系。对输入的c c + + 源程序,本课题借助于g c c ( g n uc o m p i l e rc o l l e c t i o n ) 的前端解析该程序,执行词法、语法和语义分析,生 成程序的抽象语法树。 程序分析和安全分析均是在抽象语法树的基础上进行。 2 2 安全分析 2 2 1 软件安全 “安全”在英文中有两个词:s a f e t y 和s e c u r i t y a a “”,但是它们有各自不同的含 义。s a f e t y 通常指免受意外事故和损失,s e c u r i t y 是指系统保持机密性和不允许恶 6 e + 程亭安全瀑潺及捡测方法懿磷突 意干扰的能力。两者的区别是,s a f e t y 关注的是防止系统对岁 部环境造成破坏,如 控制系统中软件的设计失误造成的火箭损毁域人员伤亡;而s e c u r i t y 关注的舞日是保 护系统不受夕 部环境的破坏,如黑鬻侵入软件内部修改系绕重要数据或窃取系统 机密信息。w 用图2 1 来表承两者韵区剐: 蚕2 is a f e t y 辅s e c u r i t y 本课题研究的软件安全,指的题s a f e t y ,即如何提高软件程序自身的安众性 毯避兔圭予软舞蠢隽豹编稳设计阔瑟瑟萼l 怒霪犬事数凌灾愍。 2 2 2 安全漏洞 c c + + 语言是目前广泛成用的程_ i 葶设计谮言,犬最的软件都是以它为主鼹的程 牟设计语富。这是踟于c 谣富自身肖其不鬻予其它语言静特点,鳐语言楚溘、使 用方便灵活、表达和运算能力好、硬件控制能力强、可移檬性好、程序执行效率 高等。c 手+ 谣言不鬣缝承了e 语富耱这些特性,蔼蔻在舞供了蘑惫对象鳃缡程税 制和泛型编棍( g e n e f i ep r o 辫a 删耐n 窟) 机制的同时,还提供了许多更为灵活的特性。 同嚣雩氇疰l 予语言耋隽静这些特性,特黧是e 语言戆翡类鏊梳裁,後褥c c * 淫程 序中比其它如a d a 、j a v a 源程序存在更多的安全漏洞。 安全满漓,是援源程痔审冒携逡袋安全程蘸漳蠡誊嚣豢。零漂霆臻究懿安垒添瀛, 主要是指能够通过编译器编译,但编译器发现不了的,潜藏在程序源代码中的能 g l 熬安全敬簿戆编糕獾误竣滚溪。稠懿: c l a s sw i d g e tf ;,燮w i d g e t 有默认的构造函数 w i d g e t w = n e ww i d g e t 1 噬; d e l e t ew : 霉g e n e r i cn o g r a m m l a g ,阐内毒两种译法:泛蓬灌序搜幸 ( 觅潘爱辩译e h - p r i m e r 串定旋、髅捷译避 型编樱与s t l ) 和通用型程序设计( 见袭宗燕译a 斗糕序设计语甯( 特别j 畿) ) 第二章安全分析 以上代码看上去井然有序,使用了r i e w ,并且搭配使用了d e l e t e 。同时,也能 够通过编译器的编译。但是,它却隐含有严重的错误:根据c + 十标准陴,对使用 n e w ( 读作a r r a y n e w ) 生成的指针,使用d e l e t e 而不是d e l e t e 1 ( 读作a r r a y d e l e t e ) 属于未定义的行为( u n d e f i n e db e h a v i o r ) ,可能会导致使用错误的程序结构或错误 的数据。c + + 标准对未定义行为没有做出明确的规定,不同的编译器将会采取不同 的动作。因此,未定义行为都属于危险行为。附录a 中列出了一个完整的安全漏 洞的例子。 我们参阅了大量的文献资料,分析研究了多种安全相关的标准和指南,最终确 定以 n a s a 软件安全指南”娜嘲中c c + + 语言的安全漏洞的分类方法为基础进行 安全漏洞的分析。具体考虑的因素有以下方面: ( i ) 可能造成安全漏洞的c 语言特性 1 指针; 2 缺乏边界检查: 3 浮点数的运算: 4 v o i d * 指针的转型; 5 全局变量; 6 副作用和宏; 7 c 语言的动态内存管理; 8 隐式类型转换: ( 2 ) 可能造成安全漏洞的c + + 语言特性 1 类的构造、析构和赋值; 2 类的不完全封装; 3 继承和虚拟( 多态) : 4 c 抖语言的动态内存管理; 5 异常处理: ( 3 ) 一般的程序设计错误 1 程序控制流错误; 2 多进程控制错误; 需要指出的是,由于软件系统,特别是分布式环境的软件系统的多样性和复杂 性,使得安全性漏洞种类繁多;同时,也由于c ,c 抖程序源代码中某些安全性漏 洞的特殊性,不可能解决所有的问题。因此,本课题的主导思想不是找出c c + + 源程序中所有可能遇到的安全漏洞,而是找出那些典型的、常见的且危害性大的 安全性问题。 c + + 程序安全漏洞及检测方法的研究 2 2 3 安全分析 安全分析是指按照一定的安全漏洞的分类策略,使用一定的安全漏洞的检测方 法和技术,结合程序分析从程序源代码中提取的有用信息,分析并检测出潜藏在 程序源代码中的安全漏洞的过程。程序分析的输入是程序源代码,通过分析程序 源代码并从中提取出程序的基本信息,生成程序的符号表、数据流图、控制流图、 类层次图,并为安全分析提供获得这些信息的接口和方法。与程序分析不同的是, 安全分析则综合考虑从程序源代码中的直接获得的简单信息、程序分析提供的复 杂信息、各类安全漏洞的表现形式及其检测方法,从整体上寻求各类安全漏洞的 最合适检测方案。 安全分析的主要作用是为安全漏洞的检测提供安全分析的整体框架,安全漏洞 的检测在此框架内进行。这样做的好处是,将来添加更多的安全漏洞时,只需在 此框架内添加新的安全漏洞的检测方法。而不影响原有的检测方法的实现,充分 保证系统的可扩充性和各类漏洞检测之间的独立性。 安全分析的主要内容是安全漏洞的检测。程序源代码中的安全漏洞,多是由于 程序在语法或语义上不符合安全规则造成的。因此,对安全漏洞的检测,一部分 可以使用语法分析的方法,并结合程序分析提供的信息,如程序的类层次结构图 等,匹配一定的安全规则,不符合安全规则的程序就视为存在错误( 漏洞) :另一 部分安全漏洞,单独使用语法分析的方法尚不能检测出来,可以继续进行必要的 语义分析,在检查程序的语义正确性的同时,匹配一定的安全规则,不符合安全 规则的程序就视为存在错误( 漏洞) 。 2 3 安全模式和安全规则 安全模式,即安全故障模式,是对安全漏洞的形式化描述。安全模式是对安全 漏洞本质的抽象,抽象的目的是寻求合适的对安全漏洞本质的表示方法,以达到 通过安全模式检测出一类安全漏洞。不同安全漏洞的抽象层次可以不同,理想的 情况是用形式化描述的方法。 安全模式的构建。需要对各种安全漏涧进行分析归纳和总结,根据安全漏洞的 不同特点,采用不同的方法对其进行形式化描述。例如:对于语法问题,可以采 用文法产生式的方式描述;对于静态语义问题,可以采用语义属性的方式描述; 对于动态语义问题,可以采用指称语义方式描述等等。安全模式的作用是通过归 纳总结抽象出安全漏洞的本质,为安全漏洞的检测提供指导和依据。 安全规则是安全模式在软件安全分析器中的实现。构建安全规则的目的是为了 指导程序分析提取相关的信息,和作为对源程序进行安全分析时,即在安全漏洞 检测时判断是否存在安全漏洞所遵循的依据。 第二章安全分析 安全规则的构建与安全漏洞的检测密切相关。构建安全性规则的基础是寻找各 种不同的安全漏洞,并分析归纳总结出这些安全性漏洞的安全模式。根据安全性 漏洞的表现形式和在程序中出现的频度,以及对系统造成的危害程度,本文确定 若干种重要和具有代表性的安全模式,并根据这些安全模式的特征构建相应的安 全规则。但在本文中不是构建所有的安全模式,而是找出一些有代表性的安全性 问题,给出一种解决这些问题的普遍适用的方法,以对今后的工作具有指导意义。 第三章安全漏洞 第三章安全漏洞 3 1c + + 语言概况 c * 程序设计语言是由a t & t 贝尔实验室的b a l t l es t r o u s w u p 设计和实现的 8 “ ”l s “1 。这项工作始于1 9 7 9 年3 月,它最初的版本被称作“带类的c ”( cw i t h c l a s s e s ) ,即为c 语言加上了类似s i m u l a 语言的类机制。它最初的设计目标是为系 统程序设计提供c 语言那样的灵活性和高效性,同时也提供s i m u l a 语言那样的程 序组织功能( 通常指面向对象的编程机制) ,从而为大规模项目的开发提供一个更 好的工具。在1 9 8 3 年,“带类的c ”经过修改和扩展,加入了支持面向对象程序设 计的语言机制。同年1 2 月,正式定名为c + + 。在1 9 8 7 至1 9 8 9 年间,c + + 又加入 了支持泛型程序设计( g e n e r i cp r o g r a m m i n g ) 的语言机制。1 9 9 8 年8 月,i s o ( i n t e r n a t i o n a ls t a n d a r d i z a t i o n o r g a n i z a t i o n ) 的c + + 标准( i s o i e c 1 4 8 8 2 p r o g r a m m i n g l a n g u a g e s - c + + ) 正式通过。之后很长的一段时间内,c + + 标准保持稳 定,并且c + + 语言还将保持更长时间的稳定简”2 i 。目前,下一代的c + + 标准( c + + o x ) 的修订工作正在进行当中。 c + + 在近2 0 多年的演化发展过程中,一直在不断地增加或扩展新的抽象机制 和语言机制。目前的c + + 已经更加完善和更加强大,已经成为一种通用的程序设 计语言f s 8 ”】,它 一是一个更好的c , 支持数据抽象, 一支持面向对象的程序设计, 一支持泛型程序设计。 它支持的四种程序设计方法: 1 过程化的程序设计( p r o c e d u r a lp r o g r a m m i n g ) 2 基于对象的程序设计( o b j e c t e d - b a s e dp r o g r a m m i n g ) 3 面向对象的程序设计( o b j e e m d m f i e n t e dp r o g r a m m i n g ) 4 泛型程序设计( g e n e r i cp r o g r a m m i n g ) 但事实上,没有任何一种程序设计方法能够对所有的问题都提供最好的解决方 案。c + 十的这种做法带来一种明显的缺点是,使得语言过于庞大、复杂。这使得熟 练掌握并正确运行c + + 进行高效率高质量的程序开发时,经常会出现些问题。 3 2c + 十程序中常见的安全漏洞 针对c + + 编程中需要注意的问题和c + + 程序中经常出现的漏洞,结台课题的研 1 2 c + + 程序安全漏洞及检测方法的研究 究方向和实际进展情况,本论文提出并分析了c + + 程序中一些常见的安全漏洞, 并且集中在c + + 语言中类的机制( 构造、析构、拷贝构造、赋值、数据成员、成 员函数) 、函数重载、运算符重载、对象作参数的传递等这些方面。对于每种漏洞, 在编写程序实例以验证漏洞及其危害的基础上,均给出了漏洞的描述,分析,危 害和检查目的。附录a 是一个完整的安全漏洞豹实例。 3 2 1 类的构造函数和析构函数 3 2 1 1 单参数的构造函数 漏洞描述:单参数的构造函数,或有多个参数,但含有默认参数值,仅给出第 一个参数就能完成对象构造的构造函数,如果在声明的时候,没有声明为e x p l i c i t , 则可能会造成隐式类型转换。隐式类型转换是引起c ,c + + 程序中一些错误的原因 之一。 一个构造函数,如果只有个参数,那么,默认情况下,这个构造函数可以看 作是一个隐式的类型转换运算符,它可以在需要的时候自动她把它的参数转换成 这个类的一个对象。e x p l i c i t 是c + + 的一个关键字,它只能用在类内构造函数声明 的时候,而且它仅对单参数的构造函数起作用,它的作用是禁止隐式地调用类的 构造函数,从而禁止隐式的类型转换,即从该参数的类型到该类类型的隐式类型 转换。如 c l a s s s t r i n g 1 l e x p l i c i ts t r i n g ( i n tn ) ;预先分配n 个字节 s t r i n g ( c o l s tc h a r * px 用c 风格的字符串p 作为初始值 ) ; v o i d f ( s t r i n g ) ; 1 0 ) ;,编译错误:不能做隐式i n t - - s t r i n g 转换,也即不能隐式地调用 ,类s t r i n g 的s t r i n g ( h a tn ) 构造函数。e x p l i c i t 关键字起了作用。 f ( s t r i n g ( 1 0 ) ) ;正确:显式地调用了类的构造函数。 f ( c a r t h o r ,) ;正确:此处隐式地调用了类的第二个构造函数 s t r i n g ( c o n s tc h a r p ) ,因此,此语句等同于f ( s t r i n g ( a r t h o r ) ) 从v a & 程序片断- 7 p a 看出:如果类的某个构造函数只有一个参数,或者只给类 提供第一个参数的值( 其他的参数- 7 p a 带有默认参数值) 就能完成类的对象的构 造,那么,就会在需要的时候,自动地隐式地调用类的构造函数,进行隐式的类 型转换;如果单参数的构造函数在类内声明的时候,加上一个e x p l i c i t 关键字,那 第三章安全漏洞 么,所有的需要调用该构造函数的地方,都必须显式调用。然而,在一些时候, 这样的隐式类型转换不是我们想要的,不是我们所能控制的。由于它是自动地隐 式地进行的,所以可能产生一些意想不到的结果。 总结:如果类有单参数的构造函数,则检查这个构造函数是否声明为e x p l i c i t 。 3 2 1 2 构造函数的成员初始化列表中成员的初始化顺序 漏洞描述:成员初始化列表中成员的初始化顺序,如果和这些成员在类内声明 的顺序不一致,可能会导致严重的运行时错误。 成员初始化列表可用来初始化类的数据成员,它仅能用在类的构造函数的实现 时。当然,初始化类的数据成员的另一种方法是在构造函数内应用赋值操作。如: c l a s sn a m c p t r p u b l i c : n a m e p t r ( c o n s ts u i n g i n i t n a m e ,s t r i n g + i n i t p t r ) ; p r i v a t e : s t r i n gn a m e ; s t r i n g + p t r ; ) ; ,第一种初始化方式:成员初始化列表的方式 n a m e p t r :n a m e p t r ( c o n s ts t r i n g & i n i t n a m e ,s t r i n g + i n i t p t r ) 。 - n a r l e ( i n i t n a m e ) ,p 订( i n i t p t r ) ) 第二种初始化方式:在构造函数中赋值的方式 n a m e p t r :n a m e p t r ( c o n s ts t r i n g & i n i t n a m e ,s t r i n g + i n i t p t r ) n a m e = i i l i t n a m e ; p t r = i n i t p 蛾 ) 这两种初始化方式有重大的差别。从纯粹的程序角度来看,许多时候一定得使 用成员初始化列表的方式。例如,常量( c o n s t ) 成员和引用( r e f e r e n c e ) 成员就只 能使用成员初始化列表的方式,因为常量和引用是不能被赋值的a 如: c l a s sn a m e p t r p u b l i c : n a m e p t r ( c o n s ts t r i n g & i n i t n a m e ,s t r i n g + i n i t p t r ) ; 1 4 c + + 程序安全漏洞及检测方法的研究 p r i v a t e : c o n s ts t r i n g & n a m e ;必须通过成员初始化列表初始化该数据成员 s t r i n g + c o n s tp t r ;, 必须通过成员初始化列表初始化该数据成员 ) 但是,使用成员初始化列表经常遇到的一个问题是,在成员初始化列表中数据 成员的初始化顺序,经常与这些数据成员在类内声明的顺序不一致。然而,如果 这些数据成员的初始化值之间存在一定的依赖关系,那就可能产生意想不到的结 果。使用类内赋值则不会遇到这样的问题。如: c l a s si n t a r r a y p u b l i c : i n t a r r a y ( i n tl o w b o u n d ,i n th i g h a o u n d ) ; l | p r i v a t e : v e c t o r d a t a ;数组数据存储在v e c t o r 对象中 s i z e ts i z e ; 数组中元素的个数 i n ti b o u n d ,h b o u n d ;下限,上限 ) ; i n t a r r a y :i n a r r a y ( i n tl o w b o u n d ,i n th i g h b o u n d ) :1 b o u n d ( 1 0 w b o t m d ) ,h b o u n d ( h i g h b o t m d ) , s i z e ( h b o u n d - 1 b o u n d + i ) , d a t a ( s i z e ) 一个工业强度的i n t a r r a y 类,会对其构造函数的输入参数进行健壮性检查,以 确保其参数h i g h b o t m d 至少要大于或等于l o w b o u n d 。但除此之外,上面的程序片 断中还有两个非常隐蔽的错误:向量d a t a 的大小是无法判断的;整数s i z e 的 大小也是无法判断的。这是因为:成员初始化列表中数据成员的初始化顺序,是 以它们在类内声明的顺序来初始化的,而与它们在成员初始化列表中的出现顺序 无关。而在上面的i n t a r r a y 类的定义中,最先声明的数据成员是d a t a ,接着是s i z e , 最后才是l b o u n d 和h b o u n d 。因此,这些数据成员在初始化列表中的初始化顺序隐 含地是以这个声明顺序为准的。所以,上面的构造函数中,首先初始化的是d a t a 数据成员,接着初始化s i z e 数据成员,最后才初始化1 b o u n d 和h b o u n d 数据成员; 丽在初始化d a t a 对,s i z e 还没有被初始化,因此初始化d a t a 时使用的是未韧始化 的s i z e ,向量d a t a 的大小是无法判断的;同理,初始化s i z e 的时候,i b o u n d 和h b o u n d 还没有被初始化,因此s i z e 的值也是无法判断的。这就造成了初始化数据成员时, 第三章安全漏洞 使用了未初始化的变量的值。尽管在构造函数的初始化列表中初始化的顺序符合 意图,但其运行结果却是错误的。 准确地说,只有类的非静态数据成员才是以它们在类内的声明次序来初始化 的,而不是以它们在构造函数的成员初始化列表中的顺序;同时,基类的数据成 员永远在继承类的数据成员之前初始化。所以,如果运用了继承机制,还应当确 保在成员初始化列表的最前端就初始化基类的数据成员。 总结:检查类的构造函数的成员初始化列表中成员的初始化顺序,是否和它们 在类内声明的顺序相同。 3 2 1 3 多个构造函数时可能出现的问题 漏洞攒述:当类有多个构造函数时,如果这些构造函数初始化的数据成员的个 数和方式不一样,就可能导致使用这些构造函数产生出的对象的状态不一致,从 而在使用这些对象时产生错误。 类通常有多个数据成员,类也可以有多个构造函数。在构造函数中,人们通常 只为提供了参数值的数据成员设定初始化值,而对那些没有提供参数值的数据成 员置之不理。但是,在对象构造完成以后,又开始通过对象的成员函数使用对象 的这些数据成员,这必然会造成程序运行时的漏洞或错误。例如下面的代码: c l a s sb o o k p u b l i c : b o o k ( c o n s t c h a r + b k n a m e c o n s tc h a r + b k a u t h o r ) ; b o o k ( c o n s tc h a r + b k n a m e c o n s tc h a r + b k a u t h o r , c o n s tc h a r + b k p r e s s ,f l o a t b k p r i c e ) ; b o o k 0 ; v o i d p r i n t ( ) ;打印图书的详细信息 f f p r i v a t e : c h a r * n a m e ; 书名 c h a r * a u t h o r ;作者 c h a r * p r e s s ; ,出版社 f l o a t p r i c e ;定价 ) ; 构造函数1 b o o k :b o o k ( c o n s tc h a r + b k n a m e ,c o n s tc h a r + b k a u t h o r ) 1 6 c + + 程序安全漏洞及检测方法的研究 i f ( b k n a m e & b k a u t h o r 、 n a m e 2 n e w c h a r s t r l e n ( b k n a m e ) + 1 】; a u t h o r = n e w c h a r s t r l e n ( b k a u t h o r ) + 1 ; s t r c p y ( n a m e ,b k n a m e ) ; s t r c p y ( a u t h o r , b k a u t h o r ) ; ) e l s e n a m e= n e w c h a r 1 ; a u t h o r = n e w c h a r 1 ; + n a m e = 0 : + a u t h o r2 o : ) ) 构造函数2 , b o o k :b o o k ( c o n s tc h a r + b k n a m e ,c o n s tc h a r + b k a u t h o r , c o n s tc h a r + b k p r e s s ,f l o a t b k p r i c e ) :p r i c e ( b k p r i c e ) i f ( b k n a m e & & b k a u t h o r & & b k p r e s s ) d a m en e w c h a r s t r l e n ( b k n a m e ) + l 】; a u t h o r = n e w c h a r s t r l e n ( b k a u t h o r ) + 1 】; p r e s s = n e wc h a r s 缸l e n ( b k p r e s s ) + l 】; s g c p y ( n a m e ,b k n a m e ) ; s t r c p y ( a u t h o r , b k a u t h o r ) ; s t r c p y ( p r e s s ,b k p r e s s ) ; ) e l s e n a m e= n e w c h a r 1 ; a u t h o r = n e w c h a r 1 ; p r e s s = n e w c h a r 1 ; + n a r f l e = 0 : * a u t h o r = o : + p r e s s 2 o : ) 第三章安全漏洞 b o o k :- b o o k 0 d e l e t e 】b o o k n a m e ; d e l e t e b o o k a u t h o r ; d e l e t e b o o k p r e s s ; v o i db o o k :p r i m o t o u t ”b o o kn a m e :” n a m e e n d l ; g o u t ”b o o ka u t h o r :” a u t h o r e n d l : t o u t ”b o o k p r e s s :”印r e s s e n d l ; e o u t ”b o o k p r i c e :” p r i c e ( ”y u a n ” d a t a 和r h s d a t a 指向的都建同一内存,当d a t a 被删除时, 也邸r h s d a t a 被嬲豫。 因此,对于自定义的复制运算符,需要簌赋值运算符函数中检查“自己给自己 赋馑”,并且一曼发现逸秘特况裁立即返霞。有一令问题是怎么凝断锈个对象是相 同的? 在c + 十程序中,经常使用下西这种方法判断两个对象是否是闷一个对象: 在类型枢网的情提下,看它们的内存地蛙是否相嗣。在这种定义下,两个对象只 有在占用相同地址的情况下,才认为它们是闷一个对象。这种方法比较容易蜜现, 速度也比较快。下面是一种赋值运算祷的一般形式: c & c :o p e r a t o r = ( c o n s tc & r h s l 捡态是否”自己给自己赋值” i f ( t h i s = & r h s 、r e t u r n t h i s ; 其他工作 ) 总绪:在自定义豹斌值运算符中。检查“自己给自己赋值”。 3 2 2 。3 赋擅运算符的实现问题二 漏洞描述:在类的赋篷运算锊中,应当为类的所有数据成员繇赋值。否则,出 于给类的赋德的不完整性和不一致性,会产生错误。拷贝构造函数也同样适用于 姥描述。 很多时候,需要类编写自己的赋德运算符函数,丽不是依赖编译器自动戋成的 赋馕运算特。在编写赋值运算籀函数黠,凝据赋
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 轻巧夺冠高二数学试卷
- 烟囱道施工方案(3篇)
- 活动策划方案100字开头(3篇)
- 水泵销售促销活动方案策划(3篇)
- 餐饮开学季活动策划方案(3篇)
- 北京市朝阳区2023-2024学年七年级上学期期末质量监测历史试卷及答案
- 安徽省芜湖市繁昌区2023-2024学年高一下学期第一次月考语文试题含参考答案
- 2025年7月安恒信息网络安全月报(精简版)
- 小学学霸作业题目及答案
- 在线教育课程制作指南
- 融资入股合作协议
- 上门按摩项目创业计划书
- 模块三 环境感知技术
- 基本无害的计量经济学:实证研究者指南
- 锦联铝材自治区
- 2021起重设备安装工程施工及验收标准
- 中药制剂检验技术题库+参考答案
- 汽车美容(劳动)单元六-汽车电子设备安装课件
- DSM-V美国精神疾病诊断标准
- 井口工具课件
- 劳动防护用品使用安全检查表
评论
0/150
提交评论