Что такое фазз-тесты?
Фаззинг может быть мощной и проверенной стратегией выявления проблем безопасности в реальном программном обеспечении. Он ответственен за подавляющее большинство ошибок удаленного выполнения кода и повышения привилегий, обнаруженных на сегодняшний день в критически важном для безопасности программном обеспечении.
Нечеткие тесты могут пригодиться при тестировании чего-то, что имеет много возможных входных данных и что сложно протестировать вручную или с помощью автоматизированных тестов.
Примеры:
- изменение размера изображения
- парсинг 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.
- Добавить зависимости
dotnet add package SharpFuzz
2. Добавьте код
Этот пример кода проверяет класс ZipArchive
на наличие проблем безопасности.
Фазз-тестирование theZipArchive
class:
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 без инструментов.
Источники
- AFL GitHub — https://github.com/google/AFL
- SharpFuzz — https://github.com/Metalnem/sharpfuzz