- 黑盒:黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。
- 灰盒:灰盒测试,是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。
- 白盒:白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。
- false postive:误报率,在软件测试里指这个程序或这行代码没有错,但是被检测软件识别成bug,这种把好的说成坏的指误报率。统计学里也经常称之为type 1 error。
- false negative:漏报率,在软件测试里,这行代码有问题,但是检测程序并没有发现或者认为其没有问题,实际上这行代码确实有问题,而被测试误判的情况称之为漏报率。统计学里也经常称之为type 2 error。
- 符号执行(symbolic execution):这是一篇便于理解的符号执行文章,符号执行的关键是将输入转化为符号。现在作为模糊测试中的一种辅助手段,它生成符号带入程序中,根据程序的判断语句进行true or false的判断从而生成多种路径,当他认为路径走完后,通过一种叫做约束解算器(constraint solver)来计算可能的输入。在模糊测试中用到的很多,但是面对分支较大判断语句较多的程序稍微有点力不从心。一个相关的知乎专栏:https://zhuanlan.zhihu.com/p/26927127。
- 静态分析和动态分析的相关介绍:
- fuzzer:一个模糊器主要由这三个部分poet、courier、oracle组成。
其中poet:主要负责生产测试用例,即要输入程序的input语段。
courier(使者):主要将测试用例发送给目标,也称为注入者。
oracle(神谕):来确定目标是否失败或者说探寻目标的结果。
fuzzer也并不是全能的,在实际的生产生活中,需要以下几种机制进行配合使用。
- 内存模糊测试(in-memory fuzzing):例如,复杂(例如,GUI)应用程序在接受输入之前通常需要几秒钟的处理。模糊这些程序的一种方法是在初始化GUI之后拍摄PUT的快照。为了模糊新的测试用例,可以在将新测试用例直接写入内存并执行之前恢复内存快照。同样的直觉适用于涉及客户端和服务器之间的大量交互的模糊网络应用程序。这种技术称为内存模糊[97]。
- seed怎么选:简言之,要找到覆盖最广的最小种子集,例如,假设当前配置集C由两个seeds s1和s2组成,它们覆盖PUT的以下地址:{s1→{10,20},s2→{20,30}}。如果我们有第三个种子s3→{10,20,30}的执行速度与s1和s2一样快,那么人们可能会认为fuzz s3而不是s1和s2是有意义的,因为它直观地测试了更多程序逻辑以一半的执行时间成本。这种直觉得到了Miller的报告[140]的支持,该报告显示,代码覆盖率增加1%会使发现的错误百分比增加0.92%。如§7.2所述,此步骤也可以是ConfUpdate的一部分。
- fuzzing的覆盖度:AFL的minset基于分支覆盖,每个分支上都有一个对数计数器。该决定背后的基本原理是,只有当分支计数在数量级上不同时才允许它们被认为是不同的。 Honggfuzz [188]根据执行指令数,执行分支数和唯一基本块计算覆盖率。此度量标准允许模糊器向minset添加更长的执行时间,这有助于发现拒绝服务漏洞或性能问题。
- 输入生成:有的可以通过模型生成,有的可以通过变异生成,变异的方式主要有:比特翻转。