Что такое фазз-тесты?

Фаззинг может быть мощной и проверенной стратегией выявления проблем безопасности в реальном программном обеспечении. Он ответственен за подавляющее большинство ошибок удаленного выполнения кода и повышения привилегий, обнаруженных на сегодняшний день в критически важном для безопасности программном обеспечении.

Нечеткие тесты могут пригодиться при тестировании чего-то, что имеет много возможных входных данных и что сложно протестировать вручную или с помощью автоматизированных тестов.

Примеры:

  • изменение размера изображения
  • парсинг Excel
  • ….

Требования:

  • WSL (Windows в Linux)
  • AFL (Американская нечеткая лупа). Это настоящий фаззер.
  • SharpFuzz

Установка AFL в WSL

Откройте WSL и выполните эти команды

# Download and extract the latest afl-fuzz source package
wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
tar -xvf afl-latest.tgz

rm afl-latest.tgz
cd afl-2.52b/

# Install afl-fuzz
sudo make install
cd ..
rm -rf afl-2.52b/

Установка резкого пуха

Установите инструменты Sharp Fuzz с помощью этой команды:

dotnet tool install --global SharpFuzz.CommandLine

Написание нашего первого фазз-теста

Здесь мы используем метод SharpFuzz.Fuzzer.OutOfProcess.Run. Мы используем метод OutOfProcess для перехвата исключений, которые могут привести к сбою всего приложения, например OutOfMemoryException.

  1. Добавить зависимости
dotnet add package SharpFuzz

2. Добавьте код

Этот пример кода проверяет класс ZipArchive на наличие проблем безопасности.

Фазз-тестирование theZipArchiveclass:

using System.IO.Compression;

SharpFuzz.Fuzzer.OutOfProcess.Run(stream =>
{
    try
    {
        _ = new ZipArchive(stream);
    }
    catch (ArgumentException)
    {
    }
    catch (InvalidDataException)
    {
    }
});

Фазз-тестирование класса OpenXml `SpreadSheetDocument`:

using System.Xml;
using DocumentFormat.OpenXml.Packaging;

SharpFuzz.Fuzzer.OutOfProcess.Run(stream =>
{
    try
    {
        _ =
            SpreadsheetDocument.Open(stream, false);
    }
    catch (NotSupportedException)
    {
    }
    catch (ArgumentException)
    {
    }
    catch (InvalidDataException)
    {

    }
    catch (InvalidOperationException)
    {
    }
    catch (OpenXmlPackageException)
    {
    }
    catch (XmlException)
    {
    }
});

Добавьте случаи перехвата для исключений, которые вы обычно ожидаете. Это поглотит эти исключения.

Убедитесь, что папка и файлы «TestCases» также находятся в выходном каталоге.

Создание тестовых случаев

Добавьте примеры допустимых файлов в папку «TestCases». Например, если вы хотите протестировать библиотеку изменения размера изображений, которая изменяет размер GIF-файлов. Добавьте небольшую гифку в папку «TestCases». В приведенном выше примере кода мы можем создать небольшой zip-архив для использования в качестве тестового примера.

Запустите тесты

Создайте или опубликуйте проект и перейдите в выходную папку.

Включите инструментирование выходной dll с помощью этой команды. Это необходимо для работы фаззера.

Предотвратите пометку исполняемого файла dotnet как неинструментированного.

export AFL_SKIP_BIN_CHECK=1

Включить инструменты

sharpfuzz myddl.ddl

Запустите AFL в WSL, чтобы начать тестирование.

afl-fuzz -i TestCases -o Findings dotnet myddl.dll

Найденные файлы, вызывающие непредвиденные исключения, находятся в папке с результатами, а затем переходят в папку «сбои» или «зависания».

Скорость также можно улучшить, используя минимизированную версию AFL.

afl-tmin -i TestCases -o minimized_result dotnet myddl.dll

Использование словарей

Скорость фаззинга можно улучшить, используя словарь. Словари ограничивают количество возможных попыток фаззинга.

Используйте параметр -x, чтобы указать путь к словарю. Путь установки по умолчанию для словарей afl-fuzz — /usr/local/share/afl/dictionaries/.

Эти словари установлены по умолчанию:

  • gif.dict
  • jpeg.dict
  • json.dict
  • png.dict
  • sql.dict
  • вебп.дикт
  • html_tags.dict
  • js.dict
  • pdf.dict
  • tiff.dict
  • xml.dict

Пример команды

afl-fuzz -x /usr/local/share/afl/dictionaries/gif.dict -i TestCases -o Findings dotnet myddl.dll

Поиск неисправностей

  • Вышел таймаут или вы хотите фаззить медленное приложение. Добавьте параметр «-t», чтобы установить таймаут в миллисекундах. Пример -т 5000.
  • При запуске afl-fuzz возникает исключение тайм-аута памяти. Добавьте параметр -m, чтобы установить максимальный объем памяти в мегабайтах.
  • Используйте параметр -n, чтобы запустить afl-fuzz без инструментов.

Источники