Files
UA-.NETStandard/Fuzzing/scripts/fuzz-libfuzzer.ps1
Martin Regen 7a04a4b396 Add UA Fuzzer solution for afl-fuzz and libfuzzer (#2603)
- Add a solution to provide fuzzer support for afl-fuzz and libfuzzer.
- Add fuzz targets for Binary, Json and Xml encoder and decoder fuzzing. For afl-fuzz and libfuzzer.
- Fix issues in encoders and decoders when unexpected exceptions are returned. The expectation is to return only ServiceResultException with BadDecodingError, BadEncodingError or BadEncodingLimitsExceeded.
- Add a tool to create Testcases. 
- Add a tool to playback crashes and timeouts.
- Solution is extensible with common files to discover new fuzz targets by reflection. New fuzz projects can share many files with the first project.
- Breaking change: Fix how BinaryDecoder is used: Previously, calling close on the BinaryDecoder implicitly disposed the stream. Change behavior so that `using` pattern can be applied across the board.
2024-05-02 22:29:29 +02:00

72 lines
2.0 KiB
PowerShell

param (
[Parameter(Mandatory = $true)]
[string]$libFuzzer,
[Parameter(Mandatory = $true)]
[string]$project,
[Parameter(Mandatory = $true)]
[string]$corpus,
[Parameter(Mandatory = $true)]
[string]$fuzztarget,
[string]$temp = "./libfuzz/Testcases/",
[string]$dict = $null,
[int]$timeout = 10,
[string]$command = "sharpfuzz"
)
Set-StrictMode -Version Latest
$outputDir = "bin"
if (Test-Path $outputDir) {
Remove-Item -Recurse -Force $outputDir
}
dotnet.exe publish $project -p:LibFuzzer=true -c release --force -o $outputDir
$projectName = (Get-Item $project).BaseName
$projectDll = "$projectName.dll"
$project = Join-Path $outputDir $projectDll
$exclusions = @(
"dnlib.dll",
"SharpFuzz.dll",
"SharpFuzz.Common.dll",
$projectDll
)
$fuzzingTargets = Get-ChildItem $outputDir -Filter *.dll `
| Where-Object { $_.Name -notin $exclusions } `
| Where-Object { $_.Name -notlike "System.*.dll" }
if (($fuzzingTargets | Measure-Object).Count -eq 0) {
Write-Error "No fuzzing targets found"
exit 1
}
foreach ($fuzzingTarget in $fuzzingTargets) {
Write-Output "Instrumenting $fuzzingTarget"
& $command $fuzzingTarget.FullName
if ($LastExitCode -ne 0) {
Write-Error "An error occurred while instrumenting $fuzzingTarget"
exit 1
}
}
if (Test-Path $temp) {
Remove-Item -Recurse -Force $temp
}
New-Item -ItemType Directory -Force -Path "$temp"
Copy-Item -Path "$corpus/*.*" -Destination "$temp"
Write-Output "Start $libFuzzer"
if ($dict) {
Write-Output "$libFuzzer -timeout=$timeout -dict=$dict --target_path=dotnet --target_arg=$project $fuzztarget $temp"
& $libFuzzer -timeout="$timeout" -dict="$dict" --target_path=dotnet --target_arg="$project $fuzztarget" $temp
}
else {
Write-Output "$libFuzzer -timeout=$timeout --target_path=dotnet --target_arg=$project $fuzztarget $temp"
& $libFuzzer -timeout="$timeout" --target_path=dotnet --target_arg="$project $fuzztarget" $temp
}