
⚠️ Lavori in corso — Il progetto è in fase di sviluppo attivo. Il motore di scansione principale è funzionante; persistenza del database, caching e copertura completa dei test sono pianificati per le prossime iterazioni.
NuReaper è un'API backend .NET 8 che analizza automaticamente la sicurezza dei pacchetti NuGet. Fornisci un link a qualsiasi pacchetto NuGet e il sistema scarica ricorsivamente l'intero albero delle dipendenze, decompila il codice compilato e scansiona ogni metodo alla ricerca di pattern dannosi — restituendo un rapporto dettagliato sulle minacce.
🔍 Per i lettori non tecnici: Immagina di installare un'app sul telefono. Insieme ad essa, vengono installate automaticamente decine di librerie più piccole. NuReaper ispeziona ognuna di esse — guardando il codice binario compilato effettivo — e rileva se qualcuna cerca di connettersi a server sospetti, eseguire codice nascosto o offuscare il proprio comportamento reale.
Invia una singola richiesta HTTP con l'URL di un pacchetto NuGet e NuReaper:
.nupkg e calcola il suo hash SHA-256Il motore analizza il codice a livello di istruzioni IL (Intermediate Language) e riconosce 7 pattern caratteristici di software dannoso:
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'algoritmo di punteggio tiene conto di:
POST /api/PackageScanScansiona il pacchetto NuGet fornito insieme al suo intero albero delle dipendenze.
Richiesta:
{
"url": "https://www.nuget.org/packages/System.Net.Http/4.3.4"
}
Risposta:
{
"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": [...]
}
}
Costruita su Clean Architecture con una rigida separazione delle responsabilità:
NuReaperBackend/
├── NuReaper.Api/ # Livello API — controller, middleware, avvio
├── NuReaper.Application/ # Livello applicativo — comandi, interfacce, DTO, validazione
├── NuReaper.Domain/ # Core del dominio — entità, enumerazioni, astrazioni
├── NuReaper.Infrastructure/ # Implementazioni — scanner, parser, repository
│ └── Repositories/
│ ├── Scanners/ # Motore di analisi IL
│ │ ├── Analysis/ # ScanModule, ScanMethod, NetworkApiCallScan
│ │ ├── Detectors/ # 7 rilevatori di pattern (Pattern1–Pattern7)
│ │ ├── Patterns/ # PatternRegistry (regex: URL, IP, .onion, Base64)
│ │ ├── RiskCalculation/# Algoritmo di punteggio minaccia
│ │ ├── Finders/ # Localizzazione chiamate API nelle istruzioni IL
│ │ ├── VariableAnalysis/# Tracciamento valori variabili attraverso IL
│ │ └── StringAnalysis/ # Ricostruzione stringhe da frammenti
│ ├── Parsers/ # Analisi file .nuspec
│ ├── GraphBuilders/ # Costruzione grafo dipendenze (BFS + ricorsione)
│ └── FileHelpers/ # Download, estrazione, SHA-256
└── Docker/
├── Dockerfile
└── docker-compose.yml
Package URL
│
▼
DependencyGraphBuilder ← costruisce il grafo delle dipendenze dai file .nuspec
│ (ricorsione + BFS, rilevamento cicli)
▼
Lista di pacchetti univoci
│
▼ (parallelo, SemaphoreSlim — thread CPU-1)
NetworkApiCallScan per pacchetto
├── DownloadPackageAsync ← recupera il .nupkg
├── CalculateSha256 ← verifica integrità
├── ExtractNupkgAsync ← estrae l'archivio
└── GetAssemblyFiles ← elenca i file .dll
│
▼ (Parallel.ForEachAsync)
ScanModule (per .dll)
│
▼ (Parallel.ForEach — tutti i tipi e metodi)
ScanMethod (per metodo)
│
▼ (7 rilevatori di pattern)
Pattern1..7 → FindingSummaryDto
│
▼
CalculateThreatLevel ← punteggio 0–100
│
▼
ScanPackageResultResponse
Questo progetto è disponibile sotto la licenza PolyForm Noncommercial 1.0.0, l'uso commerciale è vietato. Per licenze commerciali o richieste, contatta: [email protected]
| # | Pattern | Descrizione |
|---|
| 1 | Chiamata API Diretta | Stringa sospetta utilizzata immediatamente in una chiamata di rete |
| 2 | Stringa Assegnata | URL assegnato a una variabile, poi passato a una chiamata di rete |
| 3 | Costruzione di Stringhe | URL costruito per concatenazione ("http://" + var + "/path") — tecnica di offuscamento |
| 4 | Interpolazione di Stringhe | URL assemblato tramite interpolazione ($"{part1}{part2}") |
| 5 | Interpolazione Solo Caratteri | URL costruito carattere per carattere da un array di char — offuscamento avanzato |
| 6 | DefaultInterpolatedStringHandler | Meccanismo di interpolazione di basso livello utilizzato per nascondere stringhe dall'analisi statica |
| 7 | Chiamate API Nude | Chiamate di rete dirette senza stringhe esplicite (TcpClient.Connect, Socket.Connect, Process.Start) |
| Area | Tecnologia / Pattern |
|---|
| Architettura | Clean Architecture |
| Comunicazione tra livelli | CQRS + MediatR |
| Analisi codice IL | dnlib |
| Validazione input | FluentValidation + MediatR Pipeline Behavior |
| Mapping oggetti | AutoMapper |
| Registrazione | Serilog (console + file rolling giornaliero) |
| Documentazione API | Swagger / OpenAPI |
| Database | Entity Framework Core + MySQL (Pomelo) |
| HTTP | IHttpClientFactory con connection pooling |
| Containerizzazione | Docker + Docker Compose |
| Test | xUnit + Moq |
| Pacchetto | Scopo |
|---|
dnlib | Decompilazione e analisi IL .NET |
MediatR | CQRS — pipeline comandi/query |
FluentValidation | Validazione richieste |
AutoMapper | Mapping oggetti tra livelli |
Serilog | Registrazione strutturata |
Pomelo.EntityFrameworkCore.MySql | ORM MySQL |
Swashbuckle.AspNetCore | Interfaccia Swagger |
xUnit + Moq | Test unitari |