Глава 24 Fuzzing с помощью afl-fuzz
24.1 Обзор
American fuzzy lop («afl-fuzz») — это мультипликатор, инструмент для тестирования программ путём предоставления случайных входных данных, в поисках тех входных данных, которые приводят к сбоям программы.
В отличие от большинства мультипликаторов, afl-fuzz наблюдает за внутренним поведением тестируемой программы и корректирует генерируемые тестовые случаи для запуска неисследованных путей выполнения. В результате, тестовые случаи, сгенерированные afl-fuzz, охватывают больше возможных поведений тестируемой программы, чем другие мультипликаторы.
Это требует, чтобы тестируемые программы были инструментированы для взаимодействия с afl-fuzz. Компилятор native-кода «ocamlopt» может генерировать такое инструментирование, позволяя использовать afl-fuzz с программами, написанными на OCaml.
Для получения дополнительной информации об afl-fuzz, посетите веб-сайт по адресу http://lcamtuf.coredump.cx/afl/.
24.2 Генерация инструментирования
Необходимое инструментирование для afl-fuzz не генерируется по умолчанию и должно быть явно включено, передав параметр -afl-instrument инструменту ocamlopt.
Для тестирования большой системы без изменения инструментов сборки, скрипт конфигурации OCaml (configure) также принимает параметр afl-instrument. Если OCaml сконфигурирован с afl-instrument, то все программы, скомпилированные с помощью ocamlopt, будут инструментированы.
24.2.1 Дополнительные параметры
В редких случаях полезно контролировать объём генерируемого инструментирования. Передавая параметр -afl-inst-ratio N в ocamlopt со значением N меньше 100, инструментирование может быть сгенерировано только для N% ветвей. (См. документацию afl-fuzz по параметру AFL_INST_RATIO для точного эффекта этого).
24.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"
| _ -> ()
Существует единственный вход (строка «secret code»), который приводит к сбою этой программы, но найти его с помощью случайного поиска невозможно.
Вместо этого, мы компилируем с включённым инструментированием 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-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/afl-fuzz.html