Собираем docker образ:
git clone https://github.com/lenix123/java_fuzz_workshop.git && cd java_fuzz_workshop
docker build --tag=pdfbox_workshop_img .
Запускаем контейнер:
docker run -it -v "$(pwd)/artifacts:/home/fuzz/artifacts:ro" --name=pdfbox_fuzz pdfbox_workshop_img
Применяем патч:
cd /home/fuzz/pdfbox
git apply ../artifacts/pdfbox.patch
Подготавливаем входной корпус:
mkdir pdfbox/src/test/resources/org/apache/pdfbox/pdfparser/PDFStreamParserTestInputs
cp /home/fuzz/artifacts/corpus/* pdfbox/src/test/resources/org/apache/pdfbox/pdfparser/PDFStreamParserTestInputs
Собираем тесты и запускаем фаззинг FuzzTestPDFParser:
mvn clean install -DskipTests
cd /home/fuzz/pdfbox/pdfbox
JAZZER_FUZZ=1 mvn test -Dtest=PDFStreamParserTest#FuzzTestPDFParser
Наработанный корпус хранится в /home/fuzz/pdfbox/pdfbox/.cifuzz-corpus/
Cобираем обёртку для pdfbox:
cd /home/fuzz/pdfbox
mkdir fuzz && cd fuzz
cp -r /home/fuzz/artifacts/* .
javac -cp ../pdfbox/target/classes/ ./PDFStreamParserFuzzer.java
Запускаем фаззинг PDF парсера:
jazzer --cp=.:../pdfbox/target/classes/:../io/target/classes/:/home/fuzz/log4j/log4j-api-2.24.3.jar:/home/fuzz/log4j/commons-logging-1.2/commons-logging-1.2.jar --target_class=PDFStreamParserFuzzer -dict=pdf.dict -close_fd_mask=3 -- corpus
Прогоняем наработанный корпус:
cd /home/fuzz/pdfbox/fuzz
jazzer --cp=.:../pdfbox/target/classes/:../io/target/classes/:/home/fuzz/log4j/log4j-api-2.24.3.jar::/home/fuzz/log4j/commons-logging-1.2/commons-logging-1.2.jar --target_class=PDFStreamParserFuzzer -close_fd_mask=3 --coverage_dump=coverage.exec -runs=1 -- corpus
Генерируем html отчёт с помощью jacococli:
java -jar /home/fuzz/jacoco/lib/jacococli.jar report coverage.exec --classfiles ../pdfbox/target/pdfbox-3.0.4.jar --html report --sourcefiles ../pdfbox/src/main/java/
Копируем папку с html отчётом на хост:
docker cp pdfbox_fuzz:/home/fuzz/pdfbox/fuzz/report .