Skip to content

morgonf/Futag

 
 

Repository files navigation

Оглавление

1. Описание

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

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

  • поиск определений сущностей (типы данных, функции, структуры и т.д.);
  • поиск зависимостей между сущностями. Собранная информация сохраняется как база знаний о тестируемой библиотеке (БЗТ). В условиях отсутствия котекстов использования библиотеки, FUTAG-генератор изучает БЗТ и создает фаззинг-обертки.

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

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

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

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

2. Установка

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

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

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

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

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

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

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

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

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

  • python-is-python3.
  • gcc-multilib
  • binutils-gold binutils-dev

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

  • Клонируйте проект:
  ~$ git clone https://github.com/ispras/Futag
  • Подготовьте директорию "custom-llvm", запустив скрипт:
  ~/Futag/custom-llvm$ ./prepare.sh

Этот скрипт создает директорию Futag/build и копирует в неё скрипт Futag/custom-llvm/build.sh

  • Запустите скопированный скрипт в "Futag/build":
  ~/Futag/build$ ./build.sh
  • В результате инструмент будет установлен в директорию Futag/futag-llvm

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

  • Предварительно должен быть установлен пакет futag-<версия>.tar.gz по пути futag-llvm/python-package/:
  ~$ pip install -r futag-llvm/python-package/requirements.txt
  ~$ pip install futag-llvm/python-package/futag-2.0.0.tar.gz

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-ом перед сборкой
    # 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 # опция для генерации фаззинг-обертки для функций, которые не имеют публичный доступ
)
# 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. Авторы

  • Чан Ти Тхиен
  • Курмангалеев Шамиль
  • Пономарев Дмитрий
  • Кузнецов Андрей
  • Theodor Arsenij Larionov-Trichkin

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

  • C. T. Tran and S. Kurmangaleev, "Futag: Automated fuzz target generator for testing software libraries" 2021 Ivannikov Memorial Workshop (IVMEM), 2021, pp. 80-85, doi: 10.1109/IVMEM53963.2021.00021.

  • Исследования по автоматической генерации фаззинг-оберток для функций библиотек, Открытая конференция ИСП РАН им. В.П. Иванникова 2022

Видео

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

About

FUTAG (FUzzing Target Automated Generator) - автоматический генератор фаззинг-оберток для библиотек

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • C++ 49.3%
  • Python 43.3%
  • Shell 5.7%
  • Other 1.7%