test fuzz-03-模糊测试 Atheris A Coverage-Guided, Native Python Fuzzer

news2025/1/13 7:35:41

拓展阅读

开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息)

开源 Junit performance rely on junit5 and jdk8+.(java 性能测试框架。性能测试。压测。测试报告生成。)

test fuzz-01-模糊测试(Fuzz Testing)

test fuzz-02-模糊测试 JQF + Zest Semantic Fuzzing for Java

test fuzz-03-模糊测试 Atheris A Coverage-Guided, Native Python Fuzzer

test fuzz-04-模糊测试 jazzer Coverage-guided, in-process fuzzing for the JVM

test fuzz-05-模糊测试 kelinci AFL-based fuzzing for Java

test fuzz-06-模糊测试 AFL american fuzzy lop - a security-oriented fuzzer

test fuzz-07-模糊测试 libfuzzer

Atheris

Atheris: 一个基于覆盖率引导的本地 Python Fuzzer

Atheris是一个基于覆盖率引导的Python模糊引擎。它支持对Python代码的模糊测试,还支持为CPython编写的本地扩展。Atheris基于libFuzzer。在模糊测试本地代码时,可以与Address Sanitizer或Undefined Behavior Sanitizer结合使用,以捕获额外的错误。

安装说明

Atheris支持Linux(32位和64位)和Mac OS X,Python版本3.6-3.10。

你可以使用pip安装预构建版本的Atheris:

pip3 install atheris

这些安装包带有内置的libFuzzer,适用于对Python代码进行模糊测试。如果你计划对本地扩展进行模糊测试,可能需要从源代码构建,以确保Atheris中的libFuzzer版本与你的Clang版本匹配。

从源代码构建

Atheris依赖于libFuzzer,该库随Clang一起分发。如果你的路径上有足够新版本的clang,则从源代码安装就像这样简单:

# 从源代码构建最新版本
pip3 install --no-binary atheris atheris
# 从源代码构建开发代码
git clone https://github.com/google/atheris.git
cd atheris
pip3 install .

如果你没有安装clang或者它太旧,你需要下载并构建LLVM的最新版本。请按照下面的“安装新版本的LLVM”说明进行操作。

Mac

Apple Clang不包含libFuzzer,因此你需要安装来自head的新版本的LLVM。请按照下面的“安装新版本的LLVM”说明进行操作。

安装新版本的LLVM
# 构建LLVM
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
mkdir build
cd build
cmake -DLLVM_ENABLE_PROJECTS='clang;compiler-rt' -G "Unix Makefiles" ../llvm
make -j 10  # 这一步非常慢

# 安装Atheris
CLANG_BIN="$(pwd)/bin/clang" pip3 install <whatever>

使用Atheris

示例

#!/usr/bin/python3

import atheris

with atheris.instrument_imports():
  import some_library
  import sys

def TestOneInput(data):
  some_library.parse(data)

atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()

在对Python进行模糊测试时,如果被测试的Python代码引发未捕获的异常,Atheris将报告失败。

Python覆盖率

Atheris通过对字节码进行插桩来收集Python覆盖率信息。有三种选项可用于将此插桩添加到字节码中:

  • 你可以对导入的库进行插桩:

    with atheris.instrument_imports():
      import foo
      from bar import baz
    

    这将导致在foobar上添加插桩,以及它们导入的任何库。

  • 或者,你可以对单个函数进行插桩:

    @atheris.instrument_func
    def my_function(foo, bar):
      print("instrumented")
    
  • 或者最后,你可以对所有内容进行插桩:

    atheris.instrument_all()
    

    将其放在atheris.Setup()之前。这将找到解释器中当前加载的每个Python函数,并对其进行插桩。
    这可能需要一些时间。

Atheris还可以插桩正则表达式检查,例如re.search。要启用此功能,你需要添加:
atheris.enabled_hooks.add("RegEx")
在脚本调用re.compile之前。在内部,这将导入re模块并对必要的函数进行插桩。这是一个实验性功能。

类似地,Atheris可以插桩str方法;目前仅支持str.startswithstr.endswith。要启用此功能,添加
atheris.enabled_hooks.add("str")。这是一个实验性功能。

为什么会出现“未找到任何有趣的输入”?

你可能会看到这个错误:

ERROR: no interesting inputs were found. Is the code instrumented for coverage? Exiting.

如果TestOneInput的前两个调用未产生任何覆盖事件,你将会看到这个错误。即使你已经对一些Python代码进行了插桩,如果在这两个调用中未到达插桩点(例如,因为你有一个非平凡的TestOneInput),这可能会发生。你可以通过在TestOneInput上添加atheris.instrument_func装饰器,使用atheris.instrument_all(),或将TestOneInput函数移到插桩的模块中来解决这个问题。

可视化Python代码覆盖率

检查哪些行已执行对于理解你的模糊测试的效果是有帮助的。Atheris与coverage.py兼容:你可以像对待任何其他Python程序一样,使用coverage.py模块运行你的模糊测试。以下是一个示例:

python3 -m coverage run your_fuzzer.py -atheris_runs=10000  # 运行次数
python3 -m coverage html
(cd htmlcov && python3 -m http.server 8000)

只有当你的模糊测试正常退出时,才会生成覆盖率报告。有三种情况下会正常退出:

  • 你指定了-atheris_runs=<number>,并且已经运行了这么多次。
  • 你的模糊测试通过Python异常退出。
  • 你的模糊测试通过

sys.exit()退出。

如果你的模糊测试由于本地代码崩溃或libFuzzer的-runs标志而退出,将不会生成覆盖率报告(使用-atheris_runs)。如果你的模糊测试通过其他方法退出,例如SIGINT(Ctrl+C),Atheris将尝试生成报告,但可能无法生成(具体取决于你的代码)。为了获得一致的报告,建议始终使用-atheris_runs=<number>

如果你想在运行时检查你的语料库,可以使用以下命令:

python3 -m coverage run your_fuzzer.py corpus_dir/* -atheris_runs=$(( 1 + $(ls corpus_dir | wc -l) ))

这将导致Atheris在<corpus-dir>中的每个文件上运行,然后退出。注意:Atheris使用空数据集作为第一个输入,即使在<corpus_dir>中没有空文件。重要的是,如果省略了-atheris_runs=$(ls corpus_dir | wc -l),将不会生成覆盖率报告。

使用coverage.py会显著减慢你的模糊测试,因此只在需要可视化覆盖率时使用它。

LLVM libFuzzer 是什么?

LLVM libFuzzer 是 LLVM 编译器基础设施的一部分,是一个用于模糊测试的强大引擎。模糊测试是一种自动化测试技术,它通过向程序输入注入随机或半随机的数据(称为"模糊"输入),然后监控程序的执行,以发现潜在的错误、漏洞和安全问题。

以下是 LLVM libFuzzer 的一些关键特点和工作原理:

特点:

  1. 基于 LLVM: libFuzzer 是 LLVM(Low Level Virtual Machine)的一部分,是 LLVM 的一种插件。因此,它可以与 LLVM 兼容,并直接集成到 LLVM 编译器中。

  2. 快速且高效: libFuzzer 被设计为高效执行大规模模糊测试。它使用一种称为"基于覆盖率的反馈"(coverage-guided feedback)的方法,通过监视程序的代码覆盖率来引导模糊测试的输入生成。这使得 libFuzzer 能够快速探索程序的不同执行路径。

  3. 无需源代码更改: libFuzzer 可以直接用于未修改的二进制程序,而无需对其源代码进行任何更改。这对于测试封闭源代码的程序或对现有代码进行快速测试非常有用。

  4. 支持多种语言: libFuzzer 不仅支持 C/C++,还支持其他编程语言,例如 Rust、Swift 等。这使得它成为一个通用的模糊测试工具。

  5. 内嵌的输入生成器: libFuzzer 包含一个内置的输入生成器,可以自动生成具有高覆盖率的输入。这减轻了用户编写自定义输入生成器的负担。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1372930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​iOS 应用上架指南:资料填写及提交审核

目录 摘要 引言 打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-…

openeuler的安装和两台linux主机配置ssh实现互相免密登陆

一、openeuler的安装 下载OpenEuler - 网址&#xff1a;https://www.openeuler.org/zh/download/archive/ - 版本选择&#xff1a;openEuler 22.03 LTS SP2 &#xff08;镜像文件&#xff09; &#xff0c;即长期更新版 设置自定义硬件 内存&#xff1a;推荐2GB 处理器&…

如何本地搭建DolphinScheduler并无公网ip远程访问管理界面

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

C语言结构体的字节对齐

C语言结构体的字节对齐 什么是字节对齐 首先来看下面的程序&#xff1a; #include <stdio.h>typedef struct n1{int a;char b;char c; } N_stru1;typedef struct n2{char b;int a;char c; } N_stru2;int main() {N_stru1 n1;N_stru2 n2;printf("%d\n", siz…

查看SOLIDWORKS 2024的最佳价格和特惠优惠

尊敬的客户&#xff0c; 在 SOLIDWORKS 2024 引领设计技术的未来之际&#xff0c;我们为您提供了更划算的价格和特惠优惠&#xff0c;助您在设计领域更进一步。本文将为您介绍 SOLIDWORKS 2024 的最佳价格&#xff0c;确保您获得最佳的设计工具和投资回报。 1. SOLIDWORKS202…

鸿蒙 command not found: ohpm

第一步&#xff1a;找到ohpm home copy路径&#xff1a;/Users/admin/newohpm 第二步&#xff1a;打开终端 输入&#xff1a;open ~/.bash_profile 会弹出 第三步&#xff1a;弹框中输入&#xff1a; export OHPM_HOME/Users/admin/newohpm export PATH${PATH}:${OHPM_HOM…

使用rembg库提取图像前景(移除图像背景),并构建web应用

1、图像中的前景与背景 在深度学习图像处理领域中&#xff0c;图像内容可以被定义为前景与背景两部分&#xff0c;其中感兴趣图形的被定义为前景&#xff0c;不感兴趣区域的背景。如在目标检测中&#xff0c;被框出来的目标则被定义为前景。此外&#xff0c;前景识别也可以理解…

element plus el-form双列布局及拓展任意布局

1 场景 一般表单我们直接默认布局&#xff0c;也就是单列布局&#xff0c;突然有个人员信息表单&#xff0c;需要双列布局的需求&#xff0c;简单实现并拓展下 2 思路 直接无脑divflex布局实现 3 代码 <template><el-form ref"formRef" :model"fo…

【Mysql】InnoDB 引擎中的页目录

一、页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表。 那么我使用主键查询的时候&#xff0c;最顺其自然的办法肯定是从第一条记录&#xff0c;也就是 Infrimum 记录开始&#xff0c;一直向后找&#xff0c;只要存在总会找到。这种在数据量少的时候还好说&#x…

Federated Unlearning for On-Device Recommendation

WSDM 2023 CCF-B Federated Unlearning for On-Device Recommendation 本文工作的主要介绍 本文主要介绍了一种名为FRU&#xff08;Federated Recommendation Unlearning&#xff09;的联邦学习框架&#xff0c;用于在设备端的推荐系统中实现用户数据的有效擦除和模型重建。…

Web 缓存代理—— Nginx、CDN

代理的工作机制 代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 代理服务器的概念 代理服务器是一个位于客户端和原始…

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…

徐怀钰巡演将开启,巡回22城上演全民金曲盛宴

1月10日下午&#xff0c;天后徐怀钰空降成都&#xff0c;现身“徐怀钰2024倒数3秒巡回演唱会”新闻发布会&#xff0c;在行业大咖、百余名歌迷的陪伴与在线数万直播观众的见证下&#xff0c;正式揭晓22座巡演城市&#xff0c;宣告巡演璀璨开启。主办方今夕何夕文化表示&#xf…

系列十、Java中的八种基本数据类型

一、Java中的八种基本数据类型 1.1、概览 1.2、备注 byte最大值&#xff1a;127 ,byte最小值&#xff1a;-128 short最大值&#xff1a;32767 ,short最小值&#xff1a;-32768 int最大值&#xff1a;2147483647 ,int最小值&#xff1a;-2147483648 long最大值&#xff1a;9…

云上攻防--云原生Docker逃逸--特权逃逸--危险挂载--漏洞逃逸

云上攻防–云原生&&Docker逃逸–特权逃逸–危险挂载–漏洞逃逸 目录标题 云上攻防--云原生&&Docker逃逸--特权逃逸--危险挂载--漏洞逃逸Docker介绍判断Docker环境容器逃逸-特权模式容器逃逸-危险挂载挂载DockerSocket逃逸挂载宿主机procfs逃逸 容器逃逸-Docker…

【前端素材】bootstrap4实现在线蛋糕甜品店网页Tehzeeb

一、需求分析 在线蛋糕甜品店的网站通常包含以下几个方面的内容和功能&#xff1a; 主页&#xff1a;网站的主页是用户进入网站的第一个页面&#xff0c;通常会展示一些精选蛋糕和甜品的图片和介绍&#xff0c;以吸引用户的注意力。主页还可能包含一些特别促销或最新的产品信息…

Matlab 分段函数(piecewise)

语法 pw piecewise(cond1,val1,cond2,val2,...) pw piecewise(cond1,val1,cond2,val2,...,otherwiseVal)描述 pw piecewise(cond1,val1,cond2,val2,...) 返回分段表达式或函数pw&#xff0c;当cond1为True时&#xff0c;其值为val1&#xff0c;当cond2为True时&#xff0…

超维空间M1无人机使用说明书——61、ROS无人机yolo识别与投放

引言&#xff1a;使用yolo进行物体识别&#xff0c;根据返回的目标位置信息&#xff0c;控制无人机全向移动&#xff0c;当无人机到达目标物的正上方&#xff0c;满足一定的误差阈值后&#xff0c;ROS发布控制控制将舵机挂载的物体抛下&#xff0c;紧接着无人机前往起飞点上方寻…

Java中异常处理-详解

异常&#xff08;Exception&#xff09; JVM 默认处理方案 把异常的名称&#xff0c;异常的原因&#xff0c;及异常出错的位置等信息输出在控制台程序停止执行 异常类型 编译时异常必须显示处理&#xff0c;否则程序会发生错误&#xff0c;无法通过编译运行时异常无需显示处理…

灵活实现主题切换 —— 白天、黑夜等主题

1、上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><style>/* 默认的CSS变量集合 */:root {--pr…