
Инструмент, который автоматически создаёт фаззинг-обёртки на основе библиотеки
AutoHarness — это инструмент, который автоматически генерирует для вас фаззинг-обвязки (harness). Идея возникла из актуальной проблемы фаззинга современных кодовых баз: в больших кодовых базах тысячи функций и фрагментов кода, которые могут быть встроены довольно глубоко в библиотеку. Умным фаззерам очень сложно, а иногда и невозможно достичь такого пути выполнения. Даже в крупных проектах по фаззингу, таких как oss-fuzz, всё ещё остаются части кодовой базы, не охваченные фаззингом. Поэтому данная программа пытается в некоторой степени смягчить эту проблему, а также предоставить инструмент, который исследователи безопасности могут использовать для первоначального тестирования кодовой базы. Эта программа поддерживает только кодовые базы, написанные на C и C++.
Эта программа использует llvm и clang для libfuzzer, Codeql для поиска функций и python для общего управления. Программа тестировалась на Ubuntu 20.04 с llvm 12 и python 3. Вот начальная настройка.
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
Следуйте инструкции по установке Codeql по адресу https://github.com/github/codeql. Убедитесь, что вы установили инструменты CLI и библиотеки. Для тестирования я поместил и инструменты, и библиотеки в одну папку. Наконец, клонируйте этот репозиторий или скачайте релиз. Вот вывод программы после запуска на nginx с включенным режимом множественных аргументов. Вот команда, которую я использовал.
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
Результаты:
Определённо можно повысить успех, дополнительно отлаживая компиляцию и добавляя больше заголовочных файлов и т.д. Обратите внимание, что проект nginx не содержит общих объектов (shared objects) после компиляции. Однако эта программа имеет функцию, которая может преобразовывать PIE-исполняемые файлы в общие библиотеки.
Текущий способ, реализованный в программе для фаззинга функций с несколькими аргументами, заключается в использовании fuzzing data provider. В этой интеграции есть некоторые улучшения; однако я считаю, что можно включить эту функцию в структуры данных. Проблема, с которой я столкнулся при написании этого кода, связана с Codeql и вложенными структурами. Это становится особенно сложно без написания нескольких запросов, которые различаются для каждой функции. Короче говоря, эта функция требует доработки. Я также думал о простом решении с использованием protobufs.
С помощью Codeql можно сгенерировать граф потока управления, который показывает, как инициализируются параметры в функции. Используя эту информацию, можно создать лучшую обвязку. Другой способ — найти реализации функции, существующие в библиотеке, и использовать эту информацию для обоснованного предположения о реализации функции в качестве обвязки. Текущие проблемы, с которыми я сталкиваюсь, связаны с генерацией графов потока управления с помощью Codeql.
Я могу создать простую программу, которая запускает все обвязки и выявляет любые распространённые ложные срабатывания с помощью ASAN. Также можно создать новый интерфейс, который запускает все обвязки одновременно и отображает их статистику.
Если вы найдёте какие-либо ошибки в этой программе, пожалуйста, создайте issue. Я постараюсь найти исправление. Кроме того, если у вас есть идеи о новых функциях или о том, как реализовать улучшения производительности или текущие планируемые возможности, создайте pull request или issue с тегом (contribution).
Этот инструмент генерирует некоторые ложные срабатывания. Сначала проанализируйте сбои и определите, является ли это настоящей ошибкой или просто ошибкой реализации. Также вы можете включить режим отладки, если некоторые функции не компилируются. Это поможет понять, не пропущены ли какие-то заголовочные файлы или нет ли проблем с компоновкой. Если проект, над которым вы работаете, не имеет общих библиотек, а является исполняемым файлом, убедитесь, что вы скомпилировали исполняемый файл в форме PIE, чтобы эта программа могла преобразовать его в общую библиотеку.