
⚠️ В разработке — Проект активно развивается. Основной движок сканирования работает; сохранение в базу данных, кэширование и полное покрытие тестами запланированы на следующие итерации.
NuReaper — это серверный API на .NET 8, который автоматически анализирует безопасность пакетов NuGet. Вы предоставляете ссылку на любой пакет NuGet, и система рекурсивно загружает всё дерево зависимостей, декомпилирует скомпилированный код и сканирует каждый метод на наличие вредоносных паттернов, возвращая подробный отчёт об угрозах.
🔍 Для нетехнических читателей: Представьте, что вы устанавливаете приложение на телефон. Вместе с ним автоматически устанавливаются десятки мелких библиотек. NuReaper проверяет каждую из них — анализируя фактический скомпилированный двоичный код — и определяет, пытаются ли они подключаться к подозрительным серверам, выполнять скрытый код или скрывать своё истинное поведение.
Отправьте один HTTP-запрос с URL пакета NuGet, и NuReaper:
.nupkg и вычисляет его SHA-256 хэш.Движок анализирует код на уровне инструкций IL (промежуточного языка) и распознаёт 7 паттернов, характерных для вредоносного ПО:
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
Алгоритм оценки учитывает:
POST /api/PackageScanСканирует указанный пакет NuGet вместе с полным деревом зависимостей.
Запрос:
{
"url": "https://www.nuget.org/packages/System.Net.Http/4.3.4"
}
Ответ:
{
"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": [...]
}
}
Построена на Чистой архитектуре с строгим разделением ответственности:
NuReaperBackend/
├── NuReaper.Api/ # Уровень API — контроллеры, middleware, запуск
├── NuReaper.Application/ # Уровень приложения — команды, интерфейсы, DTO, валидация
├── NuReaper.Domain/ # Ядро предметной области — сущности, перечисления, абстракции
├── NuReaper.Infrastructure/ # Реализации — сканеры, парсеры, репозитории
│ └── Repositories/
│ ├── Scanners/ # Движок анализа IL
│ │ ├── Analysis/ # ScanModule, ScanMethod, NetworkApiCallScan
│ │ ├── Detectors/ # 7 детекторов паттернов (Pattern1–Pattern7)
│ │ ├── Patterns/ # PatternRegistry (регулярные выражения: URL, IP, .onion, Base64)
│ │ ├── RiskCalculation/# Алгоритм оценки угроз
│ │ ├── Finders/ # Поиск вызовов API в инструкциях IL
│ │ ├── VariableAnalysis/# Отслеживание значений переменных в IL
│ │ └── StringAnalysis/ # Восстановление строк из фрагментов
│ ├── Parsers/ # Разбор файлов .nuspec
│ ├── GraphBuilders/ # Построение графа зависимостей (BFS + рекурсия)
│ └── FileHelpers/ # Загрузка, извлечение, SHA-256
└── Docker/
├── Dockerfile
└── docker-compose.yml
Package URL
│
▼
DependencyGraphBuilder ← строит граф зависимостей из файлов .nuspec
│ (рекурсия + BFS, обнаружение циклов)
▼
List of unique packages
│
▼ (параллельно, SemaphoreSlim — потоки CPU-1)
NetworkApiCallScan per package
├── DownloadPackageAsync ← загружает .nupkg
├── CalculateSha256 ← проверка целостности
├── ExtractNupkgAsync ← распаковывает архив
└── GetAssemblyFiles ← выводит список .dll файлов
│
▼ (Parallel.ForEachAsync)
ScanModule (per .dll)
│
▼ (Parallel.ForEach — все типы и методы)
ScanMethod (per method)
│
▼ (7 детекторов паттернов)
Pattern1..7 → FindingSummaryDto
│
▼
CalculateThreatLevel ← оценка 0–100
│
▼
ScanPackageResultResponse
Этот проект доступен по лицензии PolyForm Noncommercial License 1.0.0, коммерческое использование запрещено. Для коммерческого лицензирования или запросов обращайтесь: [email protected]
| # | Паттерн | Описание |
|---|
| 1 | Прямой вызов API | Подозрительная строка немедленно используется в сетевом вызове |
| 2 | Присвоение строки | URL присваивается переменной, затем передаётся в сетевой вызов |
| 3 | Конструирование строки | URL строится через конкатенацию ("http://" + var + "/path") — метод обфускации |
| 4 | Интерполяция строк | URL собирается через интерполяцию ($"{part1}{part2}") |
| 5 | Интерполяция только символов | URL строится посимвольно из массива символов — продвинутая обфускация |
| 6 | DefaultInterpolatedStringHandler | Низкоуровневый механизм интерполяции, используемый для скрытия строк от статического анализа |
| 7 | Прямые вызовы API | Прямые сетевые вызовы без явных строк (TcpClient.Connect, Socket.Connect, Process.Start) |
| Область | Технология / Паттерн |
|---|
| Архитектура | Clean Architecture |
| Межуровневое взаимодействие | CQRS + MediatR |
| Анализ IL-кода | dnlib |
| Проверка входных данных | FluentValidation + MediatR Pipeline Behavior |
| Отображение объектов | AutoMapper |
| Логирование | Serilog (консоль + ежедневно сменяемый файл) |
| Документация API | Swagger / OpenAPI |
| База данных | Entity Framework Core + MySQL (Pomelo) |
| HTTP | IHttpClientFactory с пулом соединений |
| Контейнеризация | Docker + Docker Compose |
| Тестирование | xUnit + Moq |
| Пакет | Назначение |
|---|
dnlib | Декомпиляция и анализ .NET IL |
MediatR | CQRS — конвейер команд/запросов |
FluentValidation | Валидация запросов |
AutoMapper | Межуровневое отображение объектов |
Serilog | Структурированное логирование |
Pomelo.EntityFrameworkCore.MySql | ORM для MySQL |
Swashbuckle.AspNetCore | Swagger UI |
xUnit + Moq | Модульное тестирование |