
Высокопроизводительный фаззинг на основе бинарной трансляции riscv в x86 и современных методов фаззинга
Дата начала: декабрь 2021 г.
Это фаззер с покрытием кода, основанный на эмуляции, который использует собственный Just-In-Time компилятор для достижения производительности, близкой к нативной. Он работает путём подъёма RISC-V ELF-бинарников до промежуточного представления перед JIT-компиляцией в x86 во время выполнения. В процессе JIT-компиляции код инструментируется для поддержки улучшений фаззинга, таких как отслеживание покрытия, asan, cmpcov или снапшот-ориентированный фаззинг.

Цель этого проекта — подчеркнуть преимущества использования эмулируемого окружения для фаззинга. Ранее существовало множество фаззеров на основе эмуляции, но почти все они используют для базовой эмуляции движок qemu. Хотя этот движок имеет довольно зрелый just-in-time компилятор и генерирует очень хороший код, он не предназначен для фаззинга. При фаззинге мы намерены запускать один и тот же процесс тысячи раз в секунду. Это открывает возможности для специализированных оптимизаций, которые qemu не использует активно, таких как повторное использование одного и того же пространства памяти для каждого запуска процесса и сброс лишь ограниченного объёма памяти с помощью механик dirty bit.
Во многом это скорее proof-of-concept, над которым я хотел поработать, чтобы изучить внутренности компиляторов и иметь площадку на основе эмуляции для экспериментов с различными техниками фаззинга, такими как разные метрики покрытия, планировщики сидов и снапшот-ориентированный фаззинг. С добавлением дополнительных JIT-оптимизаций и, что наиболее важно, расширений для поддержки более популярных архитектур, таких как mips или arm, он, однако, вполне мог бы использоваться для эффективного фаззинга закрытого исходного кода, который нельзя просто инструментировать через перекомпиляцию.
Судя по тестам, которые я проводил до сих пор, sfuzz имеет значительно меньшие накладные расходы, чем многие другие популярные фаззеры, что обеспечивает очень высокую производительность, особенно для небольших фазз-кейсов.
Более подробная информация о возможностях и решениях, принятых для этого фаззера, приведена в сопутствующем блог-посте (https://seal9055.com/blog/fuzzing/sfuzz) и в файлах документации, перечисленных ниже:
Весь фаззер написан на rust, поэтому после клонирования репозитория просто запустите cargo build --release для компиляции.
Поскольку фаззер в настоящее время поддерживает только RISC-V, цель должна быть скомпилирована в RISC-V с использованием указанного ниже тулчейна (или аналогичного). Альтернативно, если у вас уже есть RISC-V бинарник, он тоже подойдёт.
После этого просто создайте входной/выходной каталоги, добавьте несколько начальных сид-файлов во входной каталог и запустите фаззер.
./sfuzz -i in -o out -- ./test_cases/simple_test @@
Дополнительные флаги могут быть переданы через параметры командной строки, чтобы указать количество потоков, включить снапшот-фаззинг, добавить словарь в мутатор и т.д. Дополнительные опции можно посмотреть, запустив sfuzz с флагом -h.
Если вы хотите протестировать фаззер на целях различной сложности, можно использовать progrem_generator из tools/program_generator для автоматической генерации программ различной сложности. Обратите внимание, что для компиляции цели вам потребуется RISC-V тулчейн.
Это настраивает тулчейн для компиляции бинарников riscv, которые могут быть загружены/использованы этим проектом.
Riscv компилятор/инструменты:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev \
libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev \
libexpat-dev
git clone https://github.com/riscv/riscv-gnu-toolchain && cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv --with-arch=rv64i
sudo make
Отладчик:
gdb-multiarch
Этот список представляет набор функций, которые я планирую реализовать в будущем.