BEGIN_PAYLOAD
20260819
白盒测试、黑盒测试和灰盒测试
在较高的层次上有三种主要的方法用来发现安全漏洞:白盒测试、黑盒测试和灰盒测试。这些方法之间的差别 是由测试者可得到的资源决定的。白盒测试是一个极端,它需要对所有资源进行充分地访问。 这包括访问源代码、设计规约,甚至有可能还要访问程序员本人。黑盒测试是另一个极端,它 几乎不需要知道软件的内部细节,很大程度上带有盲目测试的味道。位于两个极端方法之间的是灰盒测试,它的定义因询问的人不同而不同。
三种方法的本质区别在于测试者可获得的内部资源:
- 白盒(资源最多):全知视角,可访问源代码、设计规约甚至开发人员。
- 黑盒(资源最少):无知视角,仅知输入输出,完全依赖外部观察。
- 灰盒(资源中间):折中视角,在黑盒基础上,通过**逆向工程(RE)**获取内部信息(无源码时则分析汇编,即“二进制审核”)。
| 维度 | 白盒测试 | 黑盒测试 | 灰盒测试 |
|---|---|---|---|
| 核心手段 | 源代码评审(人工+自动化工具) | 人工扫除 + 模糊测试(Fuzzing) | 黑盒测试 + 逆向工程/二进制审核 |
| 最大优势 | 覆盖率完全,可遍历所有代码路径 | 可用性强,无需任何内部权限,简单直接 | 在无源码时仍能深入分析内部逻辑 |
| 最大短板 | 依赖源码可用性,且工具易产生误报 | 覆盖未知,不知道测试何时结束,有效性难衡量 | 分析汇编代价极高,比源码层面更费力 |
什么是模糊测试
定义:通过提供非预期输入并监视异常结果来发现软件故障的方法,通常是自动或半自动的。
模糊测试六阶段:识别目标 → 识别输入 → 生成模糊数据 → 执行模糊数据 → 监视异常 → 确定可利用性。
模糊测试方法和模糊器类型
- 五类方法:预先生成测试用例、随机方法、协议变异人工测试、变异/强制性测试、自动协议生成测试。
- 模糊器类型:
- 本地模糊器(命令行、环境变量、文件格式)
- 远程模糊器(网络协议、Web应用)
- 内存模糊器
- 模糊器框架(SPIKE、Peach等)
数据表示和分析
- 协议定义:通信双方必须遵循的约定,包括定长域、变长域和分隔域。
- 协议分类:简单文本协议(如FTP控制信道)和二进制协议(如AIM的OSCAR协议)。
- 文件格式:开放格式(如ODF)和专有格式(如旧版Microsoft Office)。
- 常见协议元素:名字-值对、块标识符、块长度、校验和
有效模糊测试的需求
- 可重现性:必须能重现测试结果,便于交流和分析。
- 可重用性:模糊器应模块化,便于在不同项目中复用。
- 过程状态与深度:目标程序在不同状态下的逻辑分支需要分别测试。
- 代码覆盖:衡量测试充分性的关键指标。
- 错误检测:从简单日志到调试器监视,再到动态二进制插装。
- 资源约束:预算和时间限制影响模糊器的设计和选择。
通用模糊测试框架
提供API或脚本语言,允许用户描述协议/文件格式,自动生成测试用例
- SPIKE(Dave Aitel 发布):最早的开源框架之一,采用GPL许可。核心是基于块的协议建模(
s_block_start/end),能自动更新长度字段和校验和;内置大量模糊启发式数据(整型边界、长字符串、格式化字符串等);提供通用脚本模糊器(如line_send_tcp.c)和特定协议示例(HTTP、MSRPC、SunRPC)。 - SPIKEfile / notSPIKEfile:基于SPIKE的文件格式模糊器(生成法)和独立变异模糊器,均集成ptrace调试监控,可捕获SIGSEGV等信号并反汇编崩溃点,支持UNIX/Linux平台。
- Peach(Michael Eddington):跨平台(Python编写),支持网络协议、文件格式、ActiveX等多种目标,灵活性强,允许用XML/Python定义状态机模型。
- Sulley:包含数据表示(原语/块)、会话管理、网络监控和**事后验证(崩溃诊断)**模块,目录结构清晰,适合自动化大规模模糊测试。
- antiparser / Dfuz / Autodafe:其他轻量级或特定场景的开源框架,用于快速原型或特定协议测试。
本地化模糊测试工具
- iFUZZ(Adam Greene):模块化C语言工具,支持
argv[0]、argv[1]、单/多选项、getopt解析等多种模糊模式;采用fork+ptrace监控信号,可输出C语言触发代码便于复现。 - Sharefuzz(Dave Aitel):利用库预加载(
LD_PRELOAD)钩住getenv()函数,对所有环境变量返回超长字符串,快速检测缓冲区溢出。 - clfuzz(warlock):命令行参数模糊器,针对格式化字符串和栈溢出。
文件格式模糊测试工具
Windows平台
- FileFuzz:C# GUI + C调试器(
crash.exe)。支持二进制文件(宽度扫描/深度穷举)和ASCII文本(匹配替换)两种变异方式;通过Windows注册表/资源管理器自动获取文件类型关联的启动命令;内嵌调试API,结合libdasm反汇编,捕获内存访问违规、除零、栈溢出等异常。 - PAIMEIfilefuzz(Cody Pierce):基于PaiMei逆向框架的Windows GUI工具,功能类似FileFuzz。
UNIX/Linux平台
- notSPIKEfile(变异) 和 SPIKEfile(生成):前者直接对样本文件逐字节/逐字段变异;后者使用SPIKE脚本描述文件格式结构。两者共享
ptrace监控模块,可输出崩溃时的寄存器、指令和调用栈。
网络协议模糊测试工具
通用协议 / 框架脚本
- SPIKE原生脚本:内置FTP、SMTP、IMAP、CIFS、Oracle、MS SQL等协议的模板脚本,可直接使用
generic_send_tcp等通用模糊器。 - ProtoFuzz(Windows C#开发):采用包变异方法,使用Metro Packet Library捕获/解析/发送原始包(支持以太网、IP、TCP、UDP);用户可用
[XX]标记单字节暴力变异,或用<XX>标记字符串池变异;图形化展示包结构(类似Wireshark)。
Web应用/服务器
- WebFuzz:C# GUI工具,允许用户完全控制原始HTTP请求(方法、URI、头、Cookie、POST数据),用
[SQL]、[XSS]、[Overflow]等标签标记模糊变量;支持异步Socket和超时控制;可捕获响应并关联状态码/错误消息。 - SPIKE Proxy(Dave Aitel):基于Python的浏览器代理型Web模糊器,拦截请求并运行SQL注入/XSS/溢出等预定义审核。
- WebScarab(OWASP):集成Web蜘蛛、代理和基础模糊器的综合套件。
- LiveHTTPHeaders / Tamper Data / Fiddler:辅助插件,用于捕获和修改请求,配合WebFuzz使用。
浏览器 / ActiveX控件
- AxMan(H.D. Moore):ActiveX模糊器,枚举已注册控件的CLSID、接口、方法和参数类型(通过类型库),自动生成变异调用序列。
- COMRaider(David Zimmer):类似AxMan,提供GUI界面,用于发现ActiveX控件中的内存破坏漏洞。
- mangleme(Michal Zalewski):CGI脚本,持续生成畸形的HTML文件供浏览器刷新加载。
- Hamachi / CSSDIE:分别针对DHTML脚本和CSS解析器的专用模糊器。
内存数据模糊测试工具
- PyDbg(PaiMei框架子模块):纯Python Windows 32位调试器,支持在目标进程的特定内存点植入钩子(hook),在数据被解析前直接变异内存缓冲区;可保存进程快照并快速恢复,绕过网络/文件I/O瓶颈,大幅提升测试速度。
EOF
CHECKSUM_OK
// EXTERNAL_CHANNEL
COMMENTS