Fuzzlyn : un fuzzer pour trouver des bugs dans le JIT de .NET
jeu, 30/08/2018 - 16:18
Fuzzlyn est un utilitaire qui intéressera ceux qui aiment pousser dans leurs derniers retranchements les outils avec lesquels ils travaillent.
Fuzzlyn est un fuzzer qui génère avec Roselyn des programmes C# aléatoires dans le but de trouver des bugs dans le compilateur JIT (Just In Time) de .NET
Le fuzzing (ou test à données aléatoire) est une technique pour tester des logiciels. L'idée est d'injecter des données aléatoires dans les entrées d'un programme. Si le programme échoue (par exemple en plantant ou en générant une erreur), alors il y a des défauts à corriger. (Wikipedia)
Dans le cas de Fuzzlyn, les données aléatoires sont donc des programmes aléatoires qui sont les entrées du programme à tester qu'est le JIT .NET.
Au fait pourquoi tester le JIT de .NET et non le compilateur Roselyn lui-même ? Parce que ce dernier fait peu d'optimisations au moment de la compilation. Il y a donc peu de chances de trouver des bugs en son sein. En revanche le compilateur JIT effectue d'importantes opérations d'optimisation, et c'est à priori là que les bugs préféreront venir se nicher. Ce genre de bugs se manifestera par un résultat du programme différent selon qu'il s'exécute en mode 'debug' (non optimisé) ou en mode 'release'.
On lance Fuzzlyn en lui demandant par exemple de générer un million de programmes (= 1 million d'entrées aléatoires pour le JIT.NET)
dotnet fuzzlyn.dll --num-programs 1000000
On fait chauffer son café et on attend que Fuzzlyn génère ce million de programmes en exécutant chacun d'eux en mode debug et release et signale les cas qui produisent une sortie différente.
Fuzzlyn est un projet open source, disponible sur GitHub.
Sur la page du projet sont présentés quelques bugs qui ont été trouvés avec Fuzzlyn. Par exemple :
// Generated by Fuzzlyn on 2018-06-03 16:17:09
// Seed: 10744458083861091494
// Reduced from 21.3 KB to 0.2 KB
// Debug: Outputs '246'
// Release: Outputs '4294967286'
public class Program
{
static sbyte s_1 = -10;
public static void Main()
{
ulong vr44 = (byte)(0U ^ s_1);
System.Console.WriteLine(vr44);
}
}
ou bien
// Generated by Fuzzlyn on 2018-06-03 16:15:22
// Seed: 10187462581749713401
// Reduced from 186.5 KB to 0.2 KB
// Debug: Runs successfully
// Release: Throws 'System.DivideByZeroException'
public class Program
{
public static void Main()
{
var vr219 = 'N' % ((35815 / M1(new ushort[]{65535})) | 1);
}
static ushort M1(ushort[] arg2)
{
return arg2[0];
}
}