1. 漏洞挖掘概述
1.1 Fuzz测试
这是一种黑盒测试,与基于功能性的测试有所不同,Fuzz主要目的是"crash"、"break"、"destroy"。
Fuzz的测试用例往往是带有攻击性的畸形数据,用以触发各种类型的漏洞。
Fuzz测试的优点:很少出现误报,能够快速找到真正的漏洞
Fuzz测试的缺点:永远不能保证系统中已经没有漏洞
1.2 学术界与工业界的区别
学术界偏向于对源代码进行静态分析,直接在程序的逻辑上寻找漏洞。方法和理论有:(可追溯于1976年在ACM Computing Surveys上的论文Data Flow Analysis Software Reliability)
- 数据流分析
- 类型验证系统
- 边界检验系统
- 状态机系统等
1.3 审计源代码的工具
- Fortify在编译阶段扫描若干安全风险
- Rough Auditing Tool for Security(RATS)用于分析C/C++语言的语法树,寻找存在潜在安全问题的函数调用
- BEAM(Bugs Errors And Mistakes),IBM的静态代码分析工具,使用数据楼分析的方法,分析源代码的所有可执行路径,以检测代码中潜在的bug
- SLAM用于检测驱动中的bug
- Flaw Finder用Python语言开发的代码分析工具
- Prexis可审计多种语言的源代码,审计的漏洞类型超过30种
2. 动态测试技术
2.1 SPIKE
SPIKE是Protocol Fuzz(针对网络协议的模糊测试)工具
spike运行在linux环境下,当然对代码进行一定的修改之后就可以运行在windows上。
Dave Aitel实现了一套功能强大的API和数据结构用于定义数据块。SPIKE就是这样一套函数与数据结构的集合。
Hello World用例:
2.2 beSTORM简介
由Beyond Security安全公司开发,运行在windows上的一款全能型安全审计程序,其利用模糊测试技术实现对网络协议的安全测试。
3. 静态代码审计
Coverity是用来提高软件质量的源代码静态分析工具。
Coverity使用checker模块来检测漏洞,默认情况下的checker包括:
- C checkers,内存错误、缓冲区溢出、函数的参数及返回值
- Concurrency checkers,线程同步、锁机制等
- Security checker,可信数据流的分析、字符串溢出等
所有静态代码分析的理论和技术都面临的棘手问题:
如何处理程序逻辑中由动态因素引起的复杂条件分支和循环