软件静态安全检测技术是针对未处于运行状态的软件
所开展的安全分析测试技术。静态安全检测技术可以用于对软件源代码
和可执行代码
的检测。
静态安全检测技术是软件源代码的主要安全检测技术。
优
缺
目前常用的静态安全检测技术:
使用HOOK技术,可以使得原有的调用strcpy
的函数,变成调用我们自己的相关函数,而我们自己的相关函数可以有效的记录相关的执行行为,进而为漏洞检测提供基础数据。
如何实现一般函数的HOOK
?
首先,了解API HOOK
和PE
文件的关系
Api hook
技术的难点,并不在于hook技术,而在于对PE结构的学习和理解。如何修改api函数的入口地址?这就需要学习PE可执行文件如何被系统映射到进程空间中,学习PE格式的基本知识。
PE文件提供了一个输入符号表imported symbols table
来定义了所调用的函数的入口地址。
pe格式的基本组成 | |
---|---|
DOS文件头 | 以4D5A的16进制即MZ 开头 |
PE文件头 | 以50450000的PE00 开头 |
可选头文件 | 包含下面的数据目录 |
数据目录 | 函数入口地址 / 基地址 / 内存 / 文件对齐粒度之类信息 |
节表 | 维护一个所有节的信息 |
节表1 | 具有同类特征的信息,文件的主体部分 |
节表2 | |
... | |
节表n |
我们需要从数据目录数组中的第二个元素——输入符号表的位置,它是一个IMAGE_DATA_DIRECTORY
结构,从它中的VirtualAddress
地址,找到api函数的入口地点。
使用LordPE
打开一个PE文件 -- 点目录,可以看到目录表 -- 点输入表的右侧第一个按钮,可以看到所调用的函数的入口信息
所调用的函数,主要由两部分:DLL文件及DLL文件中的函数。因此,DLL注入是HOOK的一个基本实现方法。
这样的话,一种实现HOOK的方式就是:
KERNEL32.DLL
的函数进行HOOK
,那么使用VC IDE建立一个DLL动态链接库工程,将相关的函数按照KERNEL32.DLL
中的函数原型进行重新定义,命名为自己的函数软件动态安全检测技术是针对运行中的软件程序,通过 构造非正常的输入 来检测软件运行时是否出现故障或崩溃等非正常的输出,并通过检测软件运行中的内部状态信息来验证或者检测软件缺陷的过程,它的分析对象是可执行代码。
动态安全检测技术是通过实际运行发现问题,所以检测出的安全缺陷和漏洞准确率非常高,误报率很低。
模糊测试(Fuzzing
)是一种自动化或半自动化的安全漏洞检测技术,通过向目标软件输入大量的畸形数据并监测目标系统的异常来发现潜在的软件漏洞
模糊测试属于黑盒测试的一种,它是一种有效的动态漏洞分析技术,黑客和安全技术人员使用该项技术已经发现了大量的未公开漏洞。
它的缺点是畸形数据的生成具有随机性,而随机性造成代码覆盖不充分导致了测试数据覆盖率不高。
知名的模糊测试工具包括SPIKE
、Peach
等。
模糊测试需要根据目标程序的多种因素而选择不同的方法,这些因素包括目标程序不同的输入、不同的结构信息、研究者的技能以及需要测试数据的格式等。然而不管针对何种目标程序采取何种方法,通常的模糊测试过程基本都采用以下几个通用的步骤。
所有类型的模糊测试技术,除了最后一步确定可利用性外,所有其它的四个阶段都是必须的。尽管模糊测试对安全缺陷和漏洞的检测能力很强,但并不是说它对被测软件都能发现所有的错误,原因就是它测试样本的生成方式具有随机性。为了弥补它的这个缺点,有实力的研究机构和公司采用了多台测试服务器组成的集群进行分布式协同测试,甚至测试用的服务器达到几十台。通过这种增加物理资源的手段,在一定程度上弥补了模糊测试的不足。
模糊测试方法是应用最普遍的动态安全检测方法,但由于模糊测试数据的生成具有随机性,缺乏对程序的理解,测试的性能不高,并且难以保证一定的覆盖率。为了解决这个问题,引入了基于符号执行等可进行程序理解的方法,在实现程序理解的基础上,有针对性的设计测试数据的生成,从而实现了比传统的随机模糊测试更高的效率,这种结合了程序理解和模糊测试的方法,称为智能模糊测试(smart Fuzzing
)技术。
智能模糊测试具体的实现步骤
<name></name>
:被测试软件及其处理文件类型的名称<fileName>+<fileDescription>
:填写被测试文件类型<sourceFile>以及<sourceDir>
:由于FileFuzz程序利用了直接暴力方式修改测试的思想,那么它首先需要一个进行修改的原始文档文件,然后将对这个 文件进行不断地修改保存,接着将这些保存后的文件作为测试文件让被测试软件打开,从而发现软件存在的漏洞。<app>
:填写被测试文件处理型软件的程序名称,以及程序所在的物理路径信息。<target>
:指被测试文件所在的路径,这里保持与<sourceDir>
一栏一致。保持修改后的targets.xml
的文件,然后重新运行FileFuzz
程序,这时就能够在软件上方的列表中找到想要测试的文字处理型软件
在C盘ppt2003目录下建立原始文档文件test.ppt
,这里演示漏洞MS06-028。请暂时重新安装到SP2的最初版本11.6564.6568,以便测试分析。
新建一个空白的test.ppt
文件,用分别以单、双字节的0f进行fuzz,能重现这个漏洞。
FileFuzz
配置成上图。
Target
:用来替换原始文档文件内容的数据,这里修改为0f、2个字节。Scope
:关于修改模式的选项
All Bytes
是逐个字节修改Range
是对原始文档文件的某个范围进行修改Depth
是按照阶梯的形式来修改原始文档文件Match
则是使用替换指定字节的方式来生产测试文件单击Create
按钮,FileFuzz
就会按照要求在<targetDir>
栏指定的目录下生成测试文件。
生成待测文件后,以进行Fuzz测试。
单击Execute
按钮,切换到测试面板,并将Start File
和Finish File
修改为刚刚生成的测试文件的起始序号。
接下来单击Execute
按钮,FileFuzz
将会开始进行自动化的安全测试工作。一旦FileFuzz
检测到被测试软件在处理某个测试文件时发生了错误,FileFuzz
程序会马上在程序的最下方显示错误信息,如下图所示。
FileFuzz
程序在很大程度上简化了我们手工发掘文字处理型软件漏洞的过程,自动化的程序测试可以节省大量的时间。overflow.exe
#include <stdio.h>
#include <string.h>
void overflow(char *b)
{
char des[50];
strcpy(des,b);
}
void main(int argc,char *argv[])
{
if(argc>1)
overflow(argv[1]);
else
printf("usage: overflow XXXXX\n");
}
对该exe文件进行模糊测试的话,根据该exe
文件要求提供一个输入字符串、对字符串格式无要求的事实,所编写的Fuzzer
只需要构造不同长度的输入字符串就可以达到模糊测试的目的。
明确了输入的要求和暴力测试的循环条件后,可以写出如下的代码
for
循环构造不同的字符串作为输入,通过ShellExecute(NULL,"open",argv[1],buf,NULL,SW_NORMAL);
来实现对目标程序的模糊测试。上述Fuzzer
的调用格式为:Fuzzing X 1
。X
表示目标程序,1
表示递增暴力测试。目前普遍应用的动静结合安全检测技术主要包括两种
将动态分析和静态分析结合起来对二进制进行分析,这种技术比单纯的动态和静态分析更加复杂,比较有代表性的是BitBlaze
。
BitBlaze
由三部分组成:TEMU
,VINE
和Rudder
。
TEMU
是BitBlaze
的动态分析模块,其实质是一个虚拟机,可执行程序在该虚拟机上执行,并记录下执行的指令、操作数等,生成追踪的记录。TEMU
借助虚拟机实现了全系统模拟,不但可以跟踪用户控件的指令流,而且可以跟踪进入系统内核,记录其指令流和操作数。VINE
是BitBlaze
的静态分析模块,它分为前端和后端两部分,前端将二进制指令提升为VINE
中间语言(VINE Intermediate Language: VINEIL
)。后端用来在VINEIL
上做静态分析,包括函数调用图和控制流图建立,数据流分析,符号执行等。此外,VINE
的后端模块记录追踪路径的约束条件,可将某个路径约束取反,生成满足新路径约束条件的输入,供Rudde
r模块使用。Rudder
模块层次在TEMU
和VINE
模块之上,是一个混合进行符号执行和实际执行的一个模块。如果检测到符号输入影响到执行路径的选择,Rudde
r会将具体执行和符号执行结合起来,探测多条可执行的路径。探测多条路径的具体过程是,Rudder
首先随机生成一个输入数据,利用TEMU
进行跟踪,利用VINE
记录路径约束,然后将其中的约束条件取反,利用约束求解器生成能够满足新的路径约束的输入数据,再将TEMU
追踪该输入数据,如此循环往复,从而保证每次的输入数据执行的是一条尚未执行过的路径。BitBlaze
本质上是一个动态Fuzzing
工具,它可以保证每次执行的都是不同的路径,以此来提高测试的有效性。