Глава 24 Мультирование с помощью afl-fuzz
1 Обзор
American fuzzy lop («afl-fuzz») — это мультирователь, инструмент для тестирования программ, предоставляя случайные входные данные, ища те входные данные, которые приводят к аварийному завершению программы.
В отличие от большинства мультирователей, afl-fuzz наблюдает за внутренним поведением тестируемой программы и корректирует генерируемые тестовые примеры для запуска неисследованных путей выполнения. В результате тестовые примеры, генерируемые afl-fuzz, охватывают больше возможных состояний тестируемой программы, чем другие мультирователи.
Для этого необходимо инструментировать тестируемые программы для взаимодействия с afl-fuzz. Компилятор машинного кода «ocamlopt» может генерировать такую инструментацию, позволяя использовать afl-fuzz с программами, написанными на OCaml.
Дополнительную информацию об afl-fuzz см. на веб-сайте по адресу http://lcamtuf.coredump.cx/afl/.
2 Генерация инструментации
Инструментация, необходимая для afl-fuzz, не генерируется по умолчанию и должна быть явно включена, передав параметр -afl-instrument инструменту ocamlopt.
Для мультации большой системы без изменения средств сборки скрипт конфигурации OCaml также принимает параметр afl-instrument. Если OCaml сконфигурирован с afl-instrument, все программы, скомпилированные с помощью ocamlopt, будут инструментированы.
2.1 Расширенные параметры
В редких случаях бывает полезно контролировать количество генерируемой инструментации. Передавая аргумент -afl-inst-ratio N инструменту ocamlopt со значением N меньше 100, инструментация может быть сгенерирована только для N% ветвей. (См. документацию afl-fuzz по параметру AFL_INST_RATIO для точного эффекта этого параметра).
3 Пример
В качестве примера мы используем мультирование следующей программы, readline.ml:
let _ =
let s = read_line () in
match Array.to_list (Array.init (String.length s) (String.get s)) with
['s'; 'e'; 'c'; 'r'; 'e'; 't'; ' '; 'c'; 'o'; 'd'; 'e'] -> failwith "uh oh"
| _ -> ()
Существует один вход (строка «секретный код»), который вызывает сбой этой программы, но найти его с помощью случайного поиска невозможно.
Вместо этого мы компилируем с включенной инструментацией afl-fuzz:
ocamlopt -afl-instrument readline.ml -o readline
Затем мы запускаем программу с помощью afl-fuzz:
mkdir input echo asdf > input/testcase mkdir output afl-fuzz -m none -i input -o output ./readline
Просматривая вывод инструментации, мультирователь быстро находит входные данные, вызывающие сбой.
Примечание. Для мультирования программы OCaml с помощью afl-fuzz требуется передать параметр -m none для отключения стандартного ограничения виртуальной памяти afl-fuzz в 50 МБ.
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/afl-fuzz.html