Этот пример показывает фаззинг dll библиотек, написанных на C#.
Для фаззинга dll библиотеки необходимо создать проект-обертку.
-
В корне проекта-обертки
target/AngleSharp.Fuzz*лежит библиотекаAngleSharp.dll, которую хотим пофаззить. В файле*.csprojпрописана соответствующая зависимость для ее видимости. -
В файле
Program.csв качестве аргумента функцииRunпередается лямбда-функция (см. пример ниже), в которой вызывается функцияParse()из тестируемой библиотекиAngleSharp.
Если фаззинг происходит через stdin, то работаем со stream. Файл Program.cs выглядит так:
using System;
using AngleSharp.Parser.Html;
using AngleSharp;
using SharpFuzz;
namespace AngleSharp.Fuzz
{
public class Program
{
public static void Main(string[] args)
{
Fuzzer.OutOfProcess.Run(stream =>
{
try
{
new HtmlParser().Parse(stream);
}
catch (InvalidOperationException) { }
});
}
}
}
А если через файл, то работаем с первым аргументом командной строки - args[0]. Ниже показан файл Program.cs:
using System;
using AngleSharp.Parser.Html;
using AngleSharp;
using SharpFuzz;
namespace AngleSharp.Fuzz
{
public class Program
{
public static void Main(string[] args)
{
Fuzzer.OutOfProcess.Run(stream =>
{
try
{
var html = File.ReadAllText(args[0]);
new HtmlParser().Parse(html);
}
catch (InvalidOperationException) { }
});
}
}
}
В проект-обертку AngleSharp.Fuzz* в качестве зависимости также добавлена библиотека SharpFuzz.dll версии 1.6.2 (необходимые строки прописаны в файле *.csproj). В ней находится функция для запуска нашего проекта-обертки AngleSharp.Fuzz* и он собирается как dll файл.
В системе должен быть установлен пакет SDK и среда выполнения ASP.NET Core. Ссылка на инструкцию по их установке для всех поддерживаемых операционных систем - https://docs.microsoft.com/ru-ru/dotnet/core/install/.
Используйте предварительно собранный образ csharp-fuzz:latest, который содержит готовую среду для фаззинга с необходимыми предустановленные компонентами, .NET 6 SDK и Runtime
Фаззинг будет проводиться в докер-контейнере, собранного следующей командой:
$ ./docker/docker_build.shСоздать контейнер (укажите актуальный путь до директории crusher):
$ /docker/docker_run.sh <crusher_dir> [hasp_ip]где:
crusher_dir- директорияcrusher/(обязательная опция)hasp_ip- IP сервера лицензий (необязательная опция)
-
Произведите инструментацию библиотеки
AngleSharp.dllдля фаззинга. Соберите проект-оберткуtarget/AngleSharp.Fuzz*. Для этого запустите скрипт./instrument.sh, который принимает один аргумент - путь доdotnet. -
Находясь в данной директории, запустите скрипт
./fuzz-stdin.shдля фаззинга библиотеки через stdin и./fuzz-file.shдля фаззинга через файл; они принимают два аргумента - путь доfuzz_managerи до исполняемого файлаdotnet, установленного в Вашей системе.
Примечание:
Внутри контейнера Crusher располагается по пути /opt/crusher/, а dotnet - /usr/bin/dotnet
- Запустите в другом терминале
UIфаззера (укажите актуальные пути):
sudo /path/to/crusher/bin_x86-64/ui --outdir /path/to/outКак только будут найдены аварийные завершения, значение поля unique_crashes (в окне UI - наверху справа) станет ненулевым.
Прервать фаззинг (в первом терминале, Ctrl + С)