用libFuzzer对Python模块进行模糊测试。

pyfuzzer的Python项目详细描述


buildstatuscoverage

关于

使用libFuzzer对python3.6+C扩展模块进行模糊测试。在

安装

clang 8或更高版本。在

$ apt install clang
$ pip install pyfuzzer

示例用法

你好世界

在测试 模块hello_world。在

^{pr2}$

打印找到新代码路径的函数调用。这个信息 通常在编写单元测试时很有用。在

$ pyfuzzer print_corpus
corpus/25409981b15b978c9fb5a5a2f4dab0c4b04e295f:
    tell(b'') = 5
corpus/a8a4e6c9abfd3c6cba171579190702ddc1317df0:
    tell(b'\xfd#') = b'Hello!'
corpus/80f87702ef9fbe4baf17095c79ff928b9fa1ea14:
    tell(b'\x00') = True
corpus/be3d1b7df189727b2cecd6526aa8f24abbf6df10:
    tell(b'\x00\xfd\x00') = 0
corpus/defd8787d638f271cd83362eafe7fdeed9fa4a8f:
    tell(None) raises:
    Traceback (most recent call last):
      File "/home/erik/workspace/pyfuzzer/pyfuzzer/mutators/utils.py", line 35, in print_callable
        res = obj(*args)
    TypeError: expected bytes, NoneType found

有关所有文件,请参阅hello_world。在

Hello world致命错误

与上一个示例类似,但在 tell()是用一个超过2个字节的bytes对象作为它的 第一个论点。在

$ cd examples/hello_world_fatal_error
$ pyfuzzer run hello_world.c
...
Fatal Python error: deallocating None

Current thread 0x00007f7ca99c2780 (most recent call first):
...

打印导致崩溃的函数调用。正如所料 第一个参数显然长于2个字节。在

$ pyfuzzer print_crashes
crash-1013ed88cd71fd14407b2bdbc17b95d7bc317c21:
    tell(b'\n\xbf+') = None

有关所有文件,请参阅hello_world_fatal_error。在

自定义mutator

测试模块时使用自定义赋值函数hello_world_mutatorhello_world。在

使用自定义赋值函数进行测试通常比使用 普通的。在

$ cd examples/hello_world_custom_mutator
$ pyfuzzer run -l max_total_time=1 -m hello_world_mutator.py hello_world.c
...

有关所有文件,请参阅hello_world_custom_mutator。在

变异子

mutator模块使用来自libFuzzer的数据来测试模块。A mutator模块必须实现函数setup(module),其中 module是正在测试的模块。它将返回一个mutator 实现方法^{tt8}的实例$ 和test_one_input_print(self, data),其中data是数据 由libFuzzer(作为bytes对象)生成。在

{8$tt8执行实际的模糊测试 test_one_input_print(self, data)打印语料库并崩溃。在

CRC-32算法的最小变异函数模糊测试看起来像 下面。它只调用crc_32(),其中只有data 争论。在

frompyfuzzer.mutators.genericimportprint_callableclassMutator:def__init__(self,module):self._module=moduledeftest_one_input(self,data):returnmodule.crc_32(data)deftest_one_input_print(self,data):print_callable(self._module.crc_32,[data])defsetup(module):returnMutator(module)

想法

  • 通过生成C代码添加对fuzz测试纯Python模块的支持 使用Cython。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java连接usb到uart设备到安卓设备>3.1   可以强制Php中的web应用程序与Java中的桌面应用程序一起工作吗?   java为什么自定义系统类加载器不工作?   数组在Java中解析具有多个分隔符的字符串   PMD Java 8德米特定律   JavaSpringMVC表单验证不适用于嵌套的复杂类型   让Eclipse Java组织导入以使用Google checkstyle   java Appium:无法创建新会话   java如何在数组中声明新字段   java如何解决“无法初始化类org.apache.cassandra.config.DatabaseDescriptor”?   java AsyncTask创建socket   java向@CreatedBy添加更多信息   如何在ubuntu中运行包含大量jars依赖项的java文件   java如何使用<s:select>标记并在中休眠来填充下拉列表?   java获取错误:找不到符号变量“level”和“next_level_button”   javaweb应用中基于UI的ajax显示代码流   Java长到MySql   java JvisualVM:奇怪的应用程序行为   ubuntu将Java程序的输出结果保存到一个文件中