
⚠️ Travail en cours — Le projet est activement développé. Le moteur d'analyse principal est en cours de reconstruction
NuReaper est une API backend .NET 8 qui analyse automatiquement la sécurité des packages NuGet. Vous fournissez un lien vers n'importe quel package NuGet, et le système télécharge récursivement l'intégralité de son arbre de dépendances, décompile le code compilé et analyse chaque méthode à la recherche de motifs malveillants — en renvoyant un rapport de menace détaillé.
🔍 Pour les lecteurs non techniques : Imaginez que vous installez une application sur votre téléphone. En même temps, des dizaines de bibliothèques plus petites s'installent automatiquement. NuReaper inspecte chacune d'entre elles — en examinant le code binaire compilé réel — et détecte si l'une d'elles tente de se connecter à des serveurs suspects, d'exécuter du code caché ou d'obfusquer son véritable comportement.
Envoyez une seule requête HTTP avec l'URL d'un package NuGet, et NuReaper va :
.nupkg et calcule son hash SHA-256Le moteur analyse le code au niveau des instructions IL (Intermediate Language) et reconnaît 7 motifs caractéristiques des logiciels malveillants :
| # | Motif | Description |
|---|---|---|
| 1 | Appel API direct | Chaîne suspecte immédiatement utilisée dans un appel réseau |
| 2 | Chaîne assignée | URL assignée à une variable, puis transmise à 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 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 de bas niveau utilisé pour dissimuler des chaînes à l'analyse statique |
| 7 | Appels API nus | Appels réseau directs sans chaînes explicites (TcpClient.Connect, Socket.Connect, Process.Start) |
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/PackageScanAnalyse le package NuGet donné ainsi que l'intégralité de son arbre de dépendances.
Requête :
{
"url": "https://www.nuget.org/packages/System.Net.Http/4.3.4"
}
Réponse :
{
"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": [...]
}
}
Construite sur une Clean Architecture avec une séparation stricte des responsabilités :
NuReaperBackend/
├── NuReaper.Api/ # API layer — controllers, middleware, startup
├── NuReaper.Application/ # Application layer — commands, interfaces, DTOs, validation
├── NuReaper.Domain/ # Domain core — entities, enums, abstractions
├── NuReaper.Infrastructure/ # Implementations — scanners, parsers, repositories
│ └── Repositories/
│ ├── Scanners/ # IL analysis engine
│ │ ├── Analysis/ # ScanModule, ScanMethod, NetworkApiCallScan
│ │ ├── Detectors/ # 7 pattern detectors (Pattern1–Pattern7)
│ │ ├── Patterns/ # PatternRegistry (regex: URL, IP, .onion, Base64)
│ │ ├── RiskCalculation/# Threat scoring algorithm
│ │ ├── Finders/ # Locating API calls within IL instructions
│ │ ├── VariableAnalysis/# Tracking variable values across IL
│ │ └── StringAnalysis/ # Reconstructing strings from fragments
│ ├── Parsers/ # .nuspec file parsing
│ ├── GraphBuilders/ # Dependency graph construction (BFS + recursion)
│ └── FileHelpers/ # Download, extract, SHA-256
└── Docker/
├── Dockerfile
└── docker-compose.yml
| Domaine | Technologie / Motif |
|---|---|
| Architecture | Clean Architecture |
| Communication inter-couches | CQRS + MediatR |
| Analyse de code IL | dnlib |
| Validation des entrées | FluentValidation + MediatR Pipeline Behavior |
| Mapping d'objets | AutoMapper |
| Journalisation | Serilog (console + fichier journalier rotatif) |
| Documentation API | Swagger / OpenAPI |
| Base de données | Entity Framework Core + MySQL (Pomelo) |
| HTTP | IHttpClientFactory avec pooling de connexions |
| Conteneurisation | Docker + Docker Compose |
| Tests | xUnit + Moq |
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