
Nuget スキャナー
⚠️ 作業進行中 — このプロジェクトは活発に開発されています。コアスキャンエンジンは機能しますが、データベース永続化、キャッシュ、および完全なテストカバレッジは今後のイテレーションで計画されています。
NuReaper は、NuGetパッケージのセキュリティを自動的に分析する .NET 8 バックエンドAPIです。任意のNuGetパッケージへのリンクを提供すると、システムはその依存関係ツリー全体を再帰的にダウンロードし、コンパイル済みコードを逆コンパイルして、すべてのメソッドを悪意のあるパターンでスキャンし、詳細な脅威レポートを返します。
🔍 技術に詳しくない読者向け: スマートフォンにアプリをインストールする場面を想像してください。一緒に多数の小さなライブラリが自動的にインストールされます。NuReaperはそのすべてを検査し、実際のコンパイル済みバイナリコードを調べて、そのいずれかが疑わしいサーバーに接続しようとしたり、隠しコードを実行しようとしたり、本来の動作を難読化しようとしたりしていないかを検出します。
NuGetパッケージのURLを1つのHTTPリクエストで送信すると、NuReaperは次のことを行います:
.nupkg ファイルを取得し、SHA-256ハッシュを計算しますエンジンは、IL(中間言語)命令レベルでコードを解析し、悪意のあるソフトウェアに特徴的な7つのパターンを認識します:
| # | パターン | 説明 |
|---|
| 1 | ダイレクトAPI呼び出し | 疑わしい文字列がネットワーク呼び出しで直ちに使用される |
| 2 | 文字列代入 | 変数に代入されたURLが、その後ネットワーク呼び出しに渡される |
| 3 | 文字列構築 | 連結によって構築されたURL("http://" + var + "/path")— 難読化手法 |
| 4 | 文字列補間 | 補間によって組み立てられたURL($"{part1}{part2}") |
| 5 | charのみの補間 | char配列から1文字ずつ構築されたURL — 高度な難読化 |
| 6 | DefaultInterpolatedStringHandler | 静的解析から文字列を隠すために使用される低レベルの補間メカニズム |
| 7 | ベアAPI呼び出し | 明示的な文字列を伴わない直接のネットワーク呼び出し(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
スコアリングアルゴリズムは以下を考慮します:
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 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
| 領域 | 技術 / パターン |
|---|---|
| アーキテクチャ | クリーンアーキテクチャ |
| 層間通信 | 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 ← 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
| パッケージ | 用途 |
|---|---|
dnlib | .NET ILの逆コンパイルと解析 |
MediatR | CQRS — コマンド/クエリパイプライン |
FluentValidation | リクエスト検証 |
AutoMapper | 層間オブジェクトマッピング |
Serilog | 構造化ロギング |
Pomelo.EntityFrameworkCore.MySql | MySQL ORM |
Swashbuckle.AspNetCore | Swagger UI |
xUnit + Moq | 単体テスト |
このプロジェクトは、PolyForm Noncommercial License 1.0.0 の下で提供されています。商用利用は禁止されています。商用ライセンスやお問い合わせは、[email protected] までご連絡ください。