CodeIntelligenceTesting/jazzer
GitHub: CodeIntelligenceTesting/jazzer
Jazzer 是一个面向 JVM 平台的覆盖引导式模糊测试工具,可自动发现 Java 代码中的漏洞和缺陷。
Stars: 1217 | Forks: 166
Jazzer 是一个覆盖引导的 JVM 平台进程内模糊测试工具,由 [Code Intelligence](https://code-intelligence.com) 开发。
它基于 [libFuzzer](https://llvm.org/docs/LibFuzzer.html),并将其许多基于插桩的变异功能带到了 JVM 平台。
Jazzer 目前支持以下平台:
* Linux x86_64 & arm64 (aarch64)
* macOS 12+ x86_64 & arm64
* Windows x86_64
## 安装说明
Jazzer 可以与 JUnit(5.9.0 或更高版本)无缝集成,让您可以与常规单元测试一起编写模糊测试。
推荐的入门方式是将 `jazzer-junit` 依赖项添加到您的项目中。
此包可在 [Maven Central](https://central.sonatype.com/artifact/com.code-intelligence/jazzer-junit) 获取,并使用[此密钥](deploy/maven.pub)签名。
您可以将 Jazzer 与流行的构建工具一起使用:
### Maven
将以下内容添加到您的 `pom.xml`:
```
com.code-intelligence
jazzer-junit
LATEST VERSION
```
使用 Maven 的完整示例项目可在 [`examples/junit`](examples/junit) 中找到。
### Gradle
在您的 `build.gradle` 中包含 Jazzer:
```
implementation group: 'com.code-intelligence', name: 'jazzer-junit', version: ''
```
### Bazel
#### 使用 rules_fuzzing
Jazzer 通过 [rules_fuzzing](https://github.com/bazelbuild/rules_fuzzing)(官方 Bazel 模糊测试规则)得到支持。
有关设置说明,请参阅[自述文件](https://github.com/bazelbuild/rules_fuzzing#java-fuzzing)。
#### 使用 JUnit5 集成
也可以直接在 Bazel 中使用 Jazzer+JUnit5 集成。
可以在[这里](https://github.com/CodeIntelligenceTesting/example-bazel-junit)找到示例项目。
[BUILD](https://github.com/CodeIntelligenceTesting/example-bazel-junit/blob/main/BUILD) 文件展示了如何为模糊测试和回归测试设置语料库目录,以及如何向 Jazzer 和 libFuzzer 传递参数。
## 编写模糊测试
要编写模糊测试,请在您的测试类中添加一个方法,并使用 [`@FuzzTest`](https://codeintelligencetesting.github.io/jazzer-docs/jazzer-junit/com/code_intelligence/jazzer/junit/FuzzTest.html) 为其添加注解。
Jazzer 将自动为您的 方法参数生成和变异输入。
您可以使用原始类型、字符串、数组和许多标准库类。
有关详细信息,请参阅[变异框架文档](docs/mutation-framework.md#supported-types)。
要以[模糊测试模式](#fuzzing-mode)运行模糊测试,请将环境变量 `JAZZER_FUZZ` 设置为真值:
```
JAZZER_FUZZ=1 mvn test org.example.ParserTests
```
以下是一个演示模糊测试安全相关逻辑的示例:
```
package org.example;
import com.code_intelligence.jazzer.junit.FuzzTest;
import com.code_intelligence.jazzer.mutation.annotation.NotNull;
import com.code_intelligence.jazzer.mutation.annotation.InRange;
import com.code_intelligence.jazzer.mutation.annotation.WithUtf8Length;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ParserTests {
@Test
void unitTest() {
assertEquals("foobar", SomeScheme.decode(SomeScheme.encode("foobar")));
}
@FuzzTest
void fuzzTest_decode(@NotNull String input) {
assertEquals(input, SomeScheme.decode(SomeScheme.encode(input)));
}
@FuzzTest
void fuzzTest_decodeWithN(@NotNull @WithUtf8Length(min=10, max=200) String input, @InRange(min=-10, max=10) int n) {
assertEquals(input, SomeScheme.decode(SomeScheme.encode(input)));
assertTrue(n >= -10 && n <= 10);
}
}
```
可以在 [examples/junit](;; com.code_intelligence.jazzer.Jazzer --target_class= [args...]
```
您可以选择使用双破折号命令行参数添加其他 Jazzer 参数。
由于 Jazzer 基于 libFuzzer,所有可用的 libFuzzer 参数都可以使用单破折号命令行参数添加。
请参阅 [libFuzzer](https://llvm.org/docs/LibFuzzer.html) 获取文档。
#### 使用 `jazzer` 二进制文件
Jazzer 可作为独立二进制文件从 GitHub 发布存档中获取,它会启动一个为模糊测试配置的自己的 JVM:
1. 从 [GitHub 发布页面](https://github.com/CodeIntelligenceTesting/jazzer/releases) 下载并解压最新版本。
2. 在您的项目中添加一个新类,该类具有 `public static void fuzzerTestOneInput(String par1, int par2, int[] par3, ...)` 方法,包含您要在模糊测试中使用的参数。
3. 将 `jazzer_standalone.jar` 放在类路径上编译您的模糊测试。
4. 运行 `jazzer` 二进制文件(在 Windows 上为 `jazzer.exe`),指定类路径和模糊测试类:
```
./jazzer --cp= --target_class=
```
如果您看到错误提示找不到 `libjvm.so`,请确保 `JAVA_HOME` 指向 JDK。
## 目录和文件
Jazzer 使用两个主要目录来存储输入:*生成的语料库目录*和*输入目录*。
### 生成的语料库目录
*生成的语料库目录*是 Jazzer 保存模糊测试期间产生新覆盖率的输入的位置。
它位于 `.cifuzz-corpus/./`,其中 ``、`` 和 `` 分别对应模糊测试的包名、类名和方法名。
例如,如果模糊测试在类 `src/test/java/com/example/ValidFuzzTests.java` 的方法 `byteFuzz` 中,则语料库目录位于 `.cifuzz-corpus/com.example.ValidFuzzTests/byteFuzz`。
### 输入目录
模糊测试期间触发崩溃的任何输入都会保存到*输入目录*中。
该目录派生自模糊测试的包名和类名。
例如,如果模糊测试在类 `src/test/java/com/example/ValidFuzzTests.java` 的方法 `byteFuzz` 中,则*输入目录*位于 `src/test/resources/com/example/ValidFuzzTestsInputs/byteFuzz`。
如果此目录不存在,Jazzer 会将崩溃输入保存到执行测试的目录中。
## 通过 JUnit 参数源进行种子输入
您可以使用标准 JUnit 参数源(如 `@MethodSource`、`@CsvSource`、`@ValueSource` 或自定义 `@ArgumentsSource`)为 `@FuzzTest` 提供初始种子输入。
在[回归模式](
标签:CISA项目, DevSecOps, fuzzing, GHAS, instrumentation, Java安全, JS文件枚举, JUnit, JVM, libFuzzer, pocsuite3, SOC工具, XXE攻击, 上游代理, 代码覆盖率, 后台面板检测, 域名枚举, 字节码插桩, 安全测试, 持续安全, 攻击性安全, 漏洞发现, 覆盖率引导, 软件测试