2024年3月10日发(作者:)

浅析漏洞挖掘技术

软件测试过程就是一个寻找bug的过程。基于安全性的bug即是漏洞。本

文简单分析了一下漏洞的概念,并着重讲述了漏洞挖掘技术的两种方法——Fuzz

测试和对源代码的静态分析。

标签: 漏洞挖掘 Fuzz测试 静态分析

随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得异常

复杂。为了保证软件的质量,测试成了极为重要的一环。人们花费了大量的资源

对软件进行测试。即便如此,不论从理论上还是工程上都没有任何人敢声称能够

彻底消灭软件中所有的逻辑缺陷——bug。

在形形色色的软件逻辑缺陷中,有一部分能够引起非常严重的后果。人们把

那种能够引起软件做一些“超出设计范围的事情”的bug称为漏洞(vulnerability)。

常见的漏洞包括软件中的缓冲区溢出漏洞、网站中的跨站脚本漏洞(XSS)、

SQL注入漏洞等。

一、利用漏洞进行攻击的方法

利用漏洞进行攻击可以大致分为漏洞挖掘、漏洞分析、漏洞利用三个步骤。

这三部分所用的技术有相同之处,比如都需要精通系统底层知识、逆向工程等;

同时也有一定的差异。

1.漏洞挖掘。安全性漏洞往往不会对软件本身功能造成很大影响,因此很难

被QA工程师的功能性测试发现,对于进行“正常操作”的普通用户来说,更难体

会到软件中的这类逻辑瑕疵了。

2.漏洞分析。一般情况下,我们需要调试二进制级别的程序,以便进行漏洞

分析。在分析漏洞时,可以使用调试器或者补丁比较器,以及一些反汇编工具(如

IDA Pro)来进行。

漏洞分析需要扎实的逆向基础和调试技术,除此以外还要精通各种场景下的

漏洞利用方法。这种技术更多依靠的是经验,很难总结出通用的条款。

3.漏洞利用。漏洞利用技术已经应用于多种主流的操作系统和编译环境下,

主要利用内存漏洞(堆栈溢出)和Web应用漏洞(脚本注入)等来进行。

二、漏洞挖掘技术解析

作为攻击者,除了精通各种漏洞利用技术之外,要想实施有效的攻击,还必

须掌握一些未公布的0day漏洞;作为安全专家,他们的本职工作就是抢在攻击

者之前尽可能多地挖掘出软件中的漏洞。

由于安全性漏洞往往有极高的利用价值,例如,导致计算机被非法远程控制,

数据库数据泄漏等,所以会引起很多攻击者的注意,并愿意花费精力去搜寻漏洞。

寻找漏洞的人并非全是攻击者。大型的软件企业也会雇用一些安全专家来测

试自已产品中的漏洞。

从技术角度讲,漏洞挖掘实际上是一种高级的测试(QA)。学术界一直热衷

于使用静态分析的方法寻找源代码中的漏洞;而在工程界,不管是安全专家还是

攻击者,普遍采用的漏洞挖掘方法是fuzz,这是一种黑盒测试。另外,还有一种

静态分析方法也比较常用。

三、Fuzz测试

Fuzz测试与基于功能性的测试有所不同,Fuzz的主要目的是“crash”、

“break”、“destroy”。

Fuzz的测试用例往往是带有攻击性的畸形数据,用以触发各种类型的漏洞。

Fuzz往往可以触发一个缓冲区溢出漏洞,但却不能实现有效的exploit,测试人

员需要实时地捕捉目标程序抛出的异常、发生的崩溃和寄存器等信息,综合判断

这些错误是不是真正的可利用漏洞。

Fuzz测试最早是由Barton Miller、Lars Fredriksen和Bryan So在一次偶然的

情况下想到的。富有经验的测试人员能够用这种方法crash大多数程序。

Fuzz的优点是迅速、准确,基本上不会出现错报;缺点是Fuzz不保证能够

找出系统里所有的漏洞。

File Fuzz就是这种利用“畸形文件”测试软件鲁棒性的方法。您可以在Internet

上找到许多用于File Fuzz的工具,抛开界面、运行平台等因素不管,一个File Fuzz

工具大体的工作流程包括以下几步。

1.以一个正常的文件模板为基础,按照一定规则产生一批畸形文件。

2.将畸形文件逐一送入软件进行解忻,并监视软件是否会抛出异常。

3.记录软件产生的错误信息,如寄存器状态、栈状态等。

4.用日志或其他UI形式向测试人员展示异常信息,以进一步鉴定这些错误

是否能被利用。

四、静态分析方法

对于攻击者来说,他们非常热衷于使用fuzz工具,因为他们只要找到漏洞

就可以了。

研究安全问题的学者则不同,他们更关心如何能够检测出所有的漏洞(尽管

这是不可能的)。因此,学术界偏向于对源代码进行静态分析,直接在程序的逻

辑上寻找漏洞。这方面的方法和理论有很多,比如数据流分析、类型验证系统、

边界检验系统、状态机系统等。

目前,已经出现了一些通过审计源代码来检测漏洞的产品,如:

y在编译阶段扫描若干种安全风险。

Auditing Tool for Security(R.A.T.S)用于分析C/C++语言的语法树,

寻找存在潜在安全问题的函数调用。

(Bugs Errors And Mistakes)IBM研究院研发出的静态代码分析工具

使用数据流分析的方法,分析源代码的所有可执行路径,以检测代码中潜在的

bug。

使用先进的算法,用于检测驱动中的bug。

Finder用Python语言开发的代码分析工具。

可以审计多种语言的源代码,审计的漏洞类型超过30种。

静态分析方法实际上是一种白盒测试。

静态代码分析技术有一个缺点,那就是经常会产生大量的误报。使用白盒测

试方法的以QA工程师居多。

参考文献:

[1]王 清:0day安全:软件漏洞分析技术.北京:电子工业出版社,2008

[2]软件加密技术内幕.北京:电子工业出版社,2004