
⚠️ Travail en cours — Le projet est activement développé. Le moteur de scan principal est fonctionnel ; la persistance en base de données, le cache et la couverture complète des tests sont prévus pour les prochaines itérations.
NuReaper est une API backend .NET 8 qui analyse automatiquement la sécurité des paquets NuGet. Vous fournissez un lien vers un paquet NuGet, et le système télécharge récursivement tout son arbre de dépendances, décompile le code compilé et analyse chaque méthode pour détecter des motifs malveillants — renvoyant un rapport de menaces détaillé.
🔍 Pour les lecteurs non techniques : Imaginez que vous installez une application sur votre téléphone. Avec elle, des dizaines de petites bibliothèques sont installées automatiquement. NuReaper inspecte chacune d'entre elles — en regardant le code binaire compilé réel — et détecte si l'une d'elles essaie de se connecter à des serveurs suspects, d'exécuter du code caché ou d'obscurcir son véritable comportement.
Envoyez une seule requête HTTP avec une URL de paquet NuGet, et NuReaper va :
.nupkg et calcule son hachage SHA-256Le moteur analyse le code au niveau des instructions IL (Intermediate Language) et reconnaît 7 motifs caractéristiques des logiciels malveillants :
Network: HttpClient, WebClient, DNS, TcpClient, WebSocket
Execution: Process.Start, Assembly.Load, Activator.CreateInstance
Low-level: DllImport, VirtualAlloc, CreateThread, NtCreateThreadEx
System: ManagementObjectSearcher (WMI)
String-based: Concatenation, CharArray, Interpolation, StringBuilder
Suspicious: URL, IP address, .onion address, Base64
L'algorithme de notation prend en compte :
POST /api/PackageScanScanne le paquet NuGet donné ainsi que son arbre de dépendances complet.
Request:
{
"url": "https://www.nuget.org/packages/System.Net.Http/4.3.4"
}
Response:
{
"rootPackageName": "System.Net.Http",
"rootPackageVersion": "4.3.4",
"totalPackages": 12,
"totalFindingsFromAllPackages": 5,
"threatLevelAllPackages": 47.5,
"scannedTimeAllPackages": "2026-03-25T12:00:00Z",
"packages": [
{
"packageName": "System.Net.Http",
"version": "4.3.4",
"sha256Hash": "abc123...",
"threatLevel": 35.0,
"totalFindings": 3,
"findings": [
{
"type": "HttpClientCall",
"confidenceScore": 95.0,
"dangerLevel": 60.0,
"evidence": "http://example.com/payload",
"location": "MyClass::SendData",
"hopDepth": 0,
"flowTrace": "[Pattern1] Direct API call using string..."
}
]
}
],
"dependencyGraph": {
"rootPackage": "[email protected]",
"nodes": [...],
"edges": [...],
"cycles": [...]
}
}
Construit sur une architecture propre avec une séparation stricte des préoccupations :
NuReaperBackend/
├── NuReaper.Api/ # Couche API — contrôleurs, middleware, démarrage
├── NuReaper.Application/ # Couche application — commandes, interfaces, DTOs, validation
├── NuReaper.Domain/ # Cœur du domaine — entités, énumérations, abstractions
├── NuReaper.Infrastructure/ # Implémentations — scanners, analyseurs, dépôts
│ └── Repositories/
│ ├── Scanners/ # Moteur d'analyse IL
│ │ ├── Analysis/ # ScanModule, ScanMethod, NetworkApiCallScan
│ │ ├── Detectors/ # 7 détecteurs de motifs (Pattern1–Pattern7)
│ │ ├── Patterns/ # PatternRegistry (regex: URL, IP, .onion, Base64)
│ │ ├── RiskCalculation/# Algorithme de notation de menace
│ │ ├── Finders/ # Localisation des appels API dans les instructions IL
│ │ ├── VariableAnalysis/# Suivi des valeurs de variables à travers IL
│ │ └── StringAnalysis/ # Reconstruction de chaînes à partir de fragments
│ ├── Parsers/ # Analyse de fichier .nuspec
│ ├── GraphBuilders/ # Construction du graphe de dépendances (BFS + récursion)
│ └── FileHelpers/ # Téléchargement, extraction, SHA-256
└── Docker/
├── Dockerfile
└── docker-compose.yml
Package URL
│
▼
DependencyGraphBuilder ← builds dependency graph from .nuspec files
│ (recursion + BFS, cycle detection)
▼
List of unique packages
│
▼ (parallel, SemaphoreSlim — CPU-1 threads)
NetworkApiCallScan per package
├── DownloadPackageAsync ← fetches .nupkg
├── CalculateSha256 ← integrity verification
├── ExtractNupkgAsync ← unpacks the archive
└── GetAssemblyFiles ← lists .dll files
│
▼ (Parallel.ForEachAsync)
ScanModule (per .dll)
│
▼ (Parallel.ForEach — all types and methods)
ScanMethod (per method)
│
▼ (7 pattern detectors)
Pattern1..7 → FindingSummaryDto
│
▼
CalculateThreatLevel ← score 0–100
│
▼
ScanPackageResultResponse
Ce projet est disponible sous la licence PolyForm Noncommercial 1.0.0, l'utilisation commerciale est interdite. Pour une licence commerciale ou des demandes, contactez : [email protected]
| # | Motif | Description |
|---|
| 1 | Appel API direct | Chaîne suspecte utilisée immédiatement dans un appel réseau |
| 2 | Chaîne assignée | URL assignée à une variable, puis passée à un appel réseau |
| 3 | Construction de chaîne | URL construite par concaténation ("http://" + var + "/path") — technique d'obfuscation |
| 4 | Interpolation de chaîne | URL assemblée via interpolation ($"{part1}{part2}") |
| 5 | Interpolation uniquement par caractères | URL construite caractère par caractère à partir d'un tableau de caractères — obfuscation avancée |
| 6 | DefaultInterpolatedStringHandler | Mécanisme d'interpolation bas niveau utilisé pour cacher les chaînes de l'analyse statique |
| 7 | Appels API nus | Appels réseau directs sans chaînes explicites (TcpClient.Connect, Socket.Connect, Process.Start) |
| Domaine | Technologie / Modèle |
|---|
| Architecture | Clean Architecture |
| Communication inter-couches | CQRS + MediatR |
| Analyse de code IL | dnlib |
| Validation d'entrée | FluentValidation + MediatR Pipeline Behavior |
| Mappage d'objets | AutoMapper |
| Journalisation | Serilog (console + fichier journal quotidien) |
| Documentation API | Swagger / OpenAPI |
| Base de données | Entity Framework Core + MySQL (Pomelo) |
| HTTP | IHttpClientFactory avec mise en pool de connexions |
| Conteneurisation | Docker + Docker Compose |
| Tests | xUnit + Moq |
| Paquet | Objectif |
|---|
dnlib | Décompilation et analyse IL .NET |
MediatR | CQRS — pipeline de commandes/requêtes |
FluentValidation | Validation de requêtes |
AutoMapper | Mappage d'objets inter-couches |
Serilog | Journalisation structurée |
Pomelo.EntityFrameworkCore.MySql | ORM MySQL |
Swashbuckle.AspNetCore | Interface Swagger |
xUnit + Moq | Tests unitaires |