Глава 22. Fuzzing с afl-fuzz
22.1 Обзор
American fuzzy lop («afl-fuzz») — это фуззер, инструмент для тестирования программного обеспечения путём предоставления случайных входных данных, поиска тех входных данных, которые приводят к сбоям программы.
В отличие от большинства фуззеров, afl-fuzz наблюдает за внутренним поведением тестируемой программы и корректирует генерируемые тестовые примеры для запуска неисследованных путей выполнения. В результате тестовые примеры, сгенерированные afl-fuzz, охватывают больше возможных вариантов поведения тестируемой программы, чем другие фуззеры.
Для этого необходимо инструментировать тестируемые программы для взаимодействия с afl-fuzz. Компилятор машинного кода «ocamlopt» может генерировать такое инструментирование, позволяя использовать afl-fuzz для программ, написанных на OCaml.
Дополнительную информацию об afl-fuzz можно найти на сайте http://lcamtuf.coredump.cx/afl/.
22.2 Генерация инструментирования
Требуемое afl-fuzz инструментирование не генерируется по умолчанию и должно быть явно включено путём передачи параметра -afl-instrument инструменту ocamlopt.
Для тестирования большой системы без изменения средств сборки, скрипт конфигурации OCaml (configure) также принимает параметр afl-instrument. Если OCaml сконфигурирован с afl-instrument, то все программы, скомпилированные с помощью ocamlopt, будут инструментированы.
22.2.1 Дополнительные параметры
В редких случаях полезно контролировать объём генерируемого инструментирования. Передавая аргумент -afl-inst-ratio N инструменту ocamlopt со значением N меньше 100, инструментирование можно сгенерировать только для N% ветвей. (См. документацию afl-fuzz по параметру AFL_INST_RATIO для точного эффекта этого параметра).
22.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 -i input -o output ./readline
Проанализировав выходные данные инструментирования, фуззер быстро находит вход, вызывающий сбой.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/afl-fuzz.html