ispras / Futag

FUTAG (FUzzing Target Automated Generator) - автоматический генератор фаззинг-оберток для библиотек
GNU General Public License v3.0
51 stars 10 forks source link
addresssanitizer automated-testing code-generator crash fuzzing llvm static-analysis

Оглавление

1. Описание

FUTAG — это инструмент автоматизированной генерации фаззинг-оберток для программных библиотек. FUTAG предоставляет возможность генерации фаззинг-оберток как в случае отсутствия контекстов использования тестируемой библиотеки, так и при их наличии. FUTAG использует, в качестве внешнего интерфейса, для анализа исходного кода библиотек инструментарий Clang.

Статический анализатор, реализованный в FUTAG, во время сборки тестируемой библиотеки выполняет:

При наличии контекстов использования, FUTAG выполняет поиск вызовов функций, составляет зависимости между найденными вызовами и оформляет контексты вызовов.

В Futag так же реализована возможность получения контекстов использования тестируемой библиотеки от инструмента для определения поверхности атаки Natch.

Работа Futag иллюстрируется на следующем рисунке:

Данный проект основан на LLVM со статическим анализом Clang и распространяется под лицензией "GPL v3 license"

2. Установка

2.1. Использование докер-контейнера

Вы можете попробовать собрать Futag с готовыми Докер-файлами для ОС Ubuntu.

2.2. Использование предварительно упакованного пакета

  ~/futag-llvm$ ./buildAFLplusplus.sh

2.3. Сборка и установка из исходного кода

2.3.1. Зависимости

Данная инструкция позволяет собрать копию проекта и запустить её в Unix-подобной системе.

Инструмент FUTAG основан на LLVM-project. Для компиляции проекта необходимо, чтобы следующие пакеты были установлены в вашей системе:

Для получения более детальной информации о зависимостях, необходимых для сборки LLVM, вы можете ознакомиться с документацией по указанной ссылке

В системе Ubuntu возможно требуется установить пакеты:

2.3.2. Сборка и установка

  ~$ git clone https://github.com/ispras/Futag
  ~/Futag/build$ ./build.sh
  ~/Futag/futag-llvm$ ./buildAFLplusplus.sh

3. Примеры использования

3.1. Автоматическая генерация фаззинг-оберток в условии отсутствия контекстов использования

from futag.preprocessor import *

FUTAG_PATH = "/home/futag/Futag-tests/futag-llvm/"
lib_path = "path/to/library/source/code"
build_test = Builder(
    FUTAG_PATH,
    lib_path,
    clean=True, # удалить все папки сгенерированные Futag-ом перед сборкой
    # intercept=True, # запуск компиляции с инструментом "intercept" для анализа compile_command.json
    # processes=4, # количество задач при сборке
    # build_ex_params="--with-openssl --with-mhash" # дополнительные параметры при сборке библиотеки
)
build_test.auto_build()
build_test.analyze()
from futag.generator import *

FUTAG_PATH = "/home/futag/Futag-tests/futag-llvm/"
lib_path = "path/to/library/source/code"

generator = Generator(
    FUTAG_PATH, # путь к директории "futag-llvm"
    lib_path, # путь к директории содержащей исходные кода исследуемого ПО
    # target_type=AFLPLUSPLUS, 
)

# Генерация фаззинг-оберток 
generator.gen_targets(
    anonymous=False # опция для генерации фаззинг-обертки для функций, которые не имеют публичный доступ
    max_wrappers= 10 # опция для органичения количества сгенерированных фаззинг-оберток для одной функции
)
# Compile fuzz drivers
generator.compile_targets(
    4, # количество задач при сборке
    # keep_failed=True, # сохранить не скомпилированные цели
    # extra_include="-DHAVE_CONFIG_H", # дополнительные параметры при сборке библиотеки,
    # extra_dynamiclink="-lz", # системные библиотеки для линковки
    # flags="-ferror-limit=1", # значение по умолчанию: ""
)

По-умолчанию, успешно скомпилированные фаззинг-обертки для целевых функций находятся в каталоге futag-fuzz-drivers, где для каждой целевой функции создаётся своя поддиректория название которой совпадает с именем целевой функции.

3.2. Автоматическая генерация фаззинг-оберток в наличии потребительской программы

from futag.preprocessor import *
from futag.generator import * 
from futag.fuzzer import * 

FUTAG_PATH = "/home/futag/Futag/futag-llvm"
library_root = "json-c-json-c-0.16-20220414"
consumer_root = "libstorj-1.0.3"
consumber_builder = ConsumerBuilder(
   FUTAG_PATH, # путь к директории "futag-llvm"
   library_root, # путь к директории содержащей исходные кода тестируемой библиотеки
   consumer_root, # путь к директории содержащей исходные кода потребительской программы
  #  clean=True,
  #  processes=16,
)
consumber_builder.auto_build()
consumber_builder.analyze()

context_generator = ContextGenerator(
    FUTAG_PATH, 
    library_root, 
)

context_generator.gen_context() # генерация фаззинг-оберток для контекстов
context_generator.compile_targets( #компиляция сгенерированных фаззинг-оберток
    keep_failed=True,
)

Если для функции сгенерировалось несколько фаззинг-оберток, в подкаталоге целевой функции создаются соответствующие директории, где к имени целевой функции добавляется порядковый номер. Документация Python-пакета находится по ссылке

Подобную информацию о работе Futag можно прочитать по ссылке

Шаблон скриптов запуска можно посмотреть здесь

Был создан репозиторий для тестирования Futag над библиотеками (json-c, php, FreeImage, и т.д.), можете протестировать с Докер-контейнером.

4. Авторы

5. Статьи и материалы

Видео

6. Найденные ошибки

Library Version Function Bug type Date of report Date of patch
libpng 1.6.37 png_convert_from_time_t AddressSanitizer:DEADLYSIGNAL Feb 8, 2021 Sep 13, 2022
tinyxml2 9.0.0 ErrorIDToName AddressSanitizer: global-buffer-overflow Nov 2, 2022 Nov 12, 2022
pugixml 1.13 default_allocate AddressSanitizer: allocation-size-too-big Apr 11, 2023 Apr 15, 2023

7. Результаты

Библиотека Время генерации Кол-во фаззинг-оберток Время компиляции Кол-во строк кода
lib json-c 180 3111 612 280.019
libpostgres 105 749 29 84.387
curl 4.210 152 21 9.617
openssl 2.172 269 255 19.458
pugixml 55 61 58 2.815
libopus 75 422 7 12.606