




免费预览已结束,剩余48页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘 要 I 基于静态分析的安全代码检测 【摘要】 随着软件应用规模的日益扩大和软件应用环境的日益复杂,保障软件质量是一 个必不可少的系统活动,贯穿整个软件开发过程;它的一个重要原则就是缺陷发现的时间越 早越好,缺陷被遗漏到下一阶段将使得修复缺陷的成本扩大到原来的 510 倍,甚至造成无 法修复的局面。根据静态分析的创始者 M.E.Fagan 的统计,在设计和编码阶段的软件静态分 析可以发现软件 3070的缺陷。 随着计算机辅助技术的发展,手工静态分析开始向计 算机自动静态分析发展。 论文首先介绍了安全代码检测的两种方法:动态分析和静态分析; 接着详细分析了静 态分析的所需的技术,如模型建立和分析算法,并举例说明静态分析的手工检测过程;最后 论文在研究现有静态分析技术与理论的基础上,针对 Java 面向对象语言的特性,利用 JavaCC 解析器生成源代码的抽象语法树,给出了以抽象语法树为基础的软件静态分析模型, 阐述了该工具中各个模块的设计与实现方法,从而提高软件质量和评审效率。 【关键字】 安全代码 静态分析 JavaCC 抽象语法树 规则库 Abstract II Secure Code Test Based on Static Analysis Abstract As the scale of software applications grows increasingly, meanwhile the applications situation becomes more complex, protecting software quality is an indispensable system activity ,which is through the whole software development process. One of most important principle is that the earlier the faults are detected the better the result will be ,for adjusting cost will extend to five to 10 times as much as former if rectifying is delayed to next phase, what s worse ,it will induce an unable recover situation. According to the statistics provided by the founder of static analysis , M.E.Fagan, 30 percent to 70 percent of faults are detected in the design and coding phase. With the development of computer-assisted technology, computer automatic static analysis are replacing manual static analysis step by step. This dissertation is about static analysis. First of all, it introduces the concept of secure code and the principles of writing secure code as well as two methods detecting secure code: static analysis and dynamic analysis. Secondly, it deeply analyzes the techniques that static analysis needs, for example constructing models and analysis algorithms. Then illustrates the manual static test process. Whats more, based on the research of static analysis techniques and theory, and according to the java languages object-oriented character ,by using abstract syntax tree producing by JavaCC , it proposes a static analysis model basing on AST, and implementation method of some crucial modules, improving software quality and efficiency assessment. Key word Secure Code Static Analysis JavaCC Abstract Syntax Tree Rulesets 目 录 III 目 录 第一章 绪论 1 1.1 选题背景和研究意义 .1 1.2 研究现状 .2 1.3 论文的研究内容和组织结构 .2 第二章 安全代码的简介 4 2.1 编写安全代码的原则 .5 2.2 安全缺陷的分类 .6 2.3 安全代码检测的方法 .6 2.3.1 静态分析 .7 2.3.2 动态分析 .9 2.3.3 静态分析与动态分析的关系 .9 2.4 小结 10 第三章 静态分析原理 .11 3.1 静态分析工具所需的技术 11 3.1.1 程序模型的建模 11 3.1.2 分析算法 15 3.1.3 安全规则定义 17 3.1.4 结果输出 19 3.2 实例分析 19 3.3 小结 22 第四章 Java 安全代码检测系统的设计 23 4.1 系统的总体设计 23 4.2 核心子模块的设计 25 4.2.1 源代码分析器 25 4.2.2 规则库的建立 27 4.3 小结 36 第五章 Java 安全代码检测系统的实现 37 5.1 开发环境 37 5.2 关键模块的实现 37 5.2.1 源代码分析器的实现 37 5.2.2 规则库的实现 40 5.2.3 结果输出 42 5.3 小结 43 第六章 总结与展望 .45 6.1 总结 45 6.2 展望 46 目 录 IV 致谢47 参考文献48 CONTENTS 5 CONTENTS Chapter 1 Forword1 1.1 The Background and Research Significance.1 1.2 Research Situation 2 1.3 Reasearch Content and Structure of the Dissertation.2 Chapter 2 Introduction to Secure Code 4 2.1 Principles of writing Secure Code5 2.2 Categories of Secure Faults6 2.3 Methods of Secure Code Testing6 2.3.1 Static Analysis.6 2.3.2 Dynamic Analysis9 2.3.3 Relations between Static and Dynamic Analysis.9 2.4 Brief Summary.10 Chapter 3 Theory of Static Analysis .11 3.1 Technologies Used by Static Analysis Tools.11 3.1.1 Establishing Program Model11 3.1.2 Analysis Arithmetic15 3.1.3 Secure Rules Principles Definition 17 3.1.4 Results Output19 3.2 Instance Analysis.19 3.3 Brief Summary.22 Chapter 4 Design Secure Code Test System of Java 23 4.1 System Frame Design.23 4.2 Kernel Sub-Module Design25 4.2.1 Source Code Analyzer.25 4.2.2 Rulesets Design 27 4.3 Brief Summary.36 Chaper 5 Implementation of Secure Code Test System of Java37 5.1 Development Environment 37 5.2 Implementation of Key Modules 37 5.2.1 Implementation of Source Code Analyzer.37 5.2.2 Rulesets Establish.40 CONTENTS 6 5.2.3 Results Output.42 5.3 Brief Summary 43 Chaper 6 Summary and Prospect 44 6.1 Summary .44 6.2 Prospect.45 Acknowledgements.46 References .47 基于静态分析的安全代码检测 1 第一章 绪论 进入 Internet 时代,应用程序正呈现高度互联的趋势。安全问题成了社会关注的焦点。 传统的安全解决方案存在缺陷,防火墙、病毒防护和入侵侦测服务已经不能保护那些没有防 护措施和易受攻击的软件免受外部的攻击。近几年,软件漏洞呈增长趋势1。 1.1 选题背景和研究意义 2003 年 8 月 12 日,利用 MS03-26 漏洞的“冲击波”蠕虫病毒开始在全世界范围内爆发, 造成巨大破坏。在国内,两天时间里就使数千个局域网陷于瘫痪状态,受害者中既包括几十 人的小规模企业,也有电信、政府等大型事业单位。而且个人用户,尤其是使用宽带网的用 户,也遭到了此病毒的攻击。在感染此病毒后,会造成系统反复重启、不能收发邮件、无法 浏览网页等影响,导致无法正常工作,给企业和个人都造成了巨大的损失。 2004 年 5 月 1 日, “震荡波(Worm.Sasser)”病毒在网络出现,该病毒也是通过系统漏 洞进行传播的,感染了病毒的电脑会出现系统反复重启、机器运行缓慢,出现系统异常的出 错框等现象。 2007 年度全球网络安全威胁和漏洞趋势统计研究报告显示,2007 年严重安全漏洞比 2006 年增加了 28%,同时安全漏洞纰漏的公司主要有微软、苹果电脑、IBM、甲骨文和思科, 这些厂商纰漏之和占总数的 13.6%2。 2007 年,全球广为关注的黑帽安全大会的重大变化就是:人们的关注焦点从病毒转向 程序安全。这种变化反映出安全行业的趋势:即恶意攻击正从普通的病毒转变为更有针对性 的攻击,这些攻击所针对的目标是存在漏洞的企业 IT 系统3。 由以上事件和统计数据我们不难发现,软件漏洞带来的安全威胁问题越来越严重。为了 减少软件安全漏洞,我们从就必须从软件自身出发,保证软件的安全。软件自身的安全问题 涉及到软件开发的整个过程,即包括需求分析阶段,系统设计阶段,编码阶段,系统测试, 系统评估等。增强程序员的安全意识,增加他们对安全代码知识的了解,以及根据现有的经 验,开发自动化或是半自动化的安全代码检测工具成了迫在眉睫的工作。软件安全检测中一 个重要原则就是缺陷发现的时间越早越好,缺陷被遗漏到下一阶段将使得修复缺陷的成本将 扩大,甚至造成无法修复的局面。根据静态 绪论 2 分析的创始者的统计,在设计和编码阶段的软件静态分析可以发现软件 3070的缺陷。 随着计算机辅助技术的发展,手工静态分析开始向计算机自动静态分析发展。所以论文以 基于静态分析的安全代码检测为题,对静态分析理论和技术进行深入研究,同时还建立静态 分析的模型,使其实现对源代码的自动静态分析功能。 1.2 研究现状 国内外在软件的安全性分析领域做了一些的研究,提出了可行的基于静态分析的安全代 码检测方法,并且制成了相应的软件安全性分析工具。其中比较著名,功能比较齐全,效率 比较高的就是Fortify公司开发的Fortify SCA 软件,它针对多种语言,如Java ,C,C#,C+等。 目前静态的安全性分析方法可分为:模型检验,词法分析,语义分析等。这些检测算法 各有侧重,并在现有的检测工具中加以运用,具有一定效果。但这些工具存在较大的局限性。 例如ITS4会将所有使用的strcpy语句报告,认为不安全。这将直接导致误报率过高, 影响 代码审查的效率和积极性;基于模式的安全漏洞并不多,这将直接导致MOPS 所能维护的规 则库有限,并且只能检查某些特定类型的漏洞;BOON 虽然引入了上下文的信息,但是由于 没有精确处理控制分支的信息,仅根据数据流走向取并集,仍然存在一定程度的误报,且该 方法针对缓冲区溢出和整数溢出,具有一定的局限性。而且目前的工具存在的工具大多数功 能单一,不全面,如ARCHER只是一个用于检查数组边界的分析工具,SATURN使用布尔型可满 足性来检测临时性安全属性的违规。最重要的问题是直到最近,静态源代码分析工具还只 是用于开发过程的晚期。 所以随着软件应用环境的日益复杂,代码安全性要求的日益增加,静态代码分析理论 的进一步研究和工具的完善迫在眉睫。 1.3 论文的研究内容和组织结构 安全代码检测的方法分为静态分析和动态分析,前者是在源码阶段、编译阶段或链接阶 段,并且不需要程序的执行环境进行的软件漏洞检测。后者是在程序运行阶段通过分析程序 的执行时信息进行漏洞检测。本文在安全代码的理论基础上,对静态分析技术作了深入的分 基于静态分析的安全代码检测 3 析,并且提出了基于静态分析的 java 安全代码检测,最后借助现有的工具和技术对模型的 部分进行了原型设计和实现。 论文的主要研究内容如下: (1)简要介绍了安全代码相关内容,对软件开发过程进行了安全改进,并且介绍了安全 代码检测的两种方法:静态分析和动态分析。分析了两种方法的特点,以及在软件检测过程 中的关系。 (2)研究了静态分析的原理,阐述了现有的基于静态分析的安全代码检测工具所需的技 术:程序模型的建模、分析算法、安全规则、输出结果,并且以 Java 程序 SQL 注入漏洞为 例描述了静态分析的过程。 (3)提出了基于静态分析的 Java 安全代码检测系统模型,并借助现有的工具 JavaCC 和 JJTree 实现了原型系统。 本论文基本组织结构如下: 第一章:简要介绍了本文的研究背景和意义,研究内容和所做的工作。 第二章:描述了安全代码概念、原则,对安全缺陷进行了分类,并分析了安全代码检测 的两种方法。 第三章:深入分析了静态分析的原理、关键技术 第四章:提出了基于静态分析的 Java 安全代码检测系统原型。 第五章:介绍基于静态分析的 Java 安全代码检测系统的实现。 第六章:总结本论文的工作并对后续研究内容进行了展望。 安全代码的简介 第二章 安全代码的简介 安全代码是指代码自身不存在安全漏洞,能防止非法者入侵。代码是否安全并没有明确 的标准,它是在软件开发过程中实现的。在软件开发过程中,无论选择哪种生命周期模型, 都可以改进软件开发开发生命周期的每一步。图 2.14是改进的软件开发过程,按步骤完成 每项工作,该过程无论按照哪种软件生命周期开发,都能大大提高软件的安全性。 设计阶段开发阶段 测试阶段 发行/维护阶段 概念形成 设计完毕 测试计划完 毕 编码完毕 发行 审查旧的缺陷 签字确认 安全编码规则 数据变化和 最小特权测 试 安全小组审 查 教育 威胁建模 响应过程安全运动 设置Bug门槛和终 结计划 外部审查 图 2.1 对开发过程的安全改进 在实际的软件开发过程中,代码安全与否并没有固定的标准,开发人员要根据软件系统 的功能,软件系统的安全要求,用户的特征等等。 基于静态分析的安全代码检测 5 2.1 编写安全代码的原则 根据著名网络专家 Jeff Schmidt 的安全思想5以及编程实践的经验,现总结出几项编 写安全代码的基本准则,以下逐一介绍: (1)以最低的权限运行6 在安全领域存在这么一个观点,就是总是使用完成任务所需的最小特权集来执行任务。 就如同切断一根塑料管,你可以使用钢锯或链锯。两者都可以完成任务,不过使用链锯破坏 力更大。对于可执行的程序而言也是这样,仅仅使用任务所需的最低权限来运行它。 以最低权限运行它意味着以尽可能短的时间提升后的特权。这将减少利用该特权进入攻 击的时间段。在 Windows 中,你可以在使用某特权前将其激活,执行需要此特权的任务,然 后取消特权。 (2)进行边界检查,防止缓冲区溢出 利用缓冲区溢出是最常见的攻击手段之一,它是利用程序的缓冲区溢出漏洞,在目标代 码植入并且执行供给代码。被植入的攻击代码以一定的权限在有缓冲区漏洞的程序空间中运 行,从而得到被攻击主机的系统管理员的权限。利用缓冲区溢出除了可以造成目标服务拒绝 以外,目前攻击者使用缓冲区溢出漏洞的目的主要有两个:一是通过缓冲区溢出漏洞提升权 限;二是直接利用远程服务的缓冲区溢出漏洞,从远程得到控制权。 检查系统中是否存在向较小的缓冲区存入较大的数据,要根据所使用的开发语言的不同, 还要考虑静态和动态缓冲区两种情况。考虑每个缓冲区时,应该从定义一个缓冲区的位置起 一直跟踪到程序结束,防止攻击以溢出的缓冲区作为它的攻击后门,并确定缓冲区最终被释 放。 (3)内部资源访问7 这是指在打开某个资源的情况下,通常是些文件、更新数据库或修改共享变量之前,攻 击者获得了系统的控制权,向系统输入数据或者让系统输出错误的数据。例如,当系统打开 文件时,在它读些文件之前,让程序写到一个文件中,或读入虚假数据。近来,这种类型的 攻击通常在临时文件上做文章,他们删除某些临时文件,用攻击者自己的假文件代替,当程 序向临时文件写数据时,信息就写到了攻击者的假文件中,输出就会定向到别处。防止竞态 条件的方法是在读写文件之前验证资源文件,另外,实现一个锁定系统也可以阻止这类攻击。 (4)保证代码失效后自动关闭 安全代码简介 6 当攻击者使用户的软件系统失效时,最好终止对系统的所有访问。尤其是攻击者拒绝服 务供给时,关闭功能可以阻止攻击者进一步渗透到系统中。例如编写防火墙系统时,当不幸 被强制供给时,立即切断与外部的网络连接可以更好地保障用户的计算机安全。 2.2 安全缺陷的分类 本文中有两种分类方法,一种是将安全缺陷分为 2 个松散的组:一般性缺陷和某种环境 特有的缺陷。另外一种是根据严重性分为成 3 组:高、中、低三等。 一般性缺陷是指几乎在所有用一种语言编写的程序中都存在的缺陷,如 C 和 C+中的内 存泄漏。环境特有的缺陷是要考虑特定的应用环境,比如计算人的年龄时,人的年龄不能为 负值等。二者的关系表 2.1 安全缺陷分类。 表 2.1 安全缺陷分类 在代码中可见只能在设计中看见 一般性缺陷 内建规则使得在没有程序员知道情 况下,就可以通过静态分析工具方便得 找到这些缺陷。 最有可能通过架构分析找出,例如作为 邮件附件而执行的代码下载。 环境特有的缺陷 需要对静态工具进行定制 要求既要理解一般的代码安全原则,又 要有该领域特有的专门技能。例如在不安全 的期限内持续使用加密密钥 2.3 安全代码检测的方法 由图 2.1 看出,保证你所编写的软件质量的最好方法就是从一开始就仔细地设计。这样, 各部分就能更加清晰的组合在一起,而且各自的功能也会更加简洁,你在进一步实施的时候 所犯的错误也就减少。然而,要想在编程时一点错误都没有是很难的。要想找出错误,保证 代码安全,有两种主要的方法。一种是静态分析,一种是动态分析。二者起到相互补充的作 用。 基于静态分析的安全代码检测 7 2.3.1 静态分析 任何不需要执行代码而对其进行分析的工具,所进行的都是静态分析8。静态检测使用 静态分析技术,直接分析程序的源代码,通过词法分析、语法分析和静态语义分析,检测程 序中潜在的安全漏洞。目前,静态分析主要有类型推断、数据流分析和约束分析 3 种方法9。 (1)类型推断 程序语言的类型系统包括一种定义类型的机制,一套有关类型等价、类型相容和类型推 理的规则。在将运算符作用于运算对象,执行赋值,或者把实际参数传递给子程序时,都存 在着类型是否合适的问题。类型推断是一个处理过程,其目的是保证每个操作都是针对一组 数目正确,类型合适的对象进行,以保证操作的有效性。如果语言能贯彻一套规则,保证任 何操作都不会作用到与之不相容的对象上,这种语言就称为是强类型语言。类型推断可以检 查类型错误,选择合适的操作,根据情况确定必要的类型转换。类型推断方法具有简单、高 效的特点,非常适合软件安全漏洞的快速检测。已有的采用类型推断方法检测的安全漏洞主 要有 C 程序中的格式化字符串漏洞10、操作系统内核中的权限检查11以及操作系统内核中 不安全的指针使用12等。 (2)数据流分析 数据流分析是一项编译时使用的技术,它能从程序代码中收集程序的语义信息并通过代 数的方法在编译时确定变量的定义和使用。数据流分析被用于解决编译优化、程序验证、调 试、测试、并行、向量化和串行编程环境等问题。数据流分析是通过对变量构造定义一引用 对来实现的。数据流分析在安全检测中有着广泛的用途。 (3) 约束分析 约束分析方法将程序分析过程分为约束产生和约束求解两个阶段,前者利用约束产生规 则建立变量类型或分析状态之间的约束系统,后者对这些约束系统进行求解。约束系统可以 分为等式约束、集合约束和混合约束三种形式。等式约束的约束项之间只存在相等关系。集 合约束把每个程序变量看成一个值集,变量赋值被解释为集合表达式之间的包含关系。混合 约束系统由部分等式约束和部分集合约束组。 以上介绍的三种主要静态分析方法都是通过解释程序的抽象语义,建立程序属性的数 学模型,再通过求解这个数学模型,确定程序的属性。相比较而言,约束分析具有最强的检 测能力和最慢的检测速度,适合进行软件的安全检测;数据流分析具有较强和较快快的检测 速度,适合检查需要考虑控制流信息而且变量属性之间的操作十分简单的静态分析问题;类 安全代码简介 8 型推断则具有最弱的检测能力和最快的检测速度,适合检查属性域有限而且与控制流无关的 安全属性。 静态分析的使用比大多数人所理解的要更为广泛,部分是因为有诸多的静态分析工具可 用,并且每种静态分析工具都有自己的用途。 (1)类型检查 类型检查是作广泛应用的静态分析形式。也是我们最熟悉的一种形式。它能防止程序员 意外地将整型值赋予对象变量。 (2)风格检查 风格检查是对程序的风格如注释、命名、程序结构等按照规定的规则进行检查。大多数 检查程序在其所执行的规则集都相当灵活。由风格检查程序所展示的错误往往都是影响代码 的可读性和可维护性。某些编译器已经实现了可选的风格检查功能。例如,gcc 的“- Wall”选项标志将使得这个编译器在一个分支语句没有考虑列举类型所有的可能值时发现这 个问题。如 switch 语句。 (2)程序验证与属性检查 程序验证和属性检查是指根据给定的规格说明对程序进行等价检查或部分检查,如果这 份规格说明书完整描述了程序应做的任何事情,那么程序的验证工具可执行等价检查已确认 该程序的代码与这份规格说明确切匹配。但是更为常见的情况是,验证工具将根据只知描述 部分程序行为的部分规格说明书对软件进行检查,即为属性检查。当属性检查工具发现代码 可能与规格说明不匹配时,通常会通过报告一个反例来将发现向用户说明:程序中发生的事 件序列,从而导致违反相应的属性。例如属性检查工具检查内存泄露。 (4)Bug 查找 bug 查找程序只是指出程序以程序员设想之外的方式运行的一些地方。大多数 bug 查找 工具都是容易使用的,因为他们会有预先一套的“bug 惯用” ,用来描述代码中通常预示着 存在 bug 的模式。有些 Bug 查找工具和属性检查工具有一样的算法,但是,bug 查找工具通 常关注的是产生较少的误报情况,这就意味着有较高的漏报率。 (5)安全审查8 现代的安全分析工具往往更像是一种属性检查和 bug 查找程序的混合体。许多安全属性 能被简洁的表达为程序属性。对于一个属性检查程序老说,搜索潜在的缓冲区漏洞可以当作 是检查这样的程序属性;“程序不会访问已分配内存的边界之外的地址” 。从 bug 查找领域, 安全分析工具采纳了这样一种观念,即开发人员往往会继续再使用相同的不安全的方法来接 基于静态分析的安全代码检测 9 解决问题,这就可说成一种不安全的编程惯例。但是,编程工具一般不能沿用 bug 查找工具 通过允许漏报来较少误报的倾向,而是倾向于另一个极端,即即使该工具并不能证实某些迪 代码表现出了可被探测并利用的漏洞,也会发出警报并指出要进行人工审查,这就意味着安 全工具的输出仍需要人工审查。 以上这五点就是目前静态分析经常解决问题。1953 年,Henry Rice 提出了著名的赖斯 定理。赖斯定理的涵义表明:静态分析不能完美地确定一般程序的任何重要属性。 2.3.2 动态分析 动态分析需要通过程序的执行来完成,有别于静态分析得到程序每次执行都不变的特性, 动态分析得到程序一次或多次执行的信息,可以根据这些监测到的信息对特定的漏洞模式进 行检测,从而完成软件的安全分析。程序测试和剖析是最常见的标准动态分析。动态分析因 为没有近似估计和抽象处理,所以其分析结果是绝对精确的,如程序的哪条路径被执行,程 序计算的数据值是什么,程序使用了多少内存或者是程序执行了多长时间等 13。 动态安全漏洞检测有两种方式:一种是在执行的同时就进行程序运行信息的收集和安全 漏洞的判断,另一种方式是把程序执行的所有信息都记录下来,然后使用这些信息进行漏洞 模式匹配,从而查找软件漏洞。动态分析常用的方法就是在程序中植入代码。这些植入程序 中的代码在程序运行时完成数据收集,如输出某变量的值或打印执行结果等。 但是动态分析的结果是不完整的,一次程序的执行情况并不能代表程序以后的可能执行 情况。也就是说一个测试输入数据集不可能保证程序的所有可能执行路径,仅仅依靠一次或 多次的程序执行情况有可能无法发现软件的安全漏洞,但是这些安全漏洞却是真实存在的。 关键是如何设计有良好分支覆盖和状态覆盖的测试用例。 2.3.3 静态分析与动态分析的关系 静态分析的工具有点类似于拼写检查工具,这类工具可以防止遗漏那些易于理解的错误, 但并不能捕获所有的疏忽。运行静态检查工具没有出问题,并不能表示你的代码是完美的没 有问题的。同时静态分析结果显示的错误信息也并非都是正确的。所以静态分析工具同时存 在两大类问题。一是误报。误报是指这样一种情况,程序中并不存在这个问题,但是在静态 分析结果中存在。大量的误报信息会加大人工审查的工作量。二是漏报。漏报与误报正好相 反,即程序中存在的问题,但在分析结果中并没有显示。通常,出于安全考虑,为了减少误 报率,我们就会在无意间增大了误报率。二者的权衡要根据系统的需求,用户的要求而定。 安全代码简介 10 同样动态分析技术也有它的不足,由于测试相对于静态分析延后从而增加了成本,而且动态 分析的结果并不全面,可能无法找到程序的所有的执行路径,从而产生漏报的现象。 有的人错误地依赖动态技术,他们匆匆完成规格说明,然后就开始设计,以为所有的问 题都能日后得到解决。这种方法有两个缺点。首先是随着时间的推移和具体实现时问题的不 断涌现,设计最终会陷入困境,那些问题也将越来越难查找。其二,众所周知,修正软件中 的错误所花的经费,随着在开发进程中发现它的时间的推移而迅速地增加。在对IBM和TRW的 早期研究中,Barry Bowhm就发现,如果一个规格说明错误在实现它时才被发现的话,修正 它的将花费比原来多1000倍。 还有一些人错误地认为只要使用静态技术就够了。尽管最近在静态分析方面已有了很大 的进步,但我们仍不能仅仅靠这种技术来找出所有的错误。即使你用数学方法可以证明了你 程序的正确性,你也不可能不去检验你的程序。 其实动态技术和动态技术二者优势互补,如果发挥各自的优势就可以更好的保证程序代 码的安全。静态分析能够为动态分析提供正确性证明,反过来后者能提高前者的分析精度。 2.42.4 小结小结 本章从安全代码的概念出发,根据现有的软件开发模型,对一个软件开发周期进行了 安全改进;然后总结了编写安全代码的原则,对安全缺陷进行分类;最后介绍了安全代码检 测的两种方法:静态分析和动态分析,并且总结了现有的静态分析方法和动态分析方法,阐 明了二者的关系。 基于静态分析的安全代码检测 11 第三章 静态分析原理 从当前来看,几乎静态分析工具的工作流程基本上是一致的,然后它们采用的技术,如 分析算法、模型建立、规则库的设计各不相同。本章将详细的介绍现有的静态分析工具用到 的技术及其原理。 3.1 静态分析工具所需的技术 图 3.1 显示了实现静态分析工具的流程。实现不同功能的静态分析工具可以根据自己的 需要选择方法、技术和工具。接下来对各个模块进行详细的介绍。 源代码的读取结果分级分析的执行 安全规则的提取 描述 程序模型的建立 结果输出 图 3.1 一般静态分析安全工具的框架图 3.1.1 程序模型的建模 程序建模是静态分析工具要完成的第一步。这里所说的程序模型是指能代表源代码的数 据结构,这样做方便我们以后的分析,既能提高分析的效率,又能提高分析的准确性。建立 一个比较完善的模型通常要经过以下几步。 (1)词法分析 静态分析工具对载入的原代码的第一个操作是词法分析。任务是从左到右一个字符一个 字符地读入源程序,即对构成源程序的字符流进行扫描然后根据词法规则识别单词(也称单 词符号或符号)14。词法规则通常使用正则表达式来标识记号的。扫描后生成了记号序列。 为了后续能生成有用的错误报告,标记应该至少携带另一种类的信息:其在源代码文本中的 静态分析原理 12 位置。如果静态分析工具要做的只是匹配危险函数的名称,那么,分析工具就可以遍历这个 记号流,查找标识符,将其与清单中的危险名称匹配,而后报告相应的结果。ITS4、RATS 以及 Flaw finder 采用的就是这种方式。 (2)语法分析 语法分析是在词法分析的基础上,将词法分析阶段产生的记号流序列组合成各类语法短 语,如“程序” , “语句” , “表达式”等等.语法分析阶段中源程序的结构由上下文无关文法 描述的,且给定的代码经过此阶段能产生一颗语法树。 (3)抽象语法 此阶段是基于语法树来进行分析的,某些特定类型的格式检查可基于语法树执行得特别 好,这是因为解析树中包含了关于代码的最为直接的表示就像程序员写的一样。但是由于 多种原因基于语法树来执行复杂的分析有些困难。这种树的节点是直接从语法的产生式规则 派生而来的,而这些规则会引入一些非终结符号,这种符号的存在纯粹是为了使解析易于进 行并且没有歧义,而不是为了产生更易理解的树;通常来说,要进行这种分析,较好的做法 是在程序文本中,提取语法中的细节和句法中的修饰成分。完成这项工作的数据结构称作抽 象语法。它的目的就是提供一种更适合后期进行分析的标准化程序版本。 (4)语义分析 生成抽象语法树时,分析工具同时生成了一张符号表,对于程序中的每一个标识符,符 号表将其类型或定义的指针与标识符相关联。 静态分析工具不要求像编译器那样报告类型检查错误,但是,由于对象的类型决定了该 对象可调用方法的集合,所以对于一个面向对象的语言来说,类型信息是至关重要的。此外, 通常至少需要将源文本的隐含类型变换转换成抽象语法中的明确的类型转换。由于这些原因, 高级静态分析工具不得不像编译器那样完成与类型检查相关的工作。在编译领域,符号分析 和类型检查都是作为语义分析的概念而提出的。 在语义分析之后,编译器和较高级的静态分析工具就分开了,现代编译器使用抽象语法 树和符号以及类型信息来生成一种中间的表示法,这是一种通用版本的机器码,适合于进行 优化,而后转化为平台特有的目标代码。静态分析之后要根据分析类型的不同,可能需要在 抽象语法树的基础上进行额外的转换,或者生成自己的中间表示变种,以适应自己的需要。 静态分析工具使用的中间表示法通常是比编译器更为高级的程序视图。 (5)跟踪控制流 当函数执行时,静态分析工具要需要其可能采取的执行路径。为了使算法效率更高,绝 基于静态分析的安全代码检测 13 大多数工具都会在 AST 或中间表示法之上生成一个控制流图。控制流图的节点是一些基本块。 节点之间的连线指的是函数执行时的路径。图 3.2 是一小段 java 代码,图 3.3 时该段代码 控制流图。其中 if 条件语句形成两条可能的执行路径。这样就可以将该模块的两条执行路 径 写出来:a,b,d和a,c,d。这样就方便了以后控制流的跟踪。 图 3.2 java 代码段_if 条件句 图 3.3 控制流图 不同函数的调用或是方法之间的控制流用调用图表示。图 3.4 代码的调用图如图 3.5 所 示,调用图的节点表示函数,有向边缘表示潜在的一个函数对另一个函数的调用。 int clear(int leftNum) if(leftNum) remove(1); else close(); int remove(int left) if(left) close(); remove(0); else close(); int close() 图 3.4 java 代码_函数调用 静态分析原理 14 clear clear close close remove remove 图 3.5 调用图 (6)跟踪数据流 数据流分析算法将检查数据在程序中的移动情形。静态分析工具执行数据流分析,从 而定位寄存器,移除无用代码、并执行许多其他的优化。数据流分析通常包括遍历整个函 数的控制流图,并记录数据的值在哪里产生、在哪里使用。 (7)污染跟踪 静态分析工具使用数据流来判断攻击者能控制的值,这个方法称为污染跟踪。通过这个 方法,能判断污染数据的入口点,传递和转移处以及接收处。污染跟踪是验证许多输入验证 问题的方法。如 SQL Injection。 3.1.2 分析算法 分析算法所要用到的基本方法是断言检查,对于要保护的程序来说这个断言必须是真的。 例如我们要检查下面一行代码的缓冲区溢出问题: strcpy (dest,src); 我们就添加以下这个断言: assert (alloc_size(dest)strlen(srt); 如果这个断言总是成功的,那么就不可能发生缓冲区溢出问题。如果存在某个条件是这 个断言失效,那么分析工具就报告该部分有发生缓冲区溢出的可能。 断言在分析工具中是一个重要的方法。从结构上看任何分析工具的分析策略都应该由两 部分组成:一是用来分析单个函数的组件,另外一个是分析函数之间交互行为的组件,如图 3.6。 基于静态分析的安全代码检测 15 分析算法 单个函数分析 AST 控制流图 数据流图 函数之间分析 调用图 图 3.6 断言分析策略 对于单个函数的分析,现在较为流行的分析方法主要有三种:抽象解释、谓词转换器、 模型检查。 (1)抽象解释是一种通用技术,这种方法首先是将程序中与感兴趣的属性无关的方面抽 取出去,而后使用选中的程序抽象执行一种解释。 (2)谓词转化器是一种用来替换模拟和解释的方法是导出函数对其调用者的需求。 (3)模型检查,将要检查的属性表示为一个小型的有限自动机。例展示了一个用于属性 “内存应该只释放一次”的有限自动机。模型检查的方法把属性作为一种规范来接受,将要 检查的程序转换为一种自动机15加以对比。图 3.7 如果模型检查程序能找出导致规范自动 机达到其错误状态的一个变量或者程序中的一条路径,那么模型检查程序就把这个潜在的问 题识别为一种两次释放内存的漏洞。 初始状态 已释放错误开始free(x)free(x) (其它操作)(其它操作) 图 3.7 “内存应该只释放一次”有限自动机 函数之间的分析最难的问题是上下文分析敏感的分析,其目标是当判断一个函数调用的 影响时,将调用函数的上下文环境都纳入考虑。一种实现方法就是直接插入,即将程序中每 个函数调用替换成被调用函数。另一种方法 静态分析原理 16 是使用基于堆栈的分析模型。还有一种比较灵活的方法是利用本地分析算法来调用函数摘要。 就是当单个函数分析时发生函数调用,这个调用要用被调用函数的函数摘要替代。函数摘要 可能包括调用上下文必须满足的需求,即前置条件;也要包括函数返回时同时对上下文环境 产生的影响,即后置条件。C 语言标准库函数的 memcpy()的一种摘要可以写成以下这种形式。 生成的函数摘要通过下面这个工作队列算法来完成。 过程 analyze_program()将接受 2 个参 基于静态分析的安全代码检测 17 数:一个要进行分析的程序和一组函数摘要。首先 build_callgraph(p)形成一个调用图, 然后将程序中所有函数排队,最后从队列中逐个取出函数进行分析直至队列为空。过程 analyze_function()依赖于本地分析的算法实现,如果某个函数摘要需要更新的话,就用其 新的摘要替换老的摘要。 3.1.3 安全规则定义 规则是定义安全工具应该检查什么的漏洞,报告什么漏洞用的。好的静态分析工具会 尽可能在程序外部实现其所需的规则,这样规则就能在无需改变工具本身的情况下添加、减 少或是修改。最好静态工具会将所有要检查的规则都放在程序外面实现。外部规则还使得最 终用户能够添加检查规则代码来适应新类型的缺陷。 规则可以以多种形式出现,如专门的规则和批注。专门的规则是指专门的外部文件用 来特定的规则形式来描述;而批注是指以注释的形式描述规则。以下是 Fortify SCA Software 的规则16,该规则是与 system()调用有关的规则,其中包含一个唯一性规则标识 符、目标领域(VulnKindom)和目标类别(VulnCategory)等字段。 A090AAC1-9CA8-4F40-994D-8C30FC6D4671 Input Validation and Representation Command Injection 4.0 0 system 使用静态分析污染传播问题需要各种不同的规则类型。由于安全问题可被表示污染传播 问题,所以下面我们归纳几种用于污染传播的规则。 (1)数据入口规则定义了不应该接收污染数据的程序位置。如 C 语言中的 read(), gets()等类的函数。 (2)数据传递规则定义了操纵污染数据的地方。如 java 语言中的 s.trim()等污染数据 进行加工的函数。 (3)数据接收规则定义了不该接受污染数据的地方。如 java 语言中执行数据库查询的 executeQuery()就是一个接受器。 (4)数据净化规则定义了对接收的数据进行验证的地方。 以上四种规则一起运作检查漏洞。 3.1.4 结果输出 以用户能预测结果潜在影响的方式提供结果,这是分析工具的部分任务。为管理工具的 输出,审计人员至少需要三个功能:将结果 基于静态分析的安全代码检测 18 分组和分类;消除非预期结果;解释结果的意义。 如果用户能以一种灵活的方式对问题进行分组和分类,他们通常必须能够消除大量非预 期的结果,而无须逐一对每一个问题进行审查。例如,如果所分析的程序能可信文件中获取 某些输入,那么,用户将可通过消除那些假设此文件不可信的条件下所产生的所有结果,从 而对结果的身缠将从中获益。我们可以根据结果发生的严重性进行分级,也可以根据问题发 生原因进行分类,等等。其次, 对非预期的结果进行审查没有任何意义。第三,对问题进 行描述,解释原因,影响以及如何改进,对程序员会有很大底帮助。 3.2 实例分析 SQL(Structure Query Language ,结构化查询语言)是对存放在数据库中的数据进行组 织、管理和检索的工具17。SQL 语言结构简洁、功能强大、简单易学,已经得到广泛应用。 所谓 SQL 注入就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客 户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料18。通常别 有用心者的目标是获取网站管理员的账号和密码。 许多程序包含以下这样的代码: String sql = “select * from client where name = “ + name + “; 变量 name 是由用户提供。这个 SQL 字符串的问题是攻击者可以在 name 变量中植入 SQL 语句。假如输入为 name=Black,它将创建完整、良好的 SQL 语句: select * from client where name = Black但是,如果攻击者的输入是“Blackor 1=1-“,则会创建以下的恶意语句: Select * from client where name=Black or 1=1- 这条语句将返回表 client 中 name 的值为 Black 的那些行。它还会返回满足 1=1 句的所 有行。事实上对于表中的每一行,1=1 都为 true,所以攻击者将看见表中所有行。查询最后 一部分“-”字符是注释操作符,它使攻击者很容易就创建一个合法的但是有害得语句。 以上这个情况就是SQL注入的一个实例。SQL注入通过网页对网站数据库进行修改它能够 直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 17987-1:2025 EN Road vehicles - Local Interconnect Network (LIN) - Part 1: General information and use case definition
- 【正版授权】 ISO 13094:2025 EN Composites and reinforcement fibres - Carbon fibre reinforced plastics (CFRPs) and metal assemblies - Combined stress test
- 【正版授权】 ISO 12219-12:2025 EN Interior air of road vehicles - Part 12: Test methods for the determination of fogging characteristics of trim materials made from polyvinyl chloride P
- 【正版授权】 IEC 60433:1998 FR-D Insulators for overhead lines with a nominal voltage above 1 000 V - Ceramic insulators for a.c. systems - Characteristics of insulator units of the long
- 【正版授权】 IEC 60079-19:2025 EN-FR Explosive atmospheres - Part 19: Equipment repair,overhaul and reclamation
- 校园消防知识培训课件流程图
- 残疾人专员考试试题及答案
- 一模日语试题及答案
- 校园安全知识培训目的课件
- 衬衣制作考试题及答案
- 四川省达州市大竹县2020-2021学年二年级下学期期末数学试卷
- VDA6.3-2023版审核检查表
- 变频器日常保养及维修方法
- 普通地质学教材
- 酒店账单-水单-住宿
- 中医门诊病历(共7篇)
- GB/T 4372.1-2014直接法氧化锌化学分析方法第1部分:氧化锌量的测定Na2EDTA滴定法
- 日语动词分类课件 【高效课堂+备课精研】 高考日语一轮复习
- 妇产科学-第十二章-正常分娩课件
- 1【L】系列离心式冷水机组技术手册
- Q∕SY 1753-2014 炼化循环水用缓蚀阻垢剂技术规范
评论
0/150
提交评论