You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
> **Jazzer** is back under the **Apache 2.0 license**!
27
-
>
28
-
> We previously paused open-source maintenance but the incredible feedback, support, and ideas from
29
-
> the community motivated us to find a way to bring Jazzer back to the
30
-
> open-source world.
31
-
>
32
-
> Thanks to your enthusiasm and contributions, and a special callout to the
33
-
> [OSS-Fuzz](https://github.com/google/oss-fuzz) team 🚀.
34
-
>
35
-
> Visit [code-intelligence.com](https://code-intelligence.com) for more
36
-
> information.
37
-
>
38
-
> The Code Intelligence team
39
-
40
25
Jazzer is a coverage-guided, in-process fuzzer for the JVM platform developed by [Code Intelligence](https://code-intelligence.com).
41
26
It is based on [libFuzzer](https://llvm.org/docs/LibFuzzer.html) and brings many of its instrumentation-powered mutation features to the JVM.
42
27
@@ -45,49 +30,134 @@ Jazzer currently supports the following platforms:
45
30
* macOS 12+ x86_64 & arm64
46
31
* Windows x86_64
47
32
48
-
## Using Jazzer via...
33
+
## Setup
34
+
35
+
Jazzer integrates seamlessly with JUnit (version 5.9.0 or newer), allowing you to write fuzz tests alongside your regular unit tests.
36
+
The recommended way to get started is by adding the `jazzer-junit` dependency to your project.
37
+
This package is available on [Maven Central](https://central.sonatype.com/artifact/com.code-intelligence/jazzer-junit) and is signed with [this key](deploy/maven.pub).
38
+
39
+
You can use Jazzer with popular build tools:
40
+
41
+
### Maven
42
+
43
+
Add the following to your `pom.xml`:
44
+
45
+
```xml
46
+
<dependency>
47
+
<groupId>com.code-intelligence</groupId>
48
+
<artifactId>jazzer-junit</artifactId>
49
+
<version>LATEST VERSION</version>
50
+
</dependency>
51
+
```
52
+
53
+
A complete example project using Maven is available in [`examples/junit`](examples/junit).
54
+
55
+
### Gradle
49
56
50
-
### JUnit 5
57
+
Include Jazzer in your `build.gradle`:
51
58
52
-
The following steps assume that JUnit 5.9.0 or higher is set up for your project, for example based on the official [junit5-samples](https://github.com/junit-team/junit5-samples).
1. Add a dependency on `com.code-intelligence:jazzer-junit:<latest version>`.
55
-
All Jazzer Maven artifacts are signed with [this key](deploy/maven.pub).
56
-
2. Add a new *fuzz test* to a new or existing test class: a method annotated with [`@FuzzTest`](https://codeintelligencetesting.github.io/jazzer-docs/jazzer-junit/com/code_intelligence/jazzer/junit/FuzzTest.html) and at least one parameter.
57
-
A list of supported parameter types can be found in the [documentation](docs/junit-integration.md#supported-types).
58
-
3. Assuming your test class is called `com.example.MyFuzzTests`, create the *inputs directory*`src/test/resources/com/example/MyFuzzTestsInputs`.
59
-
4. Run a fuzz test with the environment variable `JAZZER_FUZZ` set to `1` to let the fuzzer rapidly try new sets of arguments.
60
-
If the fuzzer finds arguments that make your fuzz test fail or even trigger a security issue, it will store them in the inputs directory.
61
-
In this mode, only a single fuzz test is executed per test run (see [#599](https://github.com/CodeIntelligenceTesting/jazzer/issues/599) for details).
62
-
5. Run the fuzz test without `JAZZER_FUZZ` set to execute it only on the inputs in the inputs directory.
63
-
This mode, which behaves just like a traditional unit test, ensures that issues previously found by the fuzzer remain fixed and can also be used to debug the fuzz test on individual inputs.
63
+
### Bazel
64
64
65
-
A simple property-based fuzz test could look like this:
65
+
Jazzer is supported via [rules_fuzzing](https://github.com/bazelbuild/rules_fuzzing), the official Bazel rules for fuzzing.
66
+
For setup instructions, see [the README](https://github.com/bazelbuild/rules_fuzzing#java-fuzzing).
67
+
68
+
With Jazzer set up, you can start writing fuzz tests and benefit from automated bug discovery and improved code coverage.
69
+
70
+
## Writing fuzz tests
71
+
72
+
To write a fuzz test, add a method to your test class and annotate it with [`@FuzzTest`](https://codeintelligencetesting.github.io/jazzer-docs/jazzer-junit/com/code_intelligence/jazzer/junit/FuzzTest.html).
73
+
Jazzer will automatically generate and mutate inputs for your method parameters.
74
+
You can use primitives, strings, arrays, and many standard library classes.
75
+
See the [mutation framework documentation](docs/mutation-framework.md#supported-types) for details.
76
+
To run a fuzz test in [fuzzing mode](#fuzzing-mode), set environment variable `JAZZER_FUZZ` to a truthy value:
77
+
```bash
78
+
JAZZER_FUZZ=1 mvn test org.example.ParserTests
79
+
```
80
+
81
+
Here is an example that demonstrates fuzzing security-relevant logic:
A complete Maven example project can be found in [examples/junit](examples/junit).
111
+
112
+
113
+
## Running Jazzer
114
+
115
+
Jazzer can be run in two ways: using the JUnit integration or by using Jazzer standalone.
116
+
117
+
### Using JUnit integration
118
+
119
+
To run fuzz tests, use your build system as you would for regular tests.
120
+
Methods annotated with `@FuzzTest` can be executed in two modes: regression mode and fuzzing mode.
121
+
122
+
123
+
#### Regression mode
80
124
81
-
A complete Maven example project can be found in [`examples/junit`](examples/junit).
125
+
In regression mode, Jazzer runs each fuzz test with crashing inputs found in its corresponding [*inputs directory*](#inputs-directory).
126
+
This mode behaves like a traditional unit test: it verifies that previously discovered issues remain fixed and helps debug the fuzz test with specific inputs.
127
+
By default, Jazzer operates in regression mode unless fuzzing mode is explicitly enabled.
128
+
If you want that Jazzer also runs the inputs from the corpus directory, set the environment variable `JAZZER_COVERAGE=1`.
82
129
83
-
A detailed description of the JUnit integration can be found in the [documentation](docs/junit-integration.md).
84
130
85
-
###GitHub releases
131
+
#### Fuzzing mode
86
132
87
-
You can also use GitHub release archives to run a standalone Jazzer binary that starts its own JVM configured for fuzzing:
133
+
This mode helps uncover new bugs and improve test coverage.
134
+
Enable fuzzing mode by setting the environment variable `JAZZER_FUZZ=1` before running your tests.
135
+
Jazzer will execute a single fuzz test, automatically generating and mutating inputs to maximize code coverage and find bugs.
136
+
If Jazzer discovers an input that generates new coverage, it is stored in the [*generated corpus directory*](#generated-corpus-directory) of the fuzz test.
137
+
If Jazzer discovers an input that causes a fuzz test to fail (such as an uncaught exception or a triggered sanitizer), it stores the crashing input in the [*inputs directory*](#inputs-directory).
138
+
139
+
140
+
### Jazzer standalone
141
+
There are two ways to use Jazzer standalone: by calling the Jazzer main class directly or by using the `jazzer` binary.
142
+
143
+
#### Calling the Jazzer main class directly
144
+
145
+
To call Jazzer directly you need to pass it the project classpath, the path to the `jazzer.jar` and `jazzer-junit.jar`
146
+
along with the Jazzer main class `com.code_intelligence.jazzer.Jazzer` and target class that contains the Fuzz Test.
Optionally you can add other Jazzer arguments with double dash command-line flags.
153
+
Because Jazzer is based on libFuzzer, all available libFuzzer arguments can be added with single dash command-line flags.
154
+
Please refer to [libFuzzer](https://llvm.org/docs/LibFuzzer.html) for documentation.
155
+
156
+
#### Using the `jazzer` binary
157
+
Jazzer is available as a standalone binary from the GitHub release archives that starts its own JVM configured for fuzzing:
88
158
89
159
1. Download and extract the latest release from the [GitHub releases page](https://github.com/CodeIntelligenceTesting/jazzer/releases).
90
-
2. Add a new class to your project with a <code>public static void fuzzerTestOneInput(String par1, int par2, int[] par3, ...)</code> method, with the parameters you want to use in the fuzz test.
160
+
2. Add a new class to your project with a `public static void fuzzerTestOneInput(String par1, int par2, int[] par3, ...)` method, with the parameters you want to use in the fuzz test.
91
161
3. Compile your fuzz test with `jazzer_standalone.jar` on the classpath.
92
162
4. Run the `jazzer` binary (`jazzer.exe` on Windows), specifying the classpath and fuzz test class:
93
163
@@ -97,31 +167,70 @@ You can also use GitHub release archives to run a standalone Jazzer binary that
97
167
98
168
If you see an error saying that `libjvm.so` has not been found, make sure that `JAVA_HOME` points to a JDK.
99
169
100
-
The [`examples`](examples/src/main/java/com/example) directory includes both toy and real-world examples of fuzz tests.
170
+
## Directories and files
101
171
102
-
### Bazel
172
+
Jazzer uses two directories to store inputs: the *generated corpus directory* and the *inputs directory*.
173
+
174
+
### Generated corpus directory
175
+
176
+
The generated corpus directory is where Jazzer saves inputs that generate new coverage during fuzzing.
177
+
It is located in `.cifuzz-corpus/<package>/<FuzzTestClass>/<fuzzTestMethod>`, where `<package>`, `<FuzzTestClass>`, and `<fuzzTestMethod>` correspond to the package name, class name, and method name of the fuzz test, respectively.
178
+
For example, if the fuzz test is in the class `src/test/java/com/example/ValidFuzzTestsInputs.java`, method `byteFuzz`, the corpus directory is located in `.cifuzz-corpus/com.example.ValidFuzzTestsInputs/byteFuzz`.
179
+
180
+
181
+
### Inputs directory
103
182
104
-
Support for Jazzer is available in [rules_fuzzing](https://github.com/bazelbuild/rules_fuzzing), the official Bazel rules for fuzzing.
105
-
See [the README](https://github.com/bazelbuild/rules_fuzzing#java-fuzzing) for instructions on how to use Jazzer in a Java Bazel project.
183
+
Any input that triggers a crash during fuzzing is saved to the *inputs directory*.
184
+
This directory is derived from the package and class name of the fuzz test.
185
+
For example, if the fuzz test is in the class `src/test/java/com/example/ValidFuzzTestsInputs.java`, method `byteFuzz`, the *inputs directory* is located in `src/test/resources/com/example/ValidFuzzTestsInputs/byteFuzz`.
186
+
If this directory does not exist, Jazzer will save crash inputs in the directory from which the tests are executed.
106
187
107
-
### OSS-Fuzz
188
+
189
+
## Sanitizers / bug detectors
190
+
191
+
Sanitizers (also called *bug detectors*) are built-in checks that help Jazzer find security issues in your application while fuzzing.
192
+
They automatically monitor the program under test for risky behaviors, such as unsafe file access or network requests, and report them back with detailed information.
193
+
This way, you don’t just learn that an input caused a crash, but you also get insight into what kind of vulnerability it triggered.
194
+
195
+
If you’ve worked with C or C++ before, you may know sanitizers like [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html) or [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html).
196
+
Jazzer sanitizers serve a similar purpose, but they are designed specifically for Java and JVM applications.
197
+
Instead of low-level memory errors, they focus on common security issues in Java software, such as *Server-Side Request Forgery* (SSRF), *File Path Traversal*, *OsCommandInjection*, etc.
198
+
199
+
Sanitizers not only detect dangerous conditions but also make fuzzing smarter.
200
+
By providing feedback to the fuzzer about what they detect, they can guide input generation towards the kinds of values most likely to trigger vulnerabilities.
201
+
This makes it possible to find complex bugs more quickly and with less manual effort.
202
+
203
+
You can browse all available sanitizers in the [Jazzer codebase](sanitizers/src/main/java/com/code_intelligence/jazzer/sanitizers).
204
+
Each sanitizer can be disabled using [`disabled_hooks`](docs/arguments-and-configuration-options.md).
205
+
206
+
207
+
### Configure sanitizers using BugDetectorsAPI
208
+
209
+
Some sanitizers can also be configured at runtime to adjust how they detect vulnerabilities.
210
+
Currently, this applies to ServerSideRequestForgery and FilePathTraversal, which can be customized using the BugDetectorsAPI.
211
+
For details, check out the [API documentation](https://codeintelligencetesting.github.io/jazzer-docs/jazzer-api/com/code_intelligence/jazzer/api/BugDetectors.html).
212
+
213
+
214
+
## OSS-Fuzz
108
215
109
216
[Code Intelligence](https://code-intelligence.com) and Google have teamed up to bring support for Java, Kotlin, and other JVM-based languages to [OSS-Fuzz](https://github.com/google/oss-fuzz), Google's project for large-scale fuzzing of open-source software.
110
217
Read [the OSS-Fuzz guide](https://google.github.io/oss-fuzz/getting-started/new-project-guide/jvm-lang/) to learn how to set up a Java project.
111
218
112
-
## Building from source
219
+
## Trophies
220
+
221
+
A list of security issues and bugs found by Jazzer is maintained [here](docs/trophies.md).
222
+
If you found something interesting and the information is public, please send a PR to add it to the list.
113
223
114
-
Information on building and testing Jazzer for development can be found in [CONTRIBUTING.md](CONTRIBUTING.md)
115
224
116
225
## Further documentation
117
226
118
-
*[Common options and workflows](docs/common.md)
227
+
*[Arguments and Configuration Options](docs/arguments-and-configuration-options.md)
0 commit comments