Глава 25. Фаззинг с помощью 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.
Чтобы выполнять фаззинг крупной системы без изменения инструментов сборки, скрипт configure OCaml также принимает параметр afl-instrument. Если OCaml настроен с параметром afl-instrument, то все программы, скомпилированные с помощью ocamlopt, будут инструментированы.
2.1 Дополнительные параметры
В редких случаях полезно управлять объемом генерируемой инструментализации. Если передать компилятору ocamlopt аргумент -afl-inst-ratio N, где 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"
| _ -> ()
У программы есть единственный входной параметр (строка «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-2026 INRIA.
https://ocaml.org/manual/5.5/afl-fuzz.html