⚠️ 正在开发中 — 该项目正在积极开发中。核心扫描引擎已正常工作;数据库持久化、缓存和完整测试覆盖计划在后续迭代中实现。
NuReaper 是一个 .NET 8 后端 API,可自动分析 NuGet 包的安全性。您提供任何 NuGet 包的链接,系统会递归下载其整个依赖树,反编译编译后的代码,并扫描每个方法以查找恶意模式——返回详细的威胁报告。
🔍 面向非技术读者: 可以把它想象成在手机上安装一个应用。随之而来的是,数十个较小的库会自动安装。NuReaper 检查每一个库——查看实际的编译二进制代码——并检测其中是否有任何库试图连接到可疑服务器、执行隐藏代码或混淆其真实行为。
发送一个包含 NuGet 包 URL 的 HTTP 请求,NuReaper 将:
.nupkg 文件并计算其 SHA-256 哈希该引擎在 IL(中间语言)指令级别分析代码,并识别出 7 种 恶意软件特征模式:
| # | 模式 | 描述 |
|---|---|---|
| 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) |
网络: HttpClient、WebClient、DNS、TcpClient、WebSocket
执行: Process.Start、Assembly.Load、Activator.CreateInstance
低级: DllImport、VirtualAlloc、CreateThread、NtCreateThreadEx
系统: ManagementObjectSearcher(WMI)
基于字符串:拼接、字符数组、插值、StringBuilder
可疑: URL、IP 地址、.onion 地址、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 层 — 控制器、中间件、启动
├── 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/ # 在 IL 指令中定位 API 调用
│ │ ├── VariableAnalysis/# 跨 IL 跟踪变量值
│ │ └── StringAnalysis/ # 从片段重建字符串
│ ├── Parsers/ # .nuspec 文件解析
│ ├── GraphBuilders/ # 依赖图构建(BFS + 递归)
│ └── FileHelpers/ # 下载、解压、SHA-256
└── Docker/
├── Dockerfile
└── docker-compose.yml
| 领域 | 技术/模式 |
|---|---|
| 架构 | 整洁架构 |
| 层间通信 | CQRS + MediatR |
| IL 代码分析 | dnlib |
| 输入验证 | FluentValidation + MediatR 管道行为 |
| 对象映射 | AutoMapper |
| 日志记录 | Serilog(控制台 + 每日滚动文件) |
| API 文档 | Swagger / OpenAPI |
| 数据库 | Entity Framework Core + MySQL(Pomelo) |
| HTTP | IHttpClientFactory 带有连接池 |
| 容器化 | Docker + Docker Compose |
| 测试 | xUnit + Moq |
Package URL
│
▼
DependencyGraphBuilder ← 从 .nuspec 文件构建依赖图
│ (递归 + BFS,循环检测)
▼
唯一包列表
│
▼ (并行,信号量 SemaphoreSlim — CPU-1 线程)
每个包的 NetworkApiCallScan
├── DownloadPackageAsync ← 获取 .nupkg
├── CalculateSha256 ← 完整性验证
├── ExtractNupkgAsync ← 解压归档
└── GetAssemblyFiles ← 列出 .dll 文件
│
▼ (Parallel.ForEachAsync)
ScanModule(每个 .dll)
│
▼ (Parallel.ForEach — 所有类型和方法)
ScanMethod(每个方法)
│
▼ (7 种模式检测器)
Pattern1..7 → FindingSummaryDto
│
▼
CalculateThreatLevel ← 评分 0–100
│
▼
ScanPackageResultResponse
| 包 | 用途 |
|---|---|
dnlib | .NET IL 反编译与分析 |
MediatR | CQRS — 命令/查询管道 |
FluentValidation | 请求验证 |
AutoMapper | 跨层对象映射 |
Serilog | 结构化日志记录 |
Pomelo.EntityFrameworkCore.MySql | MySQL ORM |
Swashbuckle.AspNetCore | Swagger UI |
xUnit + Moq | 单元测试 |
本项目遵循 PolyForm 非商业许可证 1.0.0,禁止商业使用。 如需商业许可或咨询,请联系:[email protected]