Răsfoiți Sursa

Add fuzzing infra

Bond_009 4 ani în urmă
părinte
comite
f7392394fd

+ 1 - 0
.gitignore

@@ -268,6 +268,7 @@ doc/
 # Deployment artifacts
 dist
 *.exe
+*.dll
 
 # BenchmarkDotNet artifacts
 BenchmarkDotNet.Artifacts

+ 1 - 0
fuzz/.gitignore

@@ -0,0 +1 @@
+Findings

+ 18 - 0
fuzz/Emby.Server.Implementations.Fuzz/Emby.Server.Implementations.Fuzz.csproj

@@ -0,0 +1,18 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net5.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Reference Include="Emby.Server.Implementations">
+      <HintPath>Emby.Server.Implementations.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="SharpFuzz" Version="1.6.2" />
+  </ItemGroup>
+
+</Project>

+ 32 - 0
fuzz/Emby.Server.Implementations.Fuzz/Program.cs

@@ -0,0 +1,32 @@
+using System;
+using Emby.Server.Implementations.Library;
+using SharpFuzz;
+
+namespace Emby.Server.Implementations.Fuzz
+{
+    public static class Program
+    {
+        public static void Main(string[] args)
+        {
+            switch (args[0])
+            {
+                case "PathExtensions.TryReplaceSubPath": Run(PathExtensions_TryReplaceSubPath); return;
+                default: throw new ArgumentException($"Unknown fuzzing function: {args[0]}");
+            }
+        }
+
+        private static void Run(Action<string> action) => Fuzzer.OutOfProcess.Run(action);
+
+        private static void PathExtensions_TryReplaceSubPath(string data)
+        {
+            // Stupid, but it worked
+            var parts = data.Split(':');
+            if (parts.Length != 3)
+            {
+                return;
+            }
+
+            _ = PathExtensions.TryReplaceSubPath(parts[0], parts[1], parts[2], out _);
+        }
+    }
+}

+ 1 - 0
fuzz/Emby.Server.Implementations.Fuzz/Testcases/PathExtensions.TryReplaceSubPath/test1.txt

@@ -0,0 +1 @@
+/fuzz/Emby.Server.Implementations.Fuzz/Testcases/PathExtensions.TryReplaceSubPath/test1.txt/:/home/bond/dev/jellyfin/:/srv/jellyfin/

+ 11 - 0
fuzz/Emby.Server.Implementations.Fuzz/fuzz.sh

@@ -0,0 +1,11 @@
+#!/bin/sh
+
+set -e
+
+dotnet build -c Release ../../Emby.Server.Implementations/Emby.Server.Implementations.csproj --output bin
+sharpfuzz bin/Emby.Server.Implementations.dll
+cp bin/Emby.Server.Implementations.dll .
+
+dotnet build
+mkdir -p Findings
+AFL_SKIP_BIN_CHECK=1 afl-fuzz -i "Testcases/$1" -o "Findings/$1" -t 5000 -m 10240 dotnet bin/Debug/net5.0/Emby.Server.Implementations.Fuzz.dll "$1"

+ 22 - 0
fuzz/Jellyfin.Server.Fuzz/Jellyfin.Server.Fuzz.csproj

@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net5.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Reference Include="Jellyfin.Server">
+      <HintPath>jellyfin.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="../../MediaBrowser.Common/MediaBrowser.Common.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="SharpFuzz" Version="1.6.2" />
+  </ItemGroup>
+
+</Project>

+ 33 - 0
fuzz/Jellyfin.Server.Fuzz/Program.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using Jellyfin.Server.Middleware;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.Extensions.Primitives;
+using SharpFuzz;
+
+namespace Emby.Server.Implementations.Fuzz
+{
+    public static class Program
+    {
+        public static void Main(string[] args)
+        {
+            switch (args[0])
+            {
+                case "UrlDecodeQueryFeature": Run(UrlDecodeQueryFeature); return;
+                default: throw new ArgumentException($"Unknown fuzzing function: {args[0]}");
+            }
+        }
+
+        private static void Run(Action<string> action) => Fuzzer.OutOfProcess.Run(action);
+
+        private static void UrlDecodeQueryFeature(string data)
+        {
+            var dict = new Dictionary<string, StringValues>
+            {
+                { data, StringValues.Empty }
+            };
+            _ = new UrlDecodeQueryFeature(new QueryFeature(new QueryCollection(dict)));
+        }
+    }
+}

+ 1 - 0
fuzz/Jellyfin.Server.Fuzz/Testcases/UrlDecodeQueryFeature/test1.txt

@@ -0,0 +1 @@
+a%3D1%26b%3D2%26c%3D3

+ 11 - 0
fuzz/Jellyfin.Server.Fuzz/fuzz.sh

@@ -0,0 +1,11 @@
+#!/bin/sh
+
+set -e
+
+dotnet build -c Release ../../Jellyfin.Server/Jellyfin.Server.csproj --output bin
+sharpfuzz bin/jellyfin.dll
+cp bin/jellyfin.dll .
+
+dotnet build
+mkdir -p Findings
+AFL_SKIP_BIN_CHECK=1 afl-fuzz -i "Testcases/$1" -o "Findings/$1" -t 5000 -m 10240 dotnet bin/Debug/net5.0/Jellyfin.Server.Fuzz.dll "$1"