Google最近宣布开放用于Python的新模糊测试引擎。新的模糊器Atheris致力于查找Python代码中的错误以及Python 2.7和Python 3.3+中的本机扩展。Atheris可以与Address Sanitizer和Undefined Behavior Sanitizer工具结合使用,后者可以检测内存损坏错误和不确定行为(例如,缓冲区溢出,未对齐或空指针)。
Google解释了Atheris希望为模糊测试引擎的当前空间增加价值:
模糊测试是一种发现编程错误的众所周知的技术。这些可检测的错误中有许多具有严重的安全隐患。Google使用此技术发现了数千个安全漏洞和其他错误。传统上,模糊处理是在C或C ++等本地语言上使用的,但是去年,我们构建了一个新的Python模糊处理引擎。
Atheris可以在Python代码(Python 2.7和Python 3.3+,强烈建议使用Python 3.8+,以更好地覆盖代码)上使用,也可以在为CPython编写的本机扩展中使用。在对本机代码进行模糊处理时,可以将Atheris与Clang的Address Sanitizer或Undefined Behavior Sanitizer结合使用,以捕获其他错误。
Python代码模糊化的示例如下:
import atheris
import sys
def TestOneInput(data):
if data == b"bad":
raise RuntimeError("Badness!")
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()
在TestOneInput
被测试的功能。Atheris将使用自动生成的输入反复调用被测函数,直到发生崩溃或异常。
该函数允许一个输入(data
),它是一个字节容器。树蝰属提供了FuzzedDataProvider
该支撑件具有附加输入的形状模糊化(例如,字符串,列表,整数,浮点数,间隔)。Atheris可以与基于属性的测试工具Hypothesis结合使用,以编写模糊线束,并将引起故障的输入缩小到较小的可再现故障案例。假设还提供了高级输入生成策略(例如,电子邮件,字典,日期,正则表达式),可以补充Atheris的模糊数据提供程序。
Atheris是一个覆盖率指导(灰色框)的模糊测试引擎。Atheris利用ClanglibFuzzer
来测试被测代码并收集覆盖率信息。然后,Atheris动态尝试生成输入,以增加先前输入序列生成的代码覆盖率。
虽然Atheris负责测试用例的生成和测试执行,但程序员有责任识别被测函数的错误行为。这可以通过使用交叉引用预言(差异模糊)来实现。在这种方法中,与更通用的变质测试方法一样,在相同的输入上运行具有相同规范的两个实现,并选择不同的结果进行分析。
如果没有测试oracle或变态属性,程序员仍然可以使用绒毛来检测故障。当被测函数引发意外异常或故障检测机制失败时,就是这种情况。
Google提供了以下示例,说明检查意外异常的有用性:
例如,我们在Atheris上测试过的一个YAML解析库说它只会引发YAMLErrors。但是,yaml_fuzzer.py检测到许多其他异常,例如ValueError尝试将“ -_”解释为整数,TypeError尝试将列表用作dict中的键。(错误报告。)这表明解析器中存在缺陷。
差异模糊测试和模糊测试是功能强大的自动化测试技术,已发现现有软件中的许多错误-C编译器,Java反编译器,防病毒软件等。尼克·菲茨杰拉德(Nick Fitzgerald)最近在InfoQ的一次访谈中解释了生成测试如何允许发现其他方法不易发现的错误:
基本单元测试会遗漏很多东西,在这里我们写出一些固定的输入并断言我们的程序会产生预期的输出。我们忽略了一些代码路径,或者我们无法执行某些程序状态。[…]
测试伪随机输入可通过为系统提供“意外”输入来帮助我们避免自己的偏见。它有助于我们发现整数溢出错误或病理输入,这些错误或病理输入使(不受信任且可能具有敌意的)用户触发内存不足的错误或超时,这些漏洞或超时可能被用作拒绝服务攻击的一部分。
菲茨杰拉德(Fitzgerald)报告说在wasmparser箱子的验证器中发现了错误。谷歌最近报告说,参加谷歌OSS实习计划的50名实习生报告了150多个安全漏洞和750个功能错误。
Atheris是Apache 2.0许可下的一个开源项目。Atheris支持Linux(32位和64位)和Mac OSX。欢迎提供帮助,并且必须遵循相应的准则。
原创文章,作者:校长,如若转载,请注明出处:https://www.yundongfang.com/Yun28753.html