关于漏洞挖掘1、什么是软件漏洞广义上的软件安全漏洞,主要是指在软件的编写过程中,容易对整个计算机软件系统造成安全性方面威胁的缺陷,或者是能够对整个系统的运行带来影响的各类因素的总和。由于计算机软件都是人为编制的,所以都会因为软件的编制人员在编制软件过程中的考虑问题不全面带来安全漏洞。我们对组态软件的漏洞定义包括:软件运行、使用中的异常;协议方面的漏洞;计算机遭受病毒入侵感染后软件的异常运行行为。2、软件漏洞检测常用的技术(1)静态检测(白盒分析)通过一定的技术直接分析软件的源代码,通过对编程源代码中的语法、语义进行分析,从最基本的逻辑中检测和去除可能存在的安全隐患或者说软件漏洞。目前在静态测试过程中主要采取的方法有推断、数据流分析以及约束分析这三类。其中,推断主要是将同语法类型的源代码进行总结,有针对性地进行推断,而数据流分析是通过断点检测的方法分析源代码中数据的走向,以此来判断源程序中是否会有安全隐患,约束分析就是在源代码的一些地方认为增加一些可能发生的约束条件,看软件是否会产生存在安全隐患的相应。(2)动态测试(黑盒分析)首先将软件“跑起来”,在软件执行的情况下对软件中的变量在特定时间域内的数值变化提取出来进行分析,看其是否符合我们预定的变化轨道,以此来判断软件在哪一个环节会存在安全。动态测试中的一种方式是在动态测试的过程中就进行软件数据信息的收集工作,而另外一种方式是将执行过程中的信息做全纪录,之后再用这些信息进行漏洞模式匹配,查找软件漏洞。(3)混合检测混合检测并不是单纯地将静态检测和动态检测结合起来形成先静态后动态或者先动态后静态的检测方法。而是在结合了二者的内容衍生出的检测方法,兼顾有两种检测方法的特点。这其中就包括了测试库技术、源代码的改编技术以及异常检测技术等多种技术。这些技术都是使用在不同需求和不同环境下的混合软件漏洞检测技术。3、基于模糊测试(FUZZ)的强制发现软件漏洞Fuzzing,在学术界与模糊测试最接近的专业术语可能是边界值分析(boundaryvalueanalysis,BVA),在边界值分析中,需要考察给定输入的合法值的边界,然后以边界内和边界外的合法和非法值来创建测试。BVA可以帮助确保异常处理机制能够过滤掉非预期的值,同时允许最大范围的可接受的输入值。模糊测试类似于VBA,但是在执行模糊测试时,我们并不仅仅唯一关注边界值,而是需要额外关注任何可能引发未定义或不安全行为的输入。模糊测试的阶段包括:1.识别目标。在没有考虑清楚目标应用程序的情况下,不可能对模糊测试工具或技术作出选择。如果是在安全审核的过程中对内部开发的应用程序进行模糊测试,目标应用程序的选择应该小心谨慎。相反,如果是对第三方应用程序进行安全漏洞的发掘研究,这种选择就有一定的灵活性。在识别目标应用程序的时候,需要考察开发商过去被发现的安全漏洞的相关历史。这可以通过浏览安全漏洞收集站点来完成,例如SecurityFocus17或Secunia18。一个开发商如果在过去的安全漏洞历史记录方面表现不佳,那么很可能有比较差的编码习惯,最终将会导致更多的安全漏洞被进一步发现。选择了目标应用程序之后,还必须选择应用程序中具体的目标文件或库。如果确要选择目标文件或库,应该选择那些被多个应用程序共享的库,因为这些库的用户群体较大,出现安全漏洞的风险也相应较高。2.识别输入。几乎所有可被人利用的漏洞都是因为应用程序接受了用户的输入并且在处理输入数据时没有首先清除非法数据或执行确认例程。枚举输入向量对模糊测试的成功至关重要。未能定位可能的输入源或预期的输入值对模糊测试将产生严重的限制。在查找输入向量同时应该运用水平思考。尽管有一些输入向量是很明显的,但是其它一些则难以捉摸。最后要说的是,任何从客户端发往目标应用程序的输入都应该被认为是输入向量。这些输入包括消息头、文件名、环境变量、注册键值等等。所有这些都应该被认为是输入向量,因此都应该是可能的模糊测试变量。3.生成模糊测试数据。一旦识别出输入向量,模糊测试就必须被生成。如何使用预先确定的值、如何变异已有的数据或动态生成数据,这些决策将取决于目标应用程序及其数据格式。不管选择了哪种方法,这个过程中都应该引入自动化。4.执行模糊测试数据。这一步与前一步并行进行,在这一步,模糊测试成为一个动词。执行过程可能包括发送数据包给目标应用程序、打开一个文件或发起一个目标进程。同样,这个过程中的自动化也是至关重要的。没有自动化,我们便无法执行真正的模糊测试。5.监视异常。在模糊测试过程中,一个至关紧要但却被经常忽视的步骤是对故障或异常的监视过程。举一个例子,如果我们没有办法准确指出是哪一个数据包引起崩溃的话,那么向目标Web服务器发送10000个模糊测试数据包并最终导致服务器崩溃便是一次无用的努力。监视可以采用多种形式并且应该不依赖目标应用程序和所选择的模糊测试类型。6.确定可利用性。一旦故障被识别,因审核的目标不同,还可能需要确定所发现的bug是否可被进一步利用。这典型地是一个人工过程,需要具备安全领域的专业知识。因此执行这一步的人可能不是最初执行模糊测试的人。4、模糊测试框架模糊测试框架可用于对不同目标的模糊测试。模糊测试框架其实就是一个通用的模糊器或模糊器库,它简化了许多不同类型的测试目标的数据表示,例如SPIKE和Peach。典型地,模糊测试框架包括一个库用来产生模糊测试字符串或者通常能够导致解析例程出现问题的数据值。此外,典型的模糊测试框架还包括一组例程以简化网络和磁盘输入输出。模糊测试框架还应该包括某种脚本类语言,以便在创建具体的模糊器时使用。模糊测试框架是流行的,但它绝对不是完全充分的解决方案。使用或设计一个模糊测试框架也有它的优点或缺点。优点包括:可重用性。如果创建了一个真正通用的模糊测试框架,这个框架便可以在测试不同目标软件时被反复使用多次。群体介入。大项目的群体参与比小项目的群体参与更容易,并且大项目可以被反复使用多次,小项目只有相对狭小的使用空间,例如专门协议的模糊器。模糊测试框架有下列缺点:局限性。即使对于仔细设计的框架,研究者也很可能遇到不适合该框架的测试目标。这通常令人沮丧。复杂性。获得一个通用的模糊测试接口是好事,但是却要花费时间来学习如何驱动这样的框架。有时掉转车轮重新开辟模糊测试接口可能在时间上会更高效,但这样做可能会破坏原来的框架。开发时间。对于一个具体的协议来说,设计一个完全通用和可重用的模糊测试框架要比单独为其开发一个程序所需要的工作量大得多。这些工作量的差异几乎总是会在开发时间上有所体现。工具使用介绍:1、FileFuzz文件格式Fuzz(FileFuzz)就是这种利用畸形文件测试软件鲁棒性的方法。一个FileFuzz工具大体的工作流程包括以下几步,如图17.1.1所示。(1)以一个正常的文件模板为基础,按照一定规则产生一批畸形文件。(2)将畸形文件逐一送入软件进行解析,并监视软件是否会抛出异常。(3)记录软件产生的错误信息,如寄存器状态、栈状态等。(4)用日志或其他UI形式向测试人员展示异常信息,以进一步鉴定这些错误是否能被利用。2、PeachPeach是一款用Python写的开源的SmartFuzz工具,它支持两种文件Fuzz方法:基于生长(GenerationBased)和基于变异(MutationBased)。基于生长的Fuzz方法产生随机或启发性数据来填充给定的数据模型,从而生成畸形文件。而基于变异的Fuzz方法在一个给定的样本文件基础上进行修改从而产生畸形文件。Peach使用XML语言来定义数据结构,这种定义数据结构的文件被叫做PeachPit文件,使用方法见usage.txt3、ftpfuzzftpfuzz是专门用来测试FTP协议安全的工具,基本原理是通过对FTP协议中的命令及命令参数进行肮脏数据替换,来构造畸形的FTP命令并发送给被测试FTP服务程序。