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

拓展阅读

开源 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

jazzer

Jazzer是由Code Intelligence开发的一款基于覆盖率引导的JVM平台内部模糊测试工具。

它基于libFuzzer,并将许多基于仪器的变异特性引入了JVM。

Jazzer目前支持以下平台:

  • Linux x86_64
  • macOS 12+ x86_64和arm64
  • Windows x86_64

快速入门

您可以使用Docker尝试Jazzer的Autofuzz模式,在此模式下,它会自动生成要传递给给定Java函数的参数,并报告意外的异常和检测到的安全问题:

bash 复制代码
docker run -it cifuzz/jazzer-autofuzz \
   com.mikesamuel:json-sanitizer:1.2.0 \
   com.google.json.JsonSanitizer::sanitize \
   --autofuzz_ignore=java.lang.ArrayIndexOutOfBoundsException

这里,前两个参数是Java库的Maven坐标和要进行模糊测试的Java函数的完全限定名称,采用"方法引用"形式。

可选的--autofuzz_ignore标志接受一个要忽略的未捕获异常类的列表。

几秒钟后,Jazzer应该会触发一个AssertionError,复现它在此库中发现的一个已修复的错误。

使用

使用 Jazzer 通过 JUnit 5 进行...

假设您的项目已经设置了 JUnit 5.9.0 或更高版本,例如基于官方的 junit5-samples。

  1. 添加依赖项 com.code-intelligence:jazzer-junit:<latest version>。所有 Jazzer Maven 构件都使用此密钥进行签名。
  2. 在新的或现有测试类中添加一个新的模糊测试:一个使用 @FuzzTest 注释的方法,并至少一个参数。建议使用类型为 FuzzedDataProvider 的单个参数,该参数提供用于生成常用 Java 值的实用函数,或使用 byte[] 以获得最佳性能和发现的可重现性。
  3. 假设您的测试类名为 com.example.MyFuzzTests,请创建 inputs 目录 src/test/resources/com/example/MyFuzzTestsInputs。
  4. 运行一个模糊测试,将环境变量 JAZZER_FUZZ 设置为 1,以便模糊测试器快速尝试新的参数集。如果模糊测试器找到使您的模糊测试失败甚至触发安全问题的参数,它将将它们存储在 inputs 目录中。在此模式下,每次测试运行仅执行单个模糊测试(有关详细信息,请参见#599)。
  5. 在不设置 JAZZER_FUZZ 的情况下运行模糊测试,以仅对 inputs 目录中的输入执行测试。此模式的行为类似于传统的单元测试,确保模糊测试器先前发现的问题已被修复,并且还可以用于在单个输入上调试模糊测试。

一个简单的基于属性的模糊测试可能如下所示(不包括导入):

java 复制代码
class ParserTests {
   @Test
   void unitTest() {
      assertEquals("foobar", SomeScheme.decode(SomeScheme.encode("foobar")));
   }

   @FuzzTest
   void fuzzTest(FuzzedDataProvider data) {
      String input = data.consumeRemainingAsString();
      assertEquals(input, SomeScheme.decode(SomeScheme.encode(input)));
   }
}

可以在 examples/junit 中找到一个完整的 Maven 示例项目。

相关推荐
Monly214 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu5 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20215 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh7 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha19 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc21 分钟前
C++ 日志输出
开发语言·c++·算法
qq_4335545430 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
数据小爬虫@1 小时前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy1 小时前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin