一种基于安全状态跟踪检查的漏洞静态检测方法研究与实施.doc
《一种基于安全状态跟踪检查的漏洞静态检测方法研究与实施.doc》由会员分享,可在线阅读,更多相关《一种基于安全状态跟踪检查的漏洞静态检测方法研究与实施.doc(14页珍藏版)》请在三一办公上搜索。
1、计算机学报2009年5期 一种基于安全状态跟踪检查的漏洞静态检测方法研究与实施 本课题得到国家自然科学基金项目(60703102, 60873213)、北京市自然科学基金项目(4082018)和国家863 项目(2007AA01Z414)的资助。梁彬,男,1973年生,博士,副教授,主要研究方向为信息安全与系统软件,Email: liangb. 侯看看,女,1986年生,硕士研究生,主要研究方向为静态分析。石文昌,男,1964年生,博士,教授,博士生导师,主要研究方向为信息安全、可信计算与系统软件。梁朝晖,女,1968年生,博士,讲师,主要研究方向为信息安全、网络通信。梁彬 侯看看 石文昌 梁
2、朝晖(中国人民大学信息学院 北京100872)(数据工程与知识工程教育部重点试验室 北京100872)摘 要:现有的采用基于源代码分析的漏洞静态检测方法中存在的主要问题是误报率和漏报率较高。主要原因之一是缺乏对数据合法性检查与非可信数据源等程序安全相关元素的精确有效的识别分析。本文提出了一种基于数据安全状态跟踪和检查的安全漏洞静态检测方法。该方法对漏洞状态机模型的状态空间进行了扩展,使用对应多个安全相关属性的向量标识变量安全状态,细化了状态转换的粒度以提供更为精确的程序安全行为识别;在漏洞状态机中引入了对合法性检查的识别,有效降低了误报的发生;建立了系统化的非可信数据鉴别方法,可防止由于遗漏非
3、可信数据源而产生的漏报。基于此方法的原型系统的检测实验表明:本文方法能够有效检测出软件系统中存在的缓冲区溢出等安全漏洞,误报率明显降低,并能避免现有主流静态检测方法中存在的一些严重漏报。关键词:漏洞检测;静态分析;状态机;漏报;误报中图分类号:TP309Research and Enforcement of a Static Vulnerabilities Detection MethodBased on Security State Tracing and CheckingLIANG Bin Hou Kan-Kan SHI Wen-Chang LIANG Zhao-Hui(School of
4、 Information, Renming University of China, Beijing 100872)(MOE Key Laboratory of Data Engineering and Knowledge Engineering, Beijing 100872)Abstract The main problem of existing static vulnerability detection methods based source code analysis is their high false positive and false negative. One mai
5、n reason is lack of accurate and effective identification and analysis of security-related program elements, e.g. data validation checking, tainted data source, etc. A static vulnerability detection method based on data security state tracing and checking is proposed. In this method, the state space
6、 of state machine model is extended; the security state of a variable is identified by a vector that may correspond to multiple security-related properties rather than by a single property; fine-grained state transition is provided to support accurate recognition of program security-related behavior
7、s; the recognition of validation checking is introduced in vulnerability state machine to reduce false positives; and a systematic discrimination mechanism for untrustworthy data is constructed to prevent false negatives result from neglecting untrustworthy data sources. The experimental results of
8、a prototype system show that this method can effectively detect buffer overflow and other types vulnerabilities in software systems, and with obviously lower false positive than existing mainstream static detection methods and avoid some serious false negative of these methods.Keywords vulnerabiliti
9、es detection, static analysis, state machine, false negative, false positive1 引言大多数信息安全事件的根源在于计算机软件系统中存在有安全漏洞(Vulnerability)1。要杜绝这类安全事件,最根本的办法在于在软件发布前检测出安全漏洞并修正。为了提高漏洞检测的效率,安全界对自动化的漏洞检测技术进行了研究,主要有动态分析(Dynamic Analysis)和静态分析(Static Analysis)两类。动态检测工具使用较容易2,且确实能够发现一些安全漏洞,但测试用例对程序逻辑的覆盖率问题限制了动态检测工具的发掘能力
10、,难于发现隐藏较深的安全漏洞。静态漏洞分析技术主要通过对系统代码进行程序分析(Program Analysis)以发现各种安全漏洞3,例如缓冲区溢出、非法指针引用、竞争条件等等。与动态分析相比,静态分析技术能够支持更为有效的深度漏洞检测。漏报(False Negative)和误报(False Positive)是各种安全漏洞检测技术所要共同面对的问题。近年来,漏洞静态检测技术已经取得了很大的进展,研究人员已经提出和实现了一些漏洞静态检测方法和工具,目前已在操作系统等复杂系统的漏洞检测中得以应用4。但仍然存在着误报率和漏报率较高的问题,影响着静态漏洞检测方法进一步推广应用。这与检测模型和安全相关
11、程序特征的识别有着密切的关系。首先,现有静态检测方法采用单一的性质标识对程序数据安全性质进行描述,这种一元的描述机制难以进行细粒度的数据状态分析和精确跟踪分析多种平行发展的数据安全相关性质,不能很好地全面覆盖安全漏洞的激发条件。直接导致的一个严重问题是缺乏对非可信数据合法性检查的有效识别,从而产生大量的误报。目前的检测方法仅仅集中于跟踪分析数据的可信性,一元的安全性质标识往往被完全用于描述数据的可信性,无法精确跟踪对非可信数据所实施的合法性检查,混淆了未经合法性检查的和已经过检查的非可信数据。现实中,几乎所有的软件系统都要处理各种各样的非可信数据,而大部分非可信数据在引用前都经过了相应的合法性
12、检查,消除了其导致危险操作的可能性。因此,这种混淆的后果会将大量安全的非可信数据操作识别为安全漏洞,将导致大量的安全程序片段被错误地检测为含有安全漏洞,从而产生大量的误报。例如,根据文献5数据,Johnson等人使用CQUAL系统对Linux内核代码进行的用户态/内核态指针引用漏洞检测,由于缺乏对合法性检查的有效识别,误报率在95%以上。如此高的误报率需要投入大量的资源进行后期人工分析,大大增加了漏洞静态检测技术推广应用的难度。其次,虽然个别的漏洞静态检测方法实现了部分的合法性检查识别,但对合法性检查是否有效缺乏必要的深入分析,未能区分出实现上存在缺陷的无效的合法性检查,从而产生漏报。以斯坦福
13、Engler等人研发的静态漏洞检测系统MC所采用的方法为例6,MC中用于检测内存操作长度越界漏洞的Range Checker中引入了对非可信数据的上/下界检查的识别,由于模型表示空间的限制,其仅仅检测长度参数是否经过了相应的算术比较,而并不关心参与比较的上/下界值的类型。而入侵者能利用一个负值的整数绕开与常量或有符号上界值进行的上界比较,触发安全漏洞。在现实世界中,最近几年此类安全漏洞已经大量出现在各种平台系统中,例如Linux内核中的蓝牙设备驱动有符号缓冲区索引安全漏洞 Linux Kernel Bluetooth Signed Buffer Index Vulnerability. htt
14、p:/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-0750。由于缺乏必要的检查有效性识别,MC未能检测出此漏洞。此外,现有静态检测方法对于数据可信性的鉴别也缺乏清晰的概念模型,在实际应用中容易遗漏一些较隐蔽的非可信数据源,导致对部分非可信数据跟踪分析的缺失而产生漏报。以MC所采用的方法为例,在其对Linux内核的漏洞检测中,遗漏了内核对用户文件的装载解析这一非可信数据源,导致了对可执行文件解析所引发的安全漏洞的误报。针对以上问题,本文提出了一种对程序数据安全状态进行跟踪检查的漏洞静态检测方法。在此方法中,使用有限状态机模型描述程序数据安全性质
15、的变化,对描述数据安全状态的状态空间进行了扩展,采用了多元的状态描述机制,使用一个对应多个安全相关属性的布尔向量标识变量安全状态,更为清晰地反映了变量安全性质的变化,细化了状态转换的粒度以提供更为精确的程序特征识别。在此基础上,利用多元的安全状态设置在跟踪分析数据可信性的同时引入了对合法性检查及其有效性的识别,有效降低了由此引起的误报和漏报的发生。此外,在本文方法中还引入了可信边界与可信边界入口的概念,以可信边界的界定为线索建立了系统化的非可信数据鉴别方法,防止了由于遗漏非可信数据源而产生的漏报。为验证方法的有效性,作者基于编译技术实现了一个可实际运行的原型检测系统DELTA(DEtect v
16、uLnerability with sTatic Analysis)。使用DELTA对Linux内核代码的漏洞检测实验表明,本文方法能够有效检测出系统中存在的安全漏洞,并能避免其他主流静态检测工具中存在的漏报和误报,为提高软件质量及安全性提供了有效可行的方法及工具。本文第2节给出了一种基于程序安全状态的安全漏洞检测方法;第3节描述了DELTA的设计及实现;第4节描述了对Linux操作系统内核源代码的静态检测实验,展示了方法的应用效果;第5节介绍相关工作并进行了分析比较;最后是全文的总结。2 检测方法2.1 概述本文检测方法的基本思想是对程序状态的跟踪和检查。如图1所示,在本文中将使用基于有限状
17、态机模型的漏洞状态机描述程序变量安全状态的转换规则,针对待检测漏洞设置相应的漏洞状态机规定相关数据的状态转换;并对程序各可能执行路径进行静态遍历并识别当前操作,对当前操作所涉及的程序变量根据状态机赋予其对应的安全状态;在安全相关操作处设置检查点(Checkpoint),以检测操作数据是否具有期望的安全状态,若出现与期望安全状态不符的情况,则表示发现了一个可能的安全漏洞。安全检查点安全状态检查安全状态转换漏洞状态机变量安全状态程序执行路径安全漏洞信息图1 检测方法示意图以拷贝超长数据所导致的缓冲区溢出漏洞为例,当使用内存拷贝函数memcpy根据一个未经上界检查的用户输入的操作长度参数复制超长的数
18、据至目标缓冲区时,将发生缓冲区溢出。此时,安全漏洞的相关要素为:安全相关操作内存拷贝函数;操作数据状态用户输入的(非可信的)、未经上界检查的操作长度参数。内存拷贝操作将为一个安全检查点,检测系统所期望的操作长度参数为一个可信数据或经过上界检查的非可信数据。当一个用户输入的数据进入系统处理流程时,将被标识为非可信数据。若经过了有效的上界检查,其状态中将加入通过上界检查的标识;否则,在作为内存拷贝操作长度参数时,检测系统将认为其不具有期望的安全状态,会引发一个缓冲区溢出漏洞。2.2 漏洞状态机模型在传统漏洞静态检查中所采用的状态机模型中,数据的安全状态使用单个属性值标识,如MC6和XGCC7等。在
19、本文中,为精确跟踪多种平行发展的数据安全性质(主要为数据的可信性和合法性检查状态),对漏洞状态机的状态空间进行了扩展。首先给出以下模型元素: SRP:变量安全相关属性集,SRP包含各种细化后的安全漏洞相关变量特征,例如数据来源、已经经过的合法性检查(可能为多个)、指针释放与否等。不失一般性,设SRP集合元素个数为n,属性被赋予1至n的编号; STO:安全状态转换操作集STO,STO包含各种导致变量安全相关属性发生变化的操作,例如赋值、拷贝、数据比较检查等; opp: STO P (1, 2 , n),安全状态转换操作到SRP编号集的幂集上的一个映射,标识STO中的元素所对应的相关SRP属性编号
20、集; opv: STO 1, 2 , n true, false, 标识一个STO操作对相关的某个SRP属性的状态设置,为true表明此STO操作导致变量具备了相关的属性或被执行了相关操作。在漏洞状态机中,将使用一个对应SRP集元素的布尔向量描述变量安全状态。基于有限状态机模型,一个漏洞状态机为以下一个五元组:VM = 漏洞状态机各元素的定义如下: S:安全状态集,为对应SRP集的n维布尔向量集,即:S = true, falsen = (s1, s2, , sn) si = true 或 false其中,分量si对应编号为i的SRP属性; :状态机控制字符集,为状态机对应安全漏洞的安全相关操
21、作,即 = STO; f : S S,状态转换函数,表示在当前状态下实施一个安全相关操作后的后续安全状态。对于一个安全状态s = (s1, s2, , sn)及一个STO操作op,设f (s, op) = s = (s1, s2, , sn),其中:si = si, 当 i opp (op);si = opv (op, i), 当 i opp (op) s0 (false, false, , false),初始状态,其所有元素为false,表示变量未具备任何安全相关特性或被执行了相关操作; Z:终止状态集,在漏洞状态机中此集为空,即 Z 。在漏洞状态机中,安全状态由对应SRP集元素的布尔向量表
22、示,标识程序变量是否具备相关安全属性或被执行了什么操作。SRP集的设置由具体的目标系统与待检测的漏洞类型决定,主要由3部分构成:(1)变量值是否为一非可信的数据,即此数据是否有可能被恶意用户所控制对于软件系统而言,其存在的每一个安全相关编程错误不一定能最终导致对系统安全的危害,只有当攻击者构造的恶意数据能够触及到有缺陷的代码时,方可能导致实际的安全威胁。否则,其仅仅是一个难以被触发的编程错误而非一个安全漏洞。因此,对变量可信性的标识是通过变量状态跟踪以检测安全漏洞的重要基础。在实际检测中,主要将对非可信数据进行跟踪,安全状态布尔向量中将设置一个分量标识变量是否源自一个非可信数据。(2)变量通过
23、了的合法性检查实际系统中,在引用外部非可信数据前,往往需要进行合法性检查,例如对外部指定的内存操作长度进行上界检查。在静态检测中对合法性检查的识别较为复杂,对于不同的待检测漏洞,所涉及的合法性检测不同。即使是同一漏洞类型,各系统中实现的合法性检测的静态表现形式也存在差异。此外,合法性检查还可由多个步骤组成,如首先检查操作长度变量的符号,再检查其上界。如图2所示,为了能较准确地识别合法性检查,拟细化合法性检查的识别粒度,将合法性检查分解成一序列相关的子步骤进行识别。在SRP中,将针对具体的漏洞相关的合法性检查构成,设置与之对应的多个变量安全相关属性,用于标识目标变量所经过的合法性检查步骤。而且,
24、每个步骤可细化为对应着一个检测引擎可单步识别的基本语法单位,从而保证了精确识别。安全状态布尔向量中的相应分量用于标识此变量是否通过了相应的合法性检测步骤。此外,合法性检查各阶段的检查结果被单独记录在变量的安全状态中,各阶段的检查结果互不覆盖,在检查点上再对变量是否具有期望的安全状态进行检查。从而不必前摄性地规定合法性检查各步骤的排列次序,符合实际系统程序设计的规律。如此,可将合法性检查的识别与变量状态的跟踪统一到漏洞状态机中,既提高了合法性检查的识别准确性,又保证了漏洞检测机制的简洁高效。true/false安全状态合法性检查步骤合法性检查true/falsetrue/false图2 合法性检
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一种 基于 安全 状态 跟踪 检查 漏洞 静态 检测 方法 研究 实施

链接地址:https://www.31ppt.com/p-5236425.html