Spec-Zone.ru › OCaml 5.0

Глава 24 Fuzzing с помощью afl-fuzz

  • 24.1 Обзор
  • 24.2 Генерация инструментирования
  • 24.3 Пример

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API