Repository navigation
Releases: blsdncn/MCFuzz
Release list
MCFuzz v1.0.2 -- Jazzer Pipeline Actually Works
This release fixes critical bugs in the Jazzer fuzzing pipeline that caused the v1.0.1 image to silently produce zero fuzzing iterations while reporting that the smoke test was healthy. Targets, fuzzing campaigns, and collected data are unchanged -- these are evaluator-workflow fixes so the docker image faithfully reproduces the Jazzer side of the experiment.
Note: The image is large; ensure ~6 GB of disk for the tarball plus the uncompressed image.
What was broken in v1.0.1
Four independent issues conspired to make the Jazzer docker path look healthy while doing nothing:
- JaCoCo + JDK 21 + Jazzer 0.24 sanitizer crash. When JaCoCo's javaagent was attached for the smoke, Jazzer's
Deserializationsanitizer's<clinit>triggeredObjectOutputStream.writeObject(SERIALIZED_JAZ_ZER_INSTANCE)which asked the JVM to generatejdk/internal/reflect/GeneratedSerializationConstructorAccessor1-- generation failed under JaCoCo's bytecode transformation, throwingNoClassDefFoundError. Jazzer'smaindied before the libFuzzer loop ever started. The smoke's.execfile was filled purely by JaCoCo class-loading instrumentation during JVM startup; zero actual fuzz iterations executed. - Wrong gradle module cache path.
run-jazzer-direct.shdefaultedGRADLE_MODULE_CACHEto$HOME/.gradle/caches/..., but the image setsGRADLE_USER_HOME=/work/.gradle-container. The classpath builder found zero jars, Netty was missing, and the longer Jazzer campaign died withNoClassDefFoundError: io/netty/handler/codec/DecoderExceptionin ~2 seconds. RESET_OUTPUTS=1choked on bind-mounted output dirs. The reset step didrm -rfon the output subdirs, which fails with "Device or resource busy" when those subdirs are docker bind mounts.- The smoke's pass criterion was too lax -- it accepted runs where Jazzer never actually fuzzed.
What changed in v1.0.2
Five edits:
velocity-jazzer-integration/scripts/run-jazzer-direct.shandrun-jazzer-direct-stateless.sh:GRADLE_MODULE_CACHEdefault now honorsGRADLE_USER_HOME(falls back to$HOME/.gradle), so the classpath resolves correctly inside docker and on the host.- Added
--disabled_hooks=com.code_intelligence.jazzer.sanitizers.Deserializationto the Jazzer args, sidestepping the JDK 21 + JaCoCo incompatibility. The other 14 sanitizers are unaffected. - Made
WORK_DIRenv-overridable so evaluators can mount a host directory there to capture campaign artifacts. RESET_OUTPUTS=1now clears the contents of output dirs rather than the dirs themselves, so it works with bind mounts.
scripts/spike-jazzer-jacoco-feasibility.sh:- Pass criterion now requires actual
Done <N> runsin the Jazzer stderr (i.e. real fuzz iterations had to occur). - Summary now reports a
fuzz_iterationsfield.
- Pass criterion now requires actual
README.mdanddocker/README.md:- Fixed the AFLNet container-campaign mount target (
/work/outputs->/work/campaign-runs). - Updated the Jazzer container campaign to use
-e WORK_DIR=/work/jazzer-campaign -v "$PWD/jazzer-campaign:/work/jazzer-campaign", so artifacts land on the host. - Updated the interactive-shell example with matching mounts.
- Fixed the AFLNet container-campaign mount target (
Quickstart
Download and load the image:
sha256sum -c mcfuzz-aflnet-experiment-ready-*.tar.gz.sha256
gunzip -c mcfuzz-aflnet-experiment-ready-*.tar.gz | docker loadRun smoke tests:
# AFLNet
docker run --rm -v "$PWD/campaign-runs:/work/campaign-runs" mcfuzz-aflnet-experiment:ready make smoke-aflnet
# Jazzer (stateful) — fuzzing iterations now actually occur
docker run --rm -e TIME_LIMIT=30 -v "$PWD/jazzer-outputs:/work/velocity-jazzer-integration/build/jazzer-jacoco-feasibility" mcfuzz-aflnet-experiment:ready make smoke-jazzer-stateful
# Jazzer (stateless)
docker run --rm -e TIME_LIMIT=30 -v "$PWD/jazzer-outputs:/work/velocity-jazzer-integration/build/jazzer-jacoco-feasibility" mcfuzz-aflnet-experiment:ready make smoke-jazzer-statelessSee README.md for full documentation including longer campaign commands.
MCFuzz v1.0.1 -- Stabilized Evaluator Image
Drop-in replacement for the v1.0.0 ready image. Targets, fuzzing campaigns, and collected data are unchanged. This release only smooths over rough edges in the evaluator workflow.
Note: The image is very large, make sure you have at least 6 GB of disk space for the tarball and the uncompressed docker image.
What changed since v1.0.0
The previous ready image baked in the AFLNet-side dependencies, but the Jazzer/JaCoCo path still did a gradle test-class build and pulled the JaCoCo agent from Maven Central on its first run inside the container. That first run was fragile (network hiccups, gradle plugin quirks) and could leave evaluators staring at an empty jacoco.exec. v1.0.1 fixes this by making the velocity-jazzer-integration test classes and the JaCoCo agent + CLI jars baked into the image, and the JaCoCo agent is attached to the inner Jazzer JVM via an explicit -javaagent: flag instead of JAVA_TOOL_OPTIONS (which was getting dropped during Jazzer's launcher -> driver JVM handoff). Net effect: a fresh container produces non-empty coverage on the first invocation, with no internet access required.
The README docker-run examples were also corrected: TIME_LIMIT=30 must be passed with -e, not as a positional argument after the image name.
Quickstart
Download and load the image:
sha256sum -c mcfuzz-aflnet-experiment-ready-*.tar.gz.sha256
gunzip -c mcfuzz-aflnet-experiment-ready-*.tar.gz | docker loadRun smoke tests:
# AFLNet
docker run --rm -v "$PWD/campaign-runs:/work/campaign-runs" mcfuzz-aflnet-experiment:ready make smoke-aflnet
# Jazzer (stateful)
docker run --rm -e TIME_LIMIT=30 -v "$PWD/jazzer-outputs:/work/velocity-jazzer-integration/build/jazzer-jacoco-feasibility" mcfuzz-aflnet-experiment:ready make smoke-jazzer-stateful
# Jazzer (stateless)
docker run --rm -e TIME_LIMIT=30 -v "$PWD/jazzer-outputs:/work/velocity-jazzer-integration/build/jazzer-jacoco-feasibility" mcfuzz-aflnet-experiment:ready make smoke-jazzer-statelessSee README.md for full documentation.
MCFuzz v1.0.0 -- Ready Image Release
Pre-built Docker image with all dependencies resolved.
This is a hefty docker image, have at least 6 GB of disk space please!
Quickstart
Download and load the image:
sha256sum -c mcfuzz-aflnet-experiment-ready-*.tar.gz.sha256
gunzip -c mcfuzz-aflnet-experiment-ready-*.tar.gz | docker loadRun smoke tests:
# AFLNet
docker run --rm -v "$PWD/campaign-runs:/work/campaign-runs" mcfuzz-aflnet-experiment:ready make smoke-aflnet
# Jazzer
docker run -e "TIME_LIMIT=30" --rm -v "$PWD/jazzer-outputs:/work/velocity-jazzer-integration/build/jazzer" mcfuzz-aflnet-experiment:ready make smoke-jazzer-statefulSee README.md for full documentation.