ΘεΑθερηςΠυθωνΦουζζερ

2020-12-05 11:16:28

模糊测试是一种发现编程错误的众所周知的技术。这些可检测的错误中有许多都具有严重的安全隐患。 Google使用此技术发现了数千个安全漏洞和其他错误。传统上,模糊处理是在C或C ++等本地语言上使用的,但是去年,我们构建了一个新的Python模糊处理引擎。今天,我们将Atheris模糊引擎作为开源发布。 Atheris可用于自动查找Python代码和本机扩展中的错误。 Atheris是一个“覆盖率指导”的模糊器,这意味着Atheris将在观察程序执行情况的同时反复尝试对程序的各种输入,并尝试找到有趣的路径。 Atheris的最佳用途之一是用于差分模糊器。这些是模糊测试,旨在寻找旨在执行相同操作的两个库的行为差异。与Atheris打包在一起的示例模糊器之一就是这样做的,目的是将Python的“ idna”软件包与C的“ libidn2”软件包进行比较。这两个软件包都旨在解码和解析国际化域名。但是,示例模糊器idna_uts46_fuzzer.py显示它们并不总是产生相同的结果。如果您决定购买一个包含(Unicode代码点[U + 0130,U + 1df9])的域,则会发现idna和libidn2库将该域解析为两个完全不同的网站。通常,只要您有一种表达“正确”行为的方式-或至少表达某种行为绝对不正确的方法,Atheris就可用于纯Python代码。这可能与评估库输出正确性的模糊器中的自定义代码一样复杂,也可能与检查是否引发意外异常一样简单。后一种情况出奇地有用。虽然意外异常的最坏结果通常是拒绝服务(通过导致程序崩溃),但意外异常往往会揭示库中更严重的错误。例如,我们在Atheris上测试过的一个YAML解析库说它只会引发YAMLErrors。但是,yaml_fuzzer.py检测到许多其他异常,例如ValueError尝试将“ -_”解释为整数,TypeError尝试将列表用作dict中的键。 (错误报告。)这表明解析器中存在缺陷。最后,Atheris使用libFuzzer支持模糊测试本机Python扩展。 libFuzzer是集成到Clang中的模糊处理引擎,通常用于对C或C ++进行模糊处理。当将libFuzzer与Atheris结合使用时,Atheris仍然可以找到先前描述的所有错误,但是也可以找到仅在本机代码中存在的内存损坏错误。 Atheris支持Clang清理器Address Sanitizer和Undefined Behavior清理器。这些使得在发生腐败时更容易发现腐败,而不是在很久以后。在一种情况下,本文的作者使用Atheris模糊器(现已修复)发现了LLVM错误。

Atheris在Python 2.7和Python 3.3+中支持模糊化的Python代码和本机扩展。在对Python代码进行模糊处理时,强烈建议使用Python 3.8+,因为它可以提供更好的覆盖率信息。在对本机扩展进行模糊处理时,可以将Atheris与Address Sanitizer或Undefined Behavior Sanitizer结合使用。 OSS-Fuzz是Google托管的一项模糊服务,我们在其中免费对开放源代码执行模糊器。 OSS-Fuzz即将支持Atheris!

看一下仓库,特别是示例。对于模糊化纯Python来说,这很简单:pip3 install atheris然后,只需定义一个TestOneInput函数来运行要模糊化的代码即可:import atheris import sys def TestOneInput(data):if data == b" bad&# 34 ;:提高RuntimeError(" Badness!")atheris.Setup(sys.argv,TestOneInput)atheris.Fuzz()就是这样! Atheris将反复调用TestOneInput并监视执行流程,直到发生崩溃或异常。有关更多详细信息,包括如何模糊本机代码,请参阅自述文件。