最近重新在看一个很老的技术,模糊测试fuzz
一、基本背景
在探讨fuzz前,我们来回顾下软件测试的定义,软件测试的经典定义是:
在规定的条件下对思进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
其中软件测试按照技术可分为3类:
黑盒测试:
黑盒测试,顾名思义即为将软件测试环境模拟为不可见的“黑盒”。通过数据输入观察数据输出,检查软件内部功能是否正常。测试展开时,数据输入软件中,等待数据输出。数据输出时若与预计数据一致,则证明该软件通过测试,若数据与预计数据有出入,即便出入较小亦证明软件程序内部出现问题,需尽快解决。
白盒测试:
白盒测试相对于黑盒测试而言具有一定透明性,原理为根据软件内部应用、源代码等对产品内部工作过程进行调试。测试过程中常将其与软件内部结构协同展开分析,最大优点即为其能够有效解决软件内部应用程序出现的问题,测试过程中常将其与黑盒测试方式结合,当测试软件功能较多时,白盒测试法亦可对此类情况展开有效调试。
灰盒测试:
是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。灰盒测试不像白盒那样详细、完整,但又比黑盒测试更关注程序的内部逻辑,常常是通过一些表征性的现象、事件、标志来判断内部的运行状态。
在工作场景中(包括操作系统、工控、闭源商业软件、开源互联网软件等场景):
1)攻击方能得到源码的场景占比较少,大部分场景下以开展黑盒测试为主。
2)防守方则在拥有源码、测试环境的情况下,开展白盒和灰盒测试。
二、Web安全测试
中国随着互联网行业快速发展,web安全也伴生的开始逐步火热起来。
白盒:fortify、checkmarx的代码安全测试、部分0day则通过深度人工代码审计
黑盒:bp、xray为主以针对http协议的渗透测试
灰盒:利用插桩分析程序上下文
我们剖析一下背后的发展逻辑:
1)最早的web漏扫以爬虫为核心竞争力,因为有强大的web爬虫就代表着强大的逻辑覆盖率,谁能爬行更多的页面,谁就能发现更多的漏洞。
2)之后bp等手工工具开始火热,因为bp手工能开展一些漏扫不能覆盖的逻辑漏洞,虽然漏扫在之后也新增了相关越权漏洞的能力,但是在复杂金融支付、密码找回、身份变更等强逻辑流程中,漏扫只能败于bp等手工渗透工具。
3)而web漏扫为了解决爬虫覆盖率的问题,被动漏扫开始替代主动扫描逐步占据了市场,测试人员通过手工录入、镜像流程手段将正常请求进行变形,包括:payload插入、替换,随机特殊字符植入等,以开展安全测试。
被动漏扫是针对协议级的测试行为,通过http协议的传输标准对入参变形填补payload,其中各类paylaod都是人工测试总结出来的数据集,该技术目前已经相当成熟。插桩灰盒iast产品则在输入路径、逻辑上下文、覆盖率上产生了优势。
产品对比:
1)白盒测试中代码安全扫描覆盖率最佳,但是准确率不如动态测试精确、上下文信息详细。白盒测试中人工代码审计在挖掘深度逻辑漏洞方面明显由于代码安全扫描。
2)黑盒测试通用于攻击方和防守方,可以针对协议使用成熟的payload进行数据流安全测试,但是逻辑流安全测试的覆盖率会随系统设计上下浮动,逻辑漏洞主要通过人工渗透进行深度挖掘。
3)灰盒测试通过插桩技术确保数据输入点覆盖率和逻辑分支的覆盖率,该技术主要针对数据流安全测试不适用于逻辑流。
三、模糊测试
模糊测试是一种自动化、动态的软件测试技术,最初是由威斯康辛大学的巴顿·米勒于1989年开发的,通常用于识别程序中的潜在漏洞。模糊测试的核心是自动或半自动的生成随机数据输入到应用程序中,同时监控程序的异常情况,如崩溃、代码断言失败等以此发现可能的程序错误或漏洞,如内存泄漏、缓冲区溢出等。模糊化是指自动生成和执行测试,模糊测试中输入的随机数据被称为“Fuzz”,随机数据的类型包括:超长字符串;随机数如负数,浮点数,超大数、特殊字符如~!@#$%等包含特殊含义的字符(web的CTF题基本以探测能用的特殊字符作为解题第一步),作为输入可能会引发报错。
其实模糊测试与web安全中的黑盒动态漏扫和灰盒插桩其实没有本质区别:
1)通过探针尽可能的搜集程序信息提供给测试人员,增加测试人员对程序异常的分析准确度和分析效率
2)极力输入变形数据保证测试的覆盖率(这个覆盖率是广义多维度的,包括代码覆盖率、边界覆盖率、数据覆盖率)
我认为模糊测试的两大特性让软件的质量得到了保证,尤其是通过大量变异输入,监控对应输出和程序上下文帮助测试人员挖掘程序异常。
本节总结:
尽可能的让程序执行各种可能性,通过详细的信息让开发人员高质量、高效率修复问题。
四、模糊测试的未来
我认为go语言和rust原生内置fuzz的行为非常符合未来软件的发展方向:
go fuzz 参考链接:https://mp.weixin.qq.com/s/-CRxppLwQbNcLmdNml3TqA
rust fuzz 参考链接:https://mp.weixin.qq.com/s/40pCP1A5LmOQyo8t5oei5g
目前开发安全工作中主要追求“左移”思想(其实就是安全生产中“成本法则”的新造词),将软件问题在研发过程中消灭。那么在开发过程中尽可能的将各种可能性都尝试一次,将会大大减少软测人员在数据流和部分逻辑流方面的投入。
尤其是go语言和rust本身是内存安全语言,该类语言开发的软件天生规避了部分内存安全问题,对成本方面也进一步得到了提高。
我认为未来的fuzz会深度结合单元测试,通过代码覆盖率、共享fuzz的测试代码减少软件问题、减少软测人力成本、增加开发速度。
谢谢
标签:灰盒,黑盒,白盒,覆盖率,模糊,测试,软件 From: https://www.cnblogs.com/k4n5ha0/p/17055256.html