几种C/C++语言安全检测工具介绍

来源:互联网 发布:金陵科技学院网络教育 编辑:程序博客网 时间:2024/05/16 10:59

转自新浪微博http://www.vckbase.com/index.php/wv/1635

 

针对C/C++语言安全漏洞的分析检测也出现了大量的工具,按照不同的机理主要分为以下几类,如表所示:

分析类型

机理

分析工具

备注

静态分析

预处理

FormatGuard

预处理提供的宏功能来对printf函数中的参数个数进行计数

词法分析

Rats、Flawfinder、Its4

见后文介绍

语法分析

Antlr/Gold

见后文介绍

注解分析

Splint/

见后文介绍

语义/值流分析

Cqual

见后文介绍

逆向分析

IDA/ Win32Dasml

反汇编工具

动态分析

拦截库函数的调用

LibFormat

见后文介绍

逆向分析

OllyDbg/ Windbg

动态调试工具,常结合静态反汇编工具对程序进行逆向分析


  FormatGuard:Linux下防止格式化字符串攻击的工具,是对glibc的增强。具体通过预处理提供的宏功能来对类printf函数中的参数个数进行计数,通过glibc提供的parse_printf_format函数来对转换说明符进行计数。如果转换说明符的数目大于提供给printf的参数个数,_proteced_printf函数认为可能遭受格式串攻击,发出警告。但该工具不能分析类vprintf函数(而此类函数却大量存在)
   LibFormat:Unix中提供了一个有用的环境变量LD_PRELOAD,它允许我们定义在程序允许前优先加载的动态链接库。主要思想,通过动态连接器将自己插入到程序中,在程序以后的运行中如果发现了包含%n的格式串出现在可写内存中,则终止程序。但对读操作却无能为力,而且遇到的任何%n格式串,都会终止程序,误报高。
   ANTLR:识别和处理编程语言是 Antlr 的首要任务,编程语言的处理是一项繁重复杂的任务,为了简化处理,一般的编译技术都将语言处理工作分为前端和后端两个部分。其中前端包括词法分析、语法分析、语义分析、中间代码生成等若干步骤,后端包括目标代码生成和代码优化等步骤。Antlr 致力于解决编译前端的所有工作。使用 Anltr 的语法可以定义目标语言的词法记号和语法规则,Antlr 自动生成目标语言的词法分析器和语法分析器;此外,如果在语法规则中指定抽象语法树的规则,在生成语法分析器的同时,Antlr 还能够生成抽象语法树;最终使用树分析器遍历抽象语法树,完成语义分析和中间代码生成。整个工作在 Anltr 强大的支持下,将变得非常轻松和愉快。另外,Antlr的词法分析器生成器,可以很容易的完成正则表达式能够完成的所有工作;除此之外使用 Anltr 还可以完成一些正则表达式难以完成的工作,比如识别左括号和右括号的成对匹配等。
   GOLD:它是一个较为复杂的分析器,支持很多语言,包括:Assembly – Intel x86 、ANSI C、C#、D、Delphi、Java、Pascal、Python、Visual Basic、Visual Basic .NET、Visual C++、所有.NET语言、所有ActiveX语言。是个免费的软件。
   Its4:读取一个或多个C/C++源程序,将每个源程序分割成函数标志流,然后检查生成的标志是否存在于漏洞数据库中,从而得到每个源程序的所有错误警告列表,并带有相关的描述。其规则库vulns.i4d定义了各种函数的危险等级,描述等,通过规则匹配来报出风险,但它不能理解程序上下文意思,存在很大的误报。
   Flawfinder:词法扫描和分析,内嵌了一些漏洞数据库,如缓冲区溢出、格式化串漏洞等,扫描快,按照代码中漏洞的风险等级对漏洞进行划分,可以快速找到存在的问题,误报较高
   Rats:扫描C、C++、Perl、PHP和Python开发的源程序中潜在的漏洞,扫描规则比较粗糙
   词法分析工具的分析流程:



描述:
   (1)输入待扫描的源程序文件或者文件夹,分析输入的文件和文件夹,识别出其中的所有源程序文件,建立一个待扫描文件列表,下一步就可以从待扫描文件列表中有序的读取带扫描文件进行扫描。
   (2)当词法分析工具得到一行待分析文件的源代码的同时,从危险函数数据库中提取一个等级的危险函数与该行源代码进行匹配,这就是初步分析。
   (3)如果在初步分析中匹配成功,那么词法分析工具将使该行代码进入下一步的分类特征分析,否则,返回继续进行下一行的初步分析。
   (4)词法分析工具不断的读取源代码按照设定的危险等级进行分析,直到最后生成报告,以便开发者进行改进。
   Cqual:采用语义/值流分析,该工具的功能即是查找格式化字符串缺陷,const数据类型以及结构体的检查等。其分析流程如下:



   (1)用户输入源文件和格配置文件,作为程序的输入。Cqual内置了常用的分析模式(格配置),在分析常用缺陷时,直接使用其自带的配置文件
   (2)Cqual前端对C文件进行词法分析和语法分析,生成抽象语法树
   (3)遍历抽象语法树,根据类型推断系统,生成限定子约束关系。Cqual在分析之初,会为每个变量创建一个同名的限定子变量。通过遍历语法树,Cqual能够执行高效的流不敏感的类型推断,从而检查推断出剩余的类型限定子并检查一致性。在执行推断的时候,Cqual会产生限定子和限定子变量之间的一系列约束。
   (4)使用约束求解算法对约束不等式组进行求解。如果不等式组没有解,则Cqual认为发现错误,重新遍历一遍约束图,输出对用户最有用的错误路径信息然后退出。否则,它认为源程序没有缺陷,直接退出。Cqual的一个优势在于发现错误时,能够输出合理的错误路径,这有利于用户快速定位错误。
   Cqual采用的是覆盖全部路径,因此也存在误报
   splint:是一个动态检查C语言程序安全弱点和编写错误的程序.splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
Cppcheck
   http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page
   cppcheck是静态的C/C++ 代码分析工具,用以检查内存泄漏,错配的内存分配和释放,缓冲区溢出,以及更多的问题。
   Frama-C
   是一个用来分析 C 代码的工具,它收集了很多静态统计技术,如代码切片和依赖分析等。http://www.oschina.net/p/frama-c
   Flexc++
   是一个语法扫描器生成工具,基于正则表达式。与 Flex 和 Flex++ 高度一致。
   http://www.oschina.net/p/flexcpp
   另外介绍一个商业的源代码静态扫描工具Fortify SCA:该工具是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果中不但包括详细的安全漏洞的信息,还会有相关的安全知识的说明,以及修复意见的提供。
   工作原理:
   Foritfy SCA 首先通过调用语言的编译器或者解释器把前端的语言代码(如JAVA,C/C++源代码)转换成一种中间媒体文件NST(Normal Syntax Tree)将其源代码之间的调用关系,执行环境,上下文等分析清楚。然后再通过上述的五大分析引擎从五个切面来分析这个NST,匹配所有规则库中的漏洞特征,一旦发现漏洞就抓取出来。最后形成包含详细漏洞信息的结果文件。
   目前Fortify SCA可以扫描出约350种漏洞,Fortify将所有安全漏洞整理分类,根据开发语言分项目,再细分为8个大类,约350个子类。
   IDA:记录把跟踪事件记录在一个跟踪缓存区中。跟踪缓存区的大小可以设定为无限大(此时你需要很多内存),或者固定的大小(这种情况下,新的跟踪事件会覆盖老的跟踪事件)。
   IDA提供几种不同的跟踪机制:
   1、指令跟踪:IDA将会记录每一条指令的执行,并保存寄存器数值,通过使用这些信息,你可以找出应用程序的执行过程,并可找出哪条指令修改了哪个寄存器。
   2、函数跟踪:IDA将会记录所有的函数调用和函数返回。
   3、读写-写-执行跟踪:IDA将会记录一个对指定地址的所有访问。这种机制相当于是不停止的断点。
   OllyDbg:具体步骤是首先加载启动被分析软件程序的二进制可执行文件,然后根据前一节中静态分析的断点列表信息设置断点,结合函数调用关系图(FCG)和控制流图(CFG)等对程序的执行过程进行跟踪,同时记录程序执行的路径以及数据流信息,接着通过人工经验的分析,找到可疑的漏洞及漏洞可能产生的原因,最后通过注入相应的错误代码来触发漏洞,以是否发生异常去判断该可疑的漏洞是否为真实的漏洞。MS06-040漏洞的检测即可以通过这个动静结合的检测方案被成功检测出来的。
   windbg:是在windows平台下,强大的用户态和内核态调试工具
   总结:以上工具中IDA、OllyDbg有操作过,限于本人汇编很菜,没有什么使用体会;Rats、Flawfinder、Its4、Splint、Cqual、Cppcheck有使用过,并将这些工具融合到了一个分析平台中;Foritfy SCA这个工具用过它的试用版,做的很优秀,可惜太贵,要一百多万吧,不过可以先学习下它的漏洞分类,详情参见https://www.fortify.com/vulncat/zh_CN/vulncat/index.html