
«Snapshotting our way to CVE-2026-9539» ब्लॉगपोस्ट के लिए PoC
sudo apt install meson ninja-build valgrind clang-20 binutils libglib-2.0-dev cmake python3-venv
Rust टूलचेन इंस्टॉल करें।
libafl को fuzzer डायरेक्टरी के बगल में क्लोन करें और सही commit चेकआउट करें
git clone https://github.com/AFLplusplus/LibAFL.git libafl/
cd libafl
git checkout 6e7ea0da898b63c5098f84c0908a8c427a5c73ff
git apply ../patches/libafl/module_snapshot.patch
git apply ../patches/libafl/snapshot.patch
git apply ../patches/libafl/libafl_bolts_wide.patch
git apply ../patches/libafl/libafl_targets_simd.patch
cd ..
git clone https://gitlab.freedesktop.org/slirp/libslirp.git
cd libslirp
git checkout 4ddbcd5cc4f7a14473ebfc1dcdd1afb4edf96908
git apply ../patches/libslirp/meson_fuzzing.patch
git apply ../patches/libslirp/meson_options.patch
git apply ../patches/libslirp/meson.patch
git apply ../patches/libslirp/qemu_target.patch
git apply ../patches/libslirp/tcp_input.patch
git apply ../patches/libslirp/tcp_outpt.patch
CC=clang-20 CXX=clang++-20 meson build
ninja -C build
या तो cksum फ़ंक्शन के ret निर्देश का ऑफ़सेट खोजने के लिए बाइनरी को IDA/Binja/ghidra में खोलें या
nm -n build/fuzzing/qemu-target | grep cksum
objdump -d --disassemble=cksum build/fuzzing/qemu-target | grep -E '\bret[qwl]?\b'
आपको जो पहला ऑफ़सेट मिला उसे दूसरे से घटाएँ और fuzzer/src/libslirp/hooks.rs:200 में मान बदलें
cd ../fuzzer
cargo +nightly build --release
नोट: आपके llvm इंस्टॉल के आधार पर आपको LLVM_CONFIG_PATH एनवायरनमेंट वेरिएबल निर्दिष्ट करने की आवश्यकता हो सकती है।
cp ../libslirp/build/fuzzing/qemu-target ./target/release/
cd target/release
mkdir corpus
RUST_LOG=warn ./slirp-snapshots-stateful-fuzzer
चेतावनी: यह VM या नेटवर्क माउंट के साथ साझा किए गए फ़ोल्डरों में काम नहीं करता है।
offline_reproducer/runner/src/libslirp/hooks.rs:17 में ऑफ़सेट बदलने के लिए चरण 6 करें। फिर runner और driver को कंपाइल करें
cd runner
cargo +nightly-2026-06-11 build --release
cp target/release/offline_runner ../../fuzzer/target/release
cp target/release/x86_64-unknown-linux-gnu/release/libafl_qemu_asan_host.so ../../fuzzer/target/release
cd ../driver
cargo +nightly build --release
cp target/release/offline_driver ../../fuzzer/target/release
cd ../../fuzzer/target/release
mkdir corpus coverage repro_files
एक टर्मिनल में driver चलाएँ, फिर दूसरे में fuzzer चलाएँ।
RUST_LOG=warn ./offline_driver
RUST_LOG=warn ./slirp-snapshots-stateful-fuzzer
कवरेज फ़ाइलें coverage फ़ोल्डर में संग्रहीत की जाएँगी, इन्हें bncov (binja)/lighthouse (ida/binja)/lightkeeper (ghidra) के साथ खोला जा सकता है। यदि आवश्यक हो तो drcov-merge के साथ मर्जिंग की जा सकती है।