论文部分内容阅读
对软件系统源码进行缺陷静态检测所面临的最大的现实困难之一是缺乏相应的缺陷检测规则。尽管对软件代码进行人工地分析和理解能够获得反映程序安全本质的深层次的缺陷检测规则,但对于大型软件系统而言,使用这种低效率的规则提取方式显然难以适应现实的需要。表现在,人工提取缺陷检测规则需要参与人员从整体上理解和掌握软件的代码结构和业务逻辑,而在具有数百万行代码的大型软件系统上较短时间内完成这项工作则变得更加艰巨。特别是近年来,计算机运算处理速度的不断提高为规模庞大、逻辑复杂的大型软件的运行创造了条件,软件规模也随之不断增大。在人工提取规则无法满足这种检测需求的情况下,研究具有较高自动化程度的缺陷检测规则提取方法则变得极为必要。 本文主要针对大型软件系统源码,探索自动提取缺陷检测规则和进行缺陷检测的方法。该方法使用闭频繁序列模式挖掘算法来获取频繁应用于保护某一特定安全敏感操作(Security Sensitive Operation)的安全验证语句(Security ValidationStatement)序列,依赖于这种安全验证语句序列生成与之对应的缺陷检测规则,并最终将其应用于缺陷检测。本文的安全敏感操作指的是引起安全问题的程序语句,对应着实际软件代码中爆发漏洞的数据访问操作或函数调用,而安全验证语句则是指那些用来验证传至安全敏感操作处的数据是否可信或合法的语句。所提出的方法可以被划分为三个阶段:代码预处理、安全验证规则挖掘和缺陷检测。首先,代码预处理负责将软件源码转化成数值形式的中间表达形式。在此过程中,基于用户提供的安全敏感操作,采取了程序切片的技术来获得对语句上下文相关性的理解,并淘汰与安全敏感操作不存在合法性验证关系的程序语句。针对不同语句形式对应同一语义的现象,还给出了一种方法来对程序语句进行等价语义识别与处理。其次,安全验证规则挖掘阶段主要负责闭频繁序列模式的挖掘抽取并将其分析整理成为与之对应的安全验证规则以提供给进一步的缺陷检测。最后,在缺陷检测阶段中,从生成的序列数据中检测有悖于安全验证规则的数值序列,将其视为违反规则的缺陷实例并将其进行上报。 为了检验这种方法的功效,针对C语言程序设计研发了一个相应的安全验证规则提取和缺陷检测原型系统--SVR-Miner,并使用该检测系统在Linux内核源码上开展了相应的实验检测,最终获得了8个可疑的编码缺陷,其中5个是已知的编程漏洞。对于剩下的3个可疑缺陷,将其报告给了Linux内核开发组织。实验结果表明,此工具能够快速准确地提取出大型软件代码中隐含的安全验证规则,并有效地将所获得的规则应用于对缺陷的检测。