博文视点broad 发表于 2014-2-18 16:02:54

什么是模糊测试(2)

2.3模糊测试各阶段
      采用何种模糊测试方法取决于众多因素。没有所谓的一定正确的模糊测试方法,决定采用何种模糊测试方法完全依赖于被测应用、测试者拥有的技能、以及被进行模糊测试的数据的格式。但是,不论对什么应用进行模糊测试,不论采用何种模糊测试方法,模糊测试执行过程都包含相同的几个基本阶段。
1.确定测试目标
      只有有了明确的测试目标后,我们才能决定使用的模糊测试工具或方法。如果要在安全审计中对一个完全由内部开发的应用进行模糊测试,测试目标的选择必须小心谨慎。但如果是要在第三方应用中找到安全漏洞,测试目标的选择就更加灵活。要决定第三方应用模糊测试的测试目标,首先需要参考该第三方应用的供应商历史上曾出现过的安全漏洞。在一些典型的安全漏洞聚合网站如SecurityFocus 和Secunia 上可以查找到主要软件供应商历史上曾出现过的安全漏洞。如果某个供应商的历史记录很差,很可能意味着这个供应商的代码实践 (code practice)能力很差,他们的产品有仍有很大可能存在未被发现的安全漏洞。除应用程序外,应用包含的特定文件或库也可以是测试目标。如果需要选择应用包含的特定文件或者库作为测试目标,你可以把注意力放在多个应用程序之间共享的那些二进制代码上。因为如果这些共享的二进制代码中存在安全漏洞,将会有非常多的用户受到影响,因而风险也更大。
2.确定输入向量
      几乎所有可被利用的安全漏洞都是因为应用没有对用户的输入进行校验或是进行必要的非法输入处理。是否能找到所有的输入向量(input vector)是模糊测试能否成功的关键。如果不能准确地找到输入向量,或是不能找到预期的输入值,模糊测试的作用就会受到很大的局限。有些输入向量是显而易见的,有些则不然。寻找输入向量的原则是:从客户端向目标应用发送的任何东西,包括头(headers)、文件名(file name)、环境变量(environment variables),注册表键(registry keys),以及其他信息,都应该被看做是输入向量。所有这些输入向量都可能是潜在的模糊测试变量。
3.生成模糊测试数据
      一旦识别出输入向量,就可以依据输入向量产生模糊测试数据了。究竟是使用预先确定的值、使用基于存在的数据通过变异生成的值、还是使用动态生成的值依赖于被测应用及其使用的数据格式。但是,无论选择哪种方式,都应该使用自动化过程来生成数据。
4.执行模糊测试数据
      该步骤紧接上一个步骤,正是在这个步骤,“模糊测试”变成了动词。在该步骤中,一般会向被测目标发送数据包、打开文件、或是执行被测应用。同上一个步骤一样,这个步骤必须是自动化的。否则,我们就不算是真正在开展模糊测试。
5.监视异常
      一个重要但经常容易被忽略的步骤是对异常和错误进行监控。设想我们在进行一次模糊测试,在测试中,我们向被测的Web服务器发送了10000个数据包,最终导致了服务器崩溃。但服务器崩溃后,我们却怎么也找不到导致服务器崩溃的数据包了。如果这种事真的发生了,我们只能说这个测试毫无价值。模糊测试需要根据被测应用和所决定采用的模糊测试类型来设置各种形式的监视。
6.判定发现的漏洞是否可能被利用
      如果在模糊测试中发现了一个错误,依据审计的目的,可能需要判定这个被发现的错误是否是一个可被利用的安全漏洞。这种判定过程是典型的手工过程,需要操作者具有特定的安全知识。这个步骤不一定要由模糊测试的执行者来进行,也可以交给其他人来进行。
图2.2展示了模糊测试的各个阶段。


图2.2模糊测试阶段
      无论采用什么类型的模糊测试,以上这些阶段都应该被考虑到,只有 “判定发现的漏洞是否可能被利用”这个阶段可能有例外。根据测试的目的不同,以上各阶段的执行顺序、各阶段的侧重点可以进行调整。虽然模糊测试威力强大,但模糊测试仍然不能保证在被测系统中百分之百地发现所有安全相关的缺陷。下一节中我们会列出一些通过模糊测试很难发现的典型的缺陷类别。
2.4模糊测试的局限性和期望
      模糊测试适合用来找到特定被测系统中的特定弱点。因此,模糊测试能发现的安全漏洞也是有一定局限性的。在本节中我们将展示一些模糊测试器难以发现的典型安全性漏洞。
2.4.1访问控制漏洞
      有些应用需要分级的权限模型来支持多账户或是不同级别的用户。例如,考虑一个通过Web前端访问的在线日程安排系统(Calendaring System)。该应用有一个管理员,管理员可以控制哪些用户能够登录到这个系统。除管理员外,该系统中还有一个特别的用户组,这组用户具有创建日程的权限。除此之外,其他用户只有读权限。在这个系统中,最基本的权限控制是保证一个普通用户无法执行管理员才能执行的任务。
      模糊测试器也许能够发现该日程安排软件中的“允许攻击者取得系统的完全控制权”错误。从低级别来看,这类软件错误在不同被测应用中都可能出现,因此,可以用相同的逻辑来检测不同的测试应用中的这类错误。但是,另一类涉及应用本身逻辑的访问权限问题却很难在模糊测试中被发现。例如,在测试过程中,模糊测试器以普通用户的身份成功访问到了只有管理员才能访问到的功能,但是,这个明显的权限问题很可能不会被模糊测试器标示出来。为什么?因为模糊测试器并不理解程序逻辑,它并不知道普通用户不可以访问管理员区域。那么,是否可以在模糊测试中实现这些逻辑功能,告诉模糊测试器哪些功能是只有管理员能够使用的?这种想法听上去很美好,但实际上,这种方式的实现非常麻烦,并且,采用这种实现导致模糊测试器与应用有非常大的耦合,适用于某个应用的模糊测试器如果不经过彻底修改的话,是完全不可能在另一个应用中重用的。
2.4.2糟糕的设计逻辑
      模糊测试器也不是发现糟糕的逻辑设计的最佳工具。例如,考虑在Veritas Backup Exec中发现的一个安全漏洞。该安全漏洞允许攻击者远程控制Windows服务器并能创建、修改、删除注册表中的键值 。这个漏洞导致攻击者几乎可以完全控制系统。这个问题产生的原因是Windows服务器中一个基于TCP实现远程过程调用(Remote Procedure Call, RPC)的接口,该接口接受修改注册表的指令,并且完全不需要认证。实际上,这不是一个认证问题。因为Windows服务器就是这样设计的。这只能说是一个不合适的设计决定,该决定可能因为设计者认为攻击者更愿意花费时间来破译Microsoft接口描述语言(Interface Description Language, IDL),并据此设计一个工具来与服务器交互,而不是花时间去寻找RPC服务的漏洞。
      虽然模糊测试器可以发现由于被测应用对RPC连接传入数据的糟糕处理,导致的某些形式的较低层次错误,但模糊测试器并不适合用来确定这些错误是否导致真正的不安全。在第18章“自动化浏览器模糊测试”中讨论ActiveX的模糊测试时,我们会再次讨论这个概念,在那一章中,我们会看到许多控件暴露了某些方法,这些方法使得攻击者可以通过它们创建和执行文件。需要对这些设计缺陷给予特殊的考虑。
2.4.3后门
      如果一个模糊测试器对被测应用的结构只有很少的了解,后门看上去与其他的正常逻辑没什么不同。考虑一个应用的登录界面,无论是后门还是正常登录逻辑,都是接受输入并返回认证后的身份信息。不仅如此,除非模糊测试器有足够的信息识别成功的登录,否则,即使这个模糊测试器偶然发现了一个固定的口令,它仍然没有办法识别出这个安全漏洞。在对口令域进行模糊测试时,如果某个输入导致应用发生崩溃,这种漏洞通常可以被发现;但一个通过随机猜测可以被发现的,能进入系统的硬编码的(hard coded)口令就不会被发现。
2.4.4破坏
      内存破坏问题通常会导致被测应用的崩溃。这类问题可以根据与拒绝服务类似的症状来加以识别和发现。然而,有些内存错误问题会被被测应用掩盖,因此简单的模糊测试器永远都发现不了这类问题。考虑以下这个例子,在这个例子中,除非为被测应用附加一个调试器,否则其中的格式字符串漏洞很可能不会被发现。格式字符串安全漏洞通常是由机器代码层的违例代码导致的,例如,在x86 Linux机器上,如果格式字符串带有%n这个典型特征,在执行下面这条指令时通常会发生错误:
mov %ecx, (%eax)
如果使用模糊测试器向一个充满了带%n的格式字符串的进程发送随机数据,eax寄存器在许多情况下将不会包含可写的地址,而是包含有一些从栈中得到的垃圾数据。在这种情况下,该指令会触发一个段违例信号SIGSEGV。如果应用有SIGSEGV的信号处理例程,该处理例程可能会简单地中止进程并重启该进程。但对某些应用来说,它们的SIGSEGV信号处理例程甚至可能在不重启进程的情况下尝试继续执行。对格式字符串安全漏洞来说,这样做是可行的(虽然我们强烈反对这样做),因为在SIGSEGV信号被触发前内存有可能实际上没有真正被破坏。那么,如果我们的模糊测试器没有发现这个问题会怎样?进程不会崩溃,而且信号处理例程屏蔽了这个错误,所以,这不是一个安全性问题,对吗?呃,记住,成功的格式字符串渗透会将特定内容写入内存区域中,并在随后通过访问这些已经被控制的内存区域来窃取进程的控制权。SIGSEGV信号处理例程不能阻止精准的渗透,因为这种渗透根本不会触发任何失效。
      根据对测试目标监视的不同程度,你的模糊测试器可能发现这类问题,也可能发现不了这类问题。
2.4.5多阶段安全漏洞(MuliStage Vulnerability)
      可利用性(Exploitation)不总意味着像攻击单一弱点那么简单。复杂的攻击通常通过连续利用若干个安全漏洞来获得机器的控制权:起先通过漏洞让机器接受未被授权的访问,然后利用其他漏洞缺陷获得更大的权限。模糊测试对识别单独的漏洞很有用,但通常而言,模糊测试对那些小的漏洞链构成的漏洞,或是让人不感兴趣的事件构成的多向量攻击的识别作用不大。
2.5小结
      模糊测试的发展已经有一段时间了,但在安全研究的圈子之外,模糊测试还不是一项广为人知的技术。因此,你可能会发现不同的人对模糊测试有不同的定义。在本章中,我们给出了我们对模糊测试的定义,简要介绍了模糊测试的历史,并描述了我们对模糊测试的期望。接下来,让我们开始探索模糊测试器的类别和它们使用的方法。
——————本文节选自《模糊测试——强制发掘安全漏洞的利器》


页: [1]
查看完整版本: 什么是模糊测试(2)