Собираем 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" -v "$SYDR_PATH:/sydr/" --network=host --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.25.2.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.25.2.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.5.jar --html report --sourcefiles ../pdfbox/src/main/java/Копируем папку с html отчётом на хост:
docker cp pdfbox_fuzz:/home/fuzz/pdfbox/fuzz/report .- Чтобы запустить фаззинг при помощи sydr-fuzz:
/sydr/sydr-fuzz -c pdfStreamParser_sydr.toml run- Чтобы минимизировать наработанный корпус:
/sydr/sydr-fuzz -c pdfStreamParser_sydr.toml cmin- Для сбора покрытия:
/sydr/sydr-fuzz -c pdfStreamParser_sydr.toml cov-html