Spec-Zone.ru › OCaml 4.14

Глава 22. Fuzzing с afl-fuzz

  • 22.1 Обзор
  • 22.2 Генерация инструментирования
  • 22.3 Пример

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

Spec-Zone.ru

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