C/C++源代码安全检测系统的设计与实现

2016-07-09 08:38龙刚何建安高嵩曾奕张生林
数字技术与应用 2016年6期
关键词:源代码

龙刚 何建安 高嵩曾奕 张生林

摘要:通过比较国内外C/C++源代码安全检测技术的发展状况,阐述了研制C/C++源代码安全检测系统的必要性。讨论了C/C++源代码安全检测领域的关键技术,描述了C/C++源代码安全检测系统的主要功能、系统架构和实现途径,并指出了C/C++源代码安全检测系统下一步的改进方向。

关键词:源代码 软件安全性 静态分析

中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2016)06-0150-02

Abstract:Through the development status of domestic and foreign C/C++ source code security detection technology, this paper expounds the necessity of the development of C/C++ source code security detection system. Discuss the key technology in the field of C/C++ source code security detection, describes the C/C++ source code security detection system, the main function, system architecture and realization method, and points out that the C/C++ source code security detection system further improvement direction.

Key Words:source code; software security; static analysis

随着软件技术和网络技术在各个行业的广泛应用,以及以Linux操作系统为标志的自由软件的大量存在和应用,人们面临的软件安全问题也日渐增多。研究表明,相当数量的安全问题都是由于软件自身存着的安全漏洞引起的,恶意的攻击者利用这些安全漏洞提升权限,访问未授权资源,甚至破坏敏感数据,从而造成重大损失,近期发生的Struts2安全事件和OpenSSL出现“Heartbleed”安全漏洞均造成了很大影响。存在于计算机系统中的软件安全漏洞已经成为信息安全的一个核心问题。

1 国内外研究现状

目前,对于软件的安全性分析挖掘,以美国为代表的信息化发达国家已经全面起步:美国国土安全部作为美国风险评估的领路者,拥有庞大的研究力量,几乎影响着全世界在风险评估领域的概念、观念和理念。上个世纪90年代末,美国开始把风险评估的范畴延伸到软件源代码上,在政府、学术界和产业界开展源码安全分析与同源性测试。2004年由国土安全部主持了两个大型安全项目DETER和EMIST,用以建设软件安全测试床,开发科学、严格的攻击和预防机制,研究软件安全测试评估框架和方法,实施软件漏洞分析与风险评估工作。2005年,美国总统信息技术咨询委员会关于信息安全的年度报告中指出,美国政府部门和军方等敏感部门使用的软件产品,必须加强漏洞分析和风险评估,尤其提到这些软件产品应进行源码安全分析测评。在美国国土安全部的资助下,NIST设立了软件保证度量和工具测量项目(Software Assurance Metrics And Tool Evaluation,SAMATE),其核心就是对软件安全性进行分析研究。为了减少开源软件的源码缺陷,2006年初美国国土安全部设立了一个长期的开源软件源代码安全测试计划,对包含Linux等在内的1750多万行开源软件的源代码进行缺陷测试,以有力地保障这些软件的安全性。在企业界,包括微软、AT&T、Dell、Oracle、苹果等世界知名软件公司都已经或正在部署软件源代码安全性检测系统。此外,微软公司还提出了安全开发生命周期(SDL)的概念,将安全开发贯穿软件生命周期的整个过程。它的基本原则是:安全的设计、安全的开发、安全的部署,通过SDL可以在很大程度上降低软件安全风险[1-3]。

而国内对软件的安全性检查和验证研究,还比较少,关于源代码的静态分析工具的研制应用主要是致力于某类缺陷的检测,没有集成的环境进行支撑。因此,开展C/C++源代码的检测技术的集成研究和工具化势在必行[4-5]。

2 关键技术

C/C++源代码静态分析中主要涉及的关键技术包括:C++源代码解析、路径敏感的过程间遍历算法的设计以及状态缓存机制等。

(1)使用GCC作为源代码解析的工具,由GCC负责进行源代码的词法语法分析与CFG生成。

(2)使用基于变量安全状态跟踪的模型进行C/C++的漏洞的检测。一般而言,是指:使用基于有限状态机的漏洞状态机描述程序变量安全状态的转换规则;检测工具对程序各可能执行路径进行路径敏感的过程间的静态遍历并识别当前操作;对当前操作所涉及的程序变量根据状态机赋予其对应的安全状态。在检查点处,检测工具检测相关操作数据是否具有期望的安全状态,若出现与期望安全状态不符的情况,则表示发现了一个可能的安全漏洞。

(3)路径敏感的过程间遍历算法的设计。路径敏感的遍历是指根据代码实际的可能执行路径的遍历,而不是直接按照源代码自上而下的遍历。过程间的遍历是指当遍历遇到一个用户定义的函数时,能够进入该函数,处理完该函数之后返回到调用点继续遍历。路径敏感和过程间的遍历是提高静态分析精确度、减少漏报和误报的有效手段。

(4)状态缓存机制,基本块层面的基于历史状态检测的方法在过程内检测中能够很好的处理不同路径上状态一致以及循环停止的问题,但是在过程间检测中就可能出现问题。应该以历史状态为基础,针对过程间分析进一步完善缓存机制。

(5)采用一种基于内存模拟的方法实现别名分析。具体的说,就是为每个对象(指针变量)分配一个内存区域,该区域中保存该对象的状态、字段等信息;如果两个对象互为别名,就让这两个对象指向同一个内存区域。

3 系统概述

C/C++源代码安全检测系统适用于任何行业软件C/C++源代码的检测工作,它为用户的主机应用系统和基于WEB网站的业务系统提供全方位的基于源代码的安全审计。在装备类软件、金融、政府等大型复杂应用系统的软件开发、测试等阶段,均可使用该系统进行源代码审计工作,包括如下的内容:源代码的缺陷和错误检查;分析并找到缺陷、错误引发的安全漏洞,提供代码修订措施和建议,帮助用户节约开发成本,最大程度地保证了系统的健壮性,辅助软件企业提升生产效率。

C/C++源代码安全检测系统的分析过程采用C/S架构,分析结果的展示以B/S架构来实现。能够与各类开发环境相集成。源代码解析为基础,缺陷分析为核心,结果构建为手段,人机界面、项目管理、扩展接口为支撑和辅助,系统架构如图1所示。

4 功能设计与实现

整个C/C++源代码缺陷分析系统要实现如下子模块。(如表1)

4.1 源代码解析模块的实现

基于源代码的静态代码分析技术对于编译技术的借鉴主要集中在编译前端部分,即在词法分析和语法分析环节。考虑到本模块要处理的C/C++涵盖Visual C++和GNU C++两个平台,因此设计实现一个常规的能同时覆盖两个平台的C++编译前端。

源代码预处理的流程如图2所示。

经过源代码预处理之后,不管是VC++项目源文件还是GCC/G++项目源文件,都通过GCC前端进行解析,生成CFG以及中间表示形式等数据结构。图3展示了一个由gcc生成的CFG的示例:

4.2 缺陷分析模块的实现

C/C++源代码静态分析系统的缺陷分析由两部分组成:基于语义的缺陷分析和基于控制流的缺陷分析。其中基于语义的缺陷分析对变量未使用、函数未使用、变量未初始、类型转换化以及C/C++特性相关的三种缺陷(关键性变量被声明为公共的、关键性公共域缺乏适当的析构处理、异常处理中缺乏一般化例外的捕获)进行检测;基于控制流的缺陷分析对内存泄露、两次释放、释放后再使用、返回空值、空指针引用、资源未释放、竞争条件、拒绝服务、格式化字符串、整数溢出、死代码、以及堆栈溢出、数组访问越界等缺陷的检测。

类型转换虽然也属于基于语义的缺陷分析,却是在构造CFG完成的基础上,遍历CFG中的语句,根据一定的配置规则进行检测的;其余的基于语义的缺陷分析均是利用解析前端实现的。

在基于控制流的缺陷分析中,我们进一步将缺陷细分为基于控制流的安全状态跟踪(包括内存泄露、竞争条件等7种缺陷)、基于数据流的污点传播跟踪检测(拒绝服务、格式化字符串、整数溢出)、死代码、基于数据流的安全状态跟踪(堆栈溢出、数组越界访问)。

基于数据流的污点传播跟踪检测是首先确定污点数据源,如从网络、文件、用户输入等读取数据的方法,将接受所获取的脏数据的变量标记为Signed,然后根据控制流进行污点传播,在检查点处判断相关变量是否保持Signed状态,如果是,这报告一个相应的缺陷。数据源函数、传播函数、检查点函数等从检测规则集中获取。具体的检测流程如图4所示。

死代码的检测是利用约束求解技术,判断对于每条路径都不可行的代码块,这些代码块即被认定为死代码。

基于数据流的安全状态跟踪(堆栈溢出、数组越界访问)检测技术与死代码的检测具有相关性,都是使用约束求解技术。所不同的是,死代码是根据已有的路径条件判断新遇到的路径条件是否可行,而堆栈溢出和数组越界访问则是利用路径条件判断检查点处的各相关变量之间的关系是否满足所定义的规则,然后根据规则确定是否存在缺陷。在遍历方式,死代码使用了非路径敏感的流敏感遍历方式,而堆栈溢出的检测是路径敏感的遍历方式;同时,死代码无需外部规则,堆栈溢出需要规则定义数据流向、缓冲区的改变以及检查点的设置等。

4.3 结果输出模块实现

结果输出模块与缺陷分析模块进行交互,当缺陷分析模块发现源代码中的缺陷时会调用本模块保存分析结果。保存结果应包含缺陷涉及的变量、缺陷的完整触发路径、数据传播途径、缺陷位置、缺陷类型(以上均可以从变量信息中获得)、缺陷描述、可能的修补手段及危险级别等信息(后面这三项内容从XML规则文档中提取)。

4.4 项目管理模块实现

对被测源码按照项目进行管理,提供项目配置功能,包括源码分析范围,分析级别、分析缺陷类型定制等。提供项目结果输出配置,包括输出缺陷类型、级别、输出形式等。

4.5 人机界面模块实现

提供可视化界面,便于用户进行操作。

4.6 扩展接口模块实现

支持与主流开发环境的集成,如windows平台上的VS系列、中标麒麟平台上的Eclipse和QT等。

5 结语

C/C++源代码安全检测系统现在已经可以在传统的X86平台下运行使用,目前正在向国产化软件平台进行移植。后期还需要开展的工作包括:与中标麒麟操作系统进行适配、与国产硬件平台进行适配优化和对核心源码分析模块进行重构等。

参考文献

[1]EVANS D,LAROCHELLE D.Improving security using extensible light-weight static analysis[J].IEEE Software, 2002,19(1):42-51.

[2]BRIAN C. Static analysis for security[J].IEEE Security & Privacy,2004,7(4):32-36.

[3]Institute ANS. ISO programming language C++[S].2003.

[4]李晓南,范明钰,王光卫.基于静态检测工具的源代码安全缺陷检测技术[J].计算机应用研究,2011,28 (8):2997-2998.

[5]林锐,韩永泉.高质量程序设计指南—C/C++语言[M].北京电子工业出版社,2008:240-247.

猜你喜欢
源代码
人工智能下复杂软件源代码缺陷精准校正
基于TXL的源代码插桩技术研究
国际经贸协定中的源代码规则新发展及中国立场
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
软件反向工程的法律规制
源代码安全漏洞检测方法探讨
保护好自己的“源代码”
揭秘龙湖产品“源代码”
从软件源代码的技术特征看开源软件与反向工程的法律属性