《模糊测试--强制发掘安全漏洞的利器》阅读笔记(一)

《模糊测试--强制发掘安全漏洞的利器》阅读笔记(一)

第一部分

本部分的主要目标是介绍开发“全功能”对模糊测试器所需要的基本思想。本部分的这些概念能让人更好的使用模糊测试技术。

重要知识点

  • 白盒测试不见得比黑盒测试效率更高,因为编译器在将源代码编译成汇编代码时引入了巨大改变:例如微软源代码泄漏事件
  • 黑盒测试适用于安全漏洞由单组输入引发的情况。需要多组输入时,基本只能通过手工的代码审评或是逆向代码工程(RCE)来发现
  • 在学术界,与模糊测试最接近的术语是边界值分析(Boundary value analysis,BVA)
  • 本书中,对模糊测试的定义:

    “通过向应用提供非预期的输入并监控输出中的异常来发现软件中的faults的方法。”

  • 确定输入向量:原则是从客户端目标应用发送的任何东西,包括头,文件名,环境变量,注册表键,以及其他信息,都应该被看作输入向量
  • Web浏览器模糊测试器通常利用HTML的功能来自动化模糊测试过程,如检查CSS,COM,ActiveX
  • 协议是达成通信的必要条件。
  • 协议设计的三种典型法方法:定长字段,变长字段和分割字段
  • 需要能够系统地回放整个测试过程,才能做进一步的分析和发现奔溃的具体原因

普通知识点

白盒测试

  • 源代码分析工具分三类:
    • 编译时检查工具:VC++的/analyze选项
    • 源代码浏览工具
    • 自动源代码审计工具

黑盒测试

  • 手工测试:扫除(Sweeping)

灰盒测试

  • 二进制审计:在汇编级别的审计,使用的工具包括:
    • 反汇编器:IDA
    • 反编译器:Boomerang,IDA的F5插件
    • 调试器:WinDbg,OllyDbg,GDB
  • 自动化的二进制审计
工具名称 提供商 授权 注释
LogiScan LogicLibrary 商业 集成到Logidex DSA
BugScan Halvar Flake 自由 IDC脚本,枚举所有函数调用,发现不安全的库函数
Inspector HB Gary 商业 整合如IDA和OllyDbg等的输出
SecurityReview Veracode 商业 不关心
BinAudit SABRE Security 商业 IDA插件,发现数组越界访问,重复内存释放等

模糊测试器

  • 基于变异的模糊测试器
  • 基于生成的模糊测试器

模糊测试阶段

  • 确定测试目标
  • 确定输入向量:是否能找到所有的输入向量是模糊测试能否成功的关键。
  • 生成模糊测试数据
  • 执行模糊测试数据
  • 监视异常:一定要对异常和错误有监视,否则不知道是什么数据触发faults,则这次模糊测试就没有意义
  • 判定发现的漏洞是否可能被利用:这种过程是典型的手工过程,需要操作者具有特定的安全知识。

模糊测试的局限性

  • 访问控制漏洞:模糊测试无法识别应用程序本身的权限问题
  • 糟糕的设计逻辑:模糊测试无法识别发现的问题是否是由于安全问题造成的
  • 后门:模糊测试无法识别是否是后门功能
  • 破坏:SIGSEGV信号会导致模糊测试无法识别是否出发内存破坏
  • 多阶段安全漏洞:模糊测试对识别单个漏洞很有用,但对小的漏洞链构成的漏洞则作用不大

模糊测试方法分类

  • 预生成测试用例:
    需要理解对象规约支持的数据结构和可接受的范围,然后对应生成测试边界条件或事违反规约的测试用例。(生成测试用例很费神,但可复用。用完用例,则测试结束)
  • 随机生成输入:
    效率最低,但可快速识别目标是否有非常糟糕的代码。例如:

    while[1]; do cat /dev/urandom | nc -vv target port; done

    该命令从Linux urandom设备读取一个随机数,然后将该随机数发送给指定的目标地址和端口

    使用这种方法,需要分析栈,在调用栈又可能被破坏的情况下,分析调用过程尤其痛苦。

  • 手工协议变异测试:
    比随机生成更加初级。优点是可充分发挥自己过去的经验和“直觉”。常用于Web应用安全测试。
  • 变异或强制性测试:

    模糊器从一个有效的协议样本或是数据格式样本开始,持续不断的打乱书包或是文件中的每一个字节,字,双字,或是字符串。

    虽然该方法浪费了CPU资源,但是不需要对应用进行研究,并且整个模糊测试过程可以完全自动化。
  • 自动协议生成测试:

    需要先对应用进行研究,理解和解释协议规约或文件定义。但是,这种方法并不基于协议规约或文件定义创建硬编码的测试用例,而是创建一个描述协议规约如何工作的文法。

    例如SPIKE和SPIKEfile工具都是这类测试的典型例子,采用SPIKE脚本描述协议或是文件格式,并使用一个模糊测试引擎来创建输入数据。

模糊测试器类型

  • 本地模糊器
    • 命令行模糊测试器:从命令行中传入参数,例如使用clfuzz工具,iFUZZ工具
    • 环境变量模糊测试器:从环境变量中传入参数,例如使用Sharefuzz工具,iFUZZ工具
    • 文件格式模糊测试器:文件格式模糊测试器动态创建半形式化文件,然后使用目标处理这些文件,例如使用FileFuzz工具,notSPIKEfile和SPIKEfile工具,PAIMEIfilefuzz工具
  • 远程模糊测试器
    • 网络协议模糊测试器
      • 简单协议:仅有简单认证或是没有认证,并且基于ASCII字符而不是二进制数据,不包含长度或是校验域,如FTP
      • 复杂协议:认证可能需要通过加密或是某种形式的混淆来实现,并且通常由二进制数据和部分可读的ASCII字符串构成。例如MSRPC(微软原创过程调用)
    • Web应用模糊测试器:主要寻找SQL注入,跨站脚本攻击(XSS)。例如使用WebScarab工具,SPI Fuzzer工具,Codenomicon HTTP测试工具
    • Web浏览器模糊测试器:只是文件格式模糊测试器中特殊的一类。例如使用mangleme工具,DOM-Hanoi工具,Hamachi工具,CSSDIE工具,COM Raider工具
  • 内存模糊测试器:一种实现方法是对进程执行一次快照,在生成快照后迅速向该进程的输入处理子例程中注入故障数据。(优缺点见书P37)
  • 模糊测试框架:通常包括一个库用来生成模糊测试字符串,一套简化的网络和磁盘输入输出子例程,一些类似脚本的语言。(优缺点见书P38)

协议

  • 协议是一些规范,协议形成了数据传输和处理的基础结构,协议中的各部分称为字段。
  • 协议的主要总用就是定义“协议中各部分数据如何被解释”。
  • 简单文本协议:用于通信的数据值都在可打印字符范围内。如FTP
  • 二进制协议:需要理解协议的结构。例如AIM的认证和登陆过程。

    wotsit.org收录了上百种专有和公开协议的文档描述。

  • 网络协议:分专有和公开协议。例如FTP,AIM,routing,e-mail,streaming media
    • 专有:公司中的封闭小组开发和维护
    • 公开:生成RFC文档
  • 文件格式:用来描述文件的数据结构。例如office文档
  • 常用协议元素:
    • 名字-值对:一般规则是,通过对名字-值对中的“值”的部分进行模糊测试,通常可以发现潜在的安全漏洞。
    • 块识别符:用来标识二进制数据块的数据类型。
    • 块大小:一种模糊测试的方法是修改表示块大小的值,使其比实际数据块的数据大小稍大或稍小一些,然后观察结果输出。缓冲区溢出和缓冲区下溢就是通过这种方式发现的。
    • 校验和:模糊测试器需要重新计算校验和并写入文件,保证被测应用能够正常处理用于模糊测试的文件。例如PNG图像格式就使用了校验和。

有效模糊测试的需求

对测试的可重现性和可复用性的计划应该在开发模糊测试器之前就进行考虑。

  • 可重现性与文档:能够重现耽搁测试和一组测试的测试结果,是基本需求。
  • 可重用性:需要事先考虑到“可重用的部分”,然后再做对应开发。
  • 过程状态和过程深度:当前状态相对于初始状态的距离称为过程深度。例如SSH,客户端首先处于初始状态,认证过程中服务器处于认证状态,认证成功之后即处于已认证状态。
  • 跟踪、代码覆盖和度量:代码覆盖是指模糊测试器能够让被测应用达到和执行的过程状态的数量。
  • 错误检测:产生和传输可能引发异常的数据占模糊测试的一半,另一半是精确的识别出一个已经出现的错误。例如1.在两次请求之间插入"ping"或者做“存活检查”来做区分。2.利用日志输出做检查,如windows事件浏览器
  • 资源约束:预算和时间期限等,都会给模糊测试带来限制。在设计方案时,要考虑这些问题。

你可能感兴趣的:(《模糊测试--强制发掘安全漏洞的利器》阅读笔记(一))