@lateos/npm-scan 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md ADDED
@@ -0,0 +1,619 @@
1
+ # @lateos/npm-scan
2
+
3
+ [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](README.md)
4
+ [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](README.zh.md)
5
+ [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](README.ja.md)
6
+ [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](README.fr.md)
7
+ [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](README.de.md)
8
+
9
+ [![npm version](https://img.shields.io/npm/v/@lateos/npm-scan?style=flat-square)](https://www.npmjs.com/package/@lateos/npm-scan)
10
+ [![License](https://img.shields.io/badge/license-Apache%202.0%20%2B%20Commons%20Clause-blue?style=flat-square)](LICENSING.md)
11
+ [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](package.json)
12
+ [![Tests](https://img.shields.io/badge/tests-222%20passing-brightgreen?style=flat-square)](https://github.com/lateos/npm-scan)
13
+ [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos/npm-scan)
14
+
15
+ **npmエコシステムのためのモダンなサプライチェーンセキュリティ。**
16
+ 静的解析+行動分析で、npm audit、Snyk、Socketが見逃す脅威——難読化ペイロード、認証情報窃取、条件付きトリガー、サンドボックス回避、ワーム型伝播——を検出します。
17
+
18
+ ---
19
+
20
+ ## 📌 問題
21
+
22
+ 2025~2026年のnpmサプライチェーン攻撃の波は、従来のツールがもはや十分ではないことを証明しました。
23
+
24
+ 攻撃者は単純なタイポスクワッティングを超えています。今や彼らは**難読化されたプリインストールフック**、**環境検出の背後に隠れた認証情報窃取ツール**、**時間ベースのアクティベーションによる潜伏バックドア**、そしてピア依存関係を通じて拡散する**ワーム型の推移的伝播**を仕掛けています。
25
+
26
+ **npm audit**は既知のCVEをチェックします。**Snyk**は脆弱性をスキャンします。**Socket**はパッケージの動作を分析します。しかし、これらは2025年に出現した攻撃——本番環境に到達するまで無害に見える攻撃——のために設計されたものではありません。
27
+
28
+ **@lateos/npm-scan**はこの瞬間のために作られました。
29
+
30
+ ---
31
+
32
+ ## 🔬 なぜ@lateos/npm-scanなのか?
33
+
34
+ | 機能 | npm audit | Snyk | Socket | **@lateos/npm-scan** |
35
+ |---|---|---|---|---|
36
+ | 既知CVEマッチング | ✅ | ✅ | ❌ | ✅ |
37
+ | 静的解析 | ❌ | ✅ | ✅ | ✅ |
38
+ | 難読化ペイロード検出 | ❌ | ❌ | ❌ | ✅ |
39
+ | 行動/ヒューリスティック分析 | ❌ | ❌ | 部分的 | ✅ |
40
+ | 条件付きトリガー検出 (ATK-009) | ❌ | ❌ | ❌ | ✅ |
41
+ | サンドボックス回避検出 (ATK-010) | ❌ | ❌ | ❌ | ✅ |
42
+ | 推移的ワーム伝播 (ATK-011) | ❌ | ❌ | ❌ | ✅ |
43
+ | 攻撃分類 (ATKシリーズ) | ❌ | ❌ | ❌ | ✅ |
44
+ | SBOM出力 (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
45
+ | NIST 800-161コンプライアンス報告 | ❌ | ❌ | ❌ | ✅ |
46
+ | EU CRAコンプライアンス報告 | ❌ | ❌ | ❌ | ✅ |
47
+ | SIEMエクスポート (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
48
+ | 完全ローカル実行——テレメトリなし | ✅ | ❌ | ❌ | ✅ |
49
+ | ポリシー・アズ・コード (YAML許可リスト) | ❌ | ❌ | ❌ | ✅ |
50
+
51
+ > **プライバシー第一。** すべてのスキャンはお使いのマシン上で実行されます。コードが環境外に送信されることはありません。テレメトリはありません。クラウド依存もありません。
52
+
53
+ ---
54
+
55
+ ## ✨ 主要機能
56
+
57
+ | アイコン | 機能 | 説明 |
58
+ |------|---------|-------------|
59
+ | 🕵️ | **ヒューリスティック静的解析** | ASTレベルの検査で、正規表現ベースのツールでは見逃す難読化、evalチェーン、環境プロービング、疑わしいライフサイクルスクリプトを捕捉 |
60
+ | 🧠 | **行動検出** | 条件付きトリガー(時間ベース、CI認識)、サンドボックス回避、潜伏アクティベーションパターンを識別 |
61
+ | 🧬 | **ATK攻撃分類** | NIST 800-161マッピング付き11の分類攻撃タイプ——バージョン管理、文書化、PR対応 |
62
+ | 📦 | **SBOM生成** | CycloneDX 1.5およびSPDX 2.3、発見項目は脆弱性として埋め込み |
63
+ | 🧾 | **コンプライアンス報告** | NIST SP 800-161トレーサビリティマトリックス+EUサイバーレジリエンス法マッピング(無料) |
64
+ | 🔌 | **SIEMエクスポート** | Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar形式(プレミアム) |
65
+ | 📜 | **ポリシー・アズ・コード** | YAML/JSONポリシーエンジン、許可リスト、重要度上書き、抑制、失敗しきい値をサポート |
66
+ | 🐳 | **Docker + GitHub Action** | マルチアーキテクチャイメージ、ワンコマンドComposeパイプライン、PRスキャンアクション |
67
+ | 🛡️ | **ゼロテレメトリ** | データはあなたのマシンから離れません。クラウドなし。コールバックなし。 |
68
+ | 💾 | **ローカルスキャン履歴** | SQLite駆動の永続化、外部依存関係ゼロ |
69
+
70
+ ---
71
+
72
+ ## ⚡ クイックスタート
73
+
74
+ ```bash
75
+ # グローバルインストール
76
+ npm install -g @lateos/npm-scan
77
+
78
+ # 単一パッケージをスキャン
79
+ npm-scan scan lodash
80
+
81
+ # ロックファイルをスキャン
82
+ npm-scan scan-lockfile
83
+
84
+ # 最新のスキャンを表示
85
+ npm-scan report
86
+ ```
87
+
88
+ **インストール不要?問題ありません:**
89
+
90
+ ```bash
91
+ npx @lateos/npm-scan scan commander
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 📖 使用例
97
+
98
+ ### 単一パッケージのスキャン
99
+
100
+ ```bash
101
+ # デフォルトのJSON出力ですべての発見項目を表示
102
+ npm-scan scan axios
103
+
104
+ # スキャンと同時にSBOMを生成
105
+ npm-scan scan express --sbom # CycloneDX JSON
106
+ npm-scan scan express --sbom xml # CycloneDX XML
107
+ npm-scan scan express --sbom spdx # SPDX 2.3
108
+
109
+ # YAMLポリシーを適用
110
+ npm-scan scan some-package --policy .npm-scan.yml
111
+ ```
112
+
113
+ ### ロックファイルのスキャン
114
+
115
+ ```bash
116
+ # 現在のプロジェクトの依存関係をスキャン
117
+ npm-scan scan-lockfile
118
+
119
+ # 特定のロックファイルをスキャン
120
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
121
+ ```
122
+
123
+ ### レポートの生成
124
+
125
+ ```bash
126
+ # 最近のスキャンをすべて一覧表示
127
+ npm-scan report
128
+
129
+ # 特定のスキャンを表示
130
+ npm-scan report -i 42
131
+
132
+ # HTMLレポートを生成(無料)、完全な発見項目+NIST表付き
133
+ npm-scan report -i 42 --html
134
+
135
+ # NIST 800-161コンプライアンス表を印刷
136
+ npm-scan report -i 42 --nist
137
+
138
+ # EU CRAコンプライアンス表を印刷
139
+ npm-scan report --cra
140
+
141
+ # テキストレポート(無料)
142
+ npm-scan report --text
143
+
144
+ # PDFレポート(プレミアム)
145
+ npm-scan report --pdf --license-key <key>
146
+
147
+ # SIEMエクスポート(プレミアム)
148
+ npm-scan report --siem cef # Splunk CEF
149
+ npm-scan report --siem ecs # Elastic ECS
150
+ npm-scan report --siem sentinel # Microsoft Sentinel
151
+ npm-scan report --siem qradar # IBM QRadar
152
+
153
+ # すべてのスキャンを1つのレポートに統合
154
+ npm-scan report --html # すべてのスキャン
155
+ npm-scan report --pdf # すべてのスキャン(プレミアム)
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 🧬 検出機能(ATK分類)
161
+
162
+ | ID | 攻撃クラス | 検出方法 | 重要度 | NIST 800-161 |
163
+ |---|---|---|---|---|
164
+ | **ATK-001** | 悪意のあるライフサイクルスクリプト(`preinstall`、`postinstall`、`install`) | 静的 | 🔴 高 | SR-3.1 |
165
+ | **ATK-002** | 難読化ペイロード配信(hex、base64、evalチェーン) | 静的 | 🟠 中 | SR-4.2 |
166
+ | **ATK-003** | 認証情報収集(環境変数、.npmrc、SSH鍵) | 静的+動的 | 🔴 高 | SR-5.3 |
167
+ | **ATK-004** | エディター/設定ディレクトリを介した永続化(.vscode、.claude、.cursor) | 静的 | 🔴 高 | SR-6.4 |
168
+ | **ATK-005** | ネットワーク外部漏洩(GitHub API、DNSトンネリング、HTTP C2) | 静的+動的 | ⚫ クリティカル | SR-7.5 |
169
+ | **ATK-006** | 依存関係混乱/名前空間スクワッティング | 静的(ロックファイル) | 🟠 中 | SR-2.2 |
170
+ | **ATK-007** | タイポスクワッティング(編集距離マッチング) | 静的 | 🟢 低 | SR-2.1 |
171
+ | **ATK-008** | tarball改ざん(公開版≠ソース) | 静的 | 🔴 高 | SR-8.1 |
172
+ | **ATK-009** | 条件付き/潜伏トリガー(CI検出、時間ベース) | 行動 | 🔴 高 | SR-9.2 |
173
+ | **ATK-010** | サンドボックス回避/アンチ解析 | 行動 | 🟠 中 | SR-10.3 |
174
+ | **ATK-011** | 推移的伝播(ワーム型横方向拡散) | 行動 | 🔴 高 | SR-11.4 |
175
+
176
+ > **回避型攻撃の捕捉方法:** ATK-009は`process.env.CI`をチェックする、ホスト名をプローブする、または時間ベースのアクティベーションを使用するパッケージを検出します。ATK-010は`debugger`文、`os.hostname()`プローブ、環境フィンガープリンティングをフラグ付けします。ATK-011はピア依存関係グラフをトレースしてワーム型伝播パターンを検出します。
177
+ > 完全な回避面のドキュメントとPoC例については、[`docs/attack-taxonomy.md`](docs/attack-taxonomy.md)を参照してください。
178
+
179
+ ---
180
+
181
+ ## 📊 出力とレポート
182
+
183
+ ### 形式
184
+
185
+ | 形式 | 利用可能性 | 説明 |
186
+ |--------|-------------|-------------|
187
+ | JSON | ✅ 無料 | 構造化された機械可読な発見項目 |
188
+ | HTML | ✅ 無料 | NISTコンプライアンス表、重要度バッジ、コントロールマトリックス付きリッチHTMLレポート |
189
+ | テキスト | ✅ 無料 | クリーンな端末向けテキストレポート |
190
+ | CycloneDX SBOM | ✅ 無料 | 発見項目を脆弱性として埋め込んだ業界標準SBOM |
191
+ | SPDX SBOM | ✅ 無料 | SPDX 2.3文書形式 |
192
+ | NIST 800-161 | ✅ 無料 | コントロールトレーサビリティマトリックス(SR-2.1 → SR-11.4) |
193
+ | EU CRA | ✅ 無料 | サイバーレジリエンス法の条項マッピング |
194
+ | PDF | 🔐 プレミアム | タイトルページ、発見項目表、NISTコンプライアンスマトリックス付きマルチページPDF |
195
+ | Splunk CEF | 🔐 プレミアム | Splunk取り込み用共通イベント形式 |
196
+ | Elastic ECS | 🔐 プレミアム | Elastic Common Schema形式 |
197
+ | Microsoft Sentinel | 🔐 プレミアム | Sentinel対応のフォーマット済み出力 |
198
+ | IBM QRadar | 🔐 プレミアム | QIDマッピング付きQRadar DSM対応形式 |
199
+
200
+ ### 出力サンプル
201
+
202
+ ```json
203
+ {
204
+ "scanId": 1,
205
+ "findings": [
206
+ {
207
+ "id": "ATK-003",
208
+ "severity": "high",
209
+ "title": "Credential harvesting",
210
+ "evidence": "process.env.NPM_TOKEN detected in postinstall.js:17"
211
+ }
212
+ ]
213
+ }
214
+ ```
215
+
216
+ ---
217
+
218
+ ## ⚙️ 設定と高度な使い方
219
+
220
+ ### ポリシー・アズ・コード
221
+
222
+ YAMLファイルで許可リスト、重要度上書き、抑制、失敗しきい値を定義:
223
+
224
+ ```yaml
225
+ # .npm-scan.yml
226
+ allowlist:
227
+ - lodash
228
+ - chalk
229
+
230
+ severity_overrides:
231
+ - id: ATK-001
232
+ severity: medium
233
+
234
+ suppress:
235
+ - atk_id: ATK-009
236
+ - package: some-package
237
+
238
+ fail_on: high
239
+ ```
240
+
241
+ ```bash
242
+ npm-scan scan target --policy .npm-scan.yml
243
+ ```
244
+
245
+ ### 環境変数
246
+
247
+ | 変数 | 説明 | デフォルト |
248
+ |----------|-------------|---------|
249
+ | `NPM_SCAN_LICENSE_KEY` | プレミアム/エンタープライズライセンスキー | — |
250
+ | `NPM_SCAN_DATA_DIR` | スキャン履歴ディレクトリ | `./.npm-scan` |
251
+ | `NPM_SCAN_LOG_LEVEL` | ログの詳細レベル | `info` |
252
+
253
+ ### プレミアムライセンス
254
+
255
+ ```bash
256
+ # 開発用キーを生成
257
+ node -e "console.log(require('@lateos/npm-scan/backend/license').generateKey('premium'))"
258
+
259
+ # それを使用
260
+ npm-scan scan target --license-key <key>
261
+ npm-scan report --pdf --license-key <key>
262
+ npm-scan report --siem cef --license-key <key>
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 🔗 インテグレーション
268
+
269
+ ### GitHub Actions CI(このリポジトリ用)
270
+
271
+ プッシュとPRごとにNode 18、20、22でテストを実行:
272
+
273
+ ```yaml
274
+ # .github/workflows/ci.yml
275
+ name: CI
276
+ on:
277
+ push:
278
+ branches: [ main ]
279
+ pull_request:
280
+ branches: [ main ]
281
+ jobs:
282
+ test:
283
+ runs-on: ubuntu-latest
284
+ strategy:
285
+ matrix:
286
+ node-version: [18, 20, 22]
287
+ steps:
288
+ - uses: actions/checkout@v4
289
+ - uses: actions/setup-node@v4
290
+ with:
291
+ node-version: ${{ matrix.node-version }}
292
+ cache: 'npm'
293
+ - run: npm ci
294
+ - run: npm test
295
+ - run: npm run test:coverage
296
+ - run: node --test test/detectors-corpus.test.js
297
+ - run: npm run lint
298
+ - run: npm run build
299
+ ```
300
+
301
+ ### GitHub Action(ダウンストリームユーザー向け)
302
+
303
+ すべてのPRでプロジェクトの`package-lock.json`をスキャン——タイポスクワッティング、難読化ペイロード、認証情報窃取ツール、ワーム伝播を本番環境に到達する前に検出:
304
+
305
+ ```yaml
306
+ # .github/workflows/scan.yml
307
+ name: npm-scan
308
+ on:
309
+ pull_request:
310
+ paths:
311
+ - 'package-lock.json'
312
+ - '**/package.json'
313
+ jobs:
314
+ scan:
315
+ runs-on: ubuntu-latest
316
+ steps:
317
+ - uses: actions/checkout@v4
318
+ - uses: actions/setup-node@v4
319
+ with:
320
+ node-version: 20
321
+ - name: Scan lockfile
322
+ uses: lateos/npm-scan@main
323
+ with:
324
+ scan-type: lockfile
325
+ fail-on: high
326
+ ```
327
+
328
+ #### Action入力
329
+
330
+ | 入力 | デフォルト | 説明 |
331
+ |-------|---------|-------------|
332
+ | `scan-type` | `lockfile` | `lockfile`は`package-lock.json`をスキャン、`package`は特定のnpmパッケージをスキャン |
333
+ | `package` | — | パッケージ名(`scan-type=package`時に必須) |
334
+ | `fail-on` | `high` | この重要度しきい値でワークフローを失敗させる:`none`、`low`、`medium`、`high`、`critical` |
335
+ | `policy-file` | — | 許可リスト、重要度上書き、抑制用のYAML/JSONポリシーファイルへのパス |
336
+ | `license-key` | — | SIEMエクスポートとPDFレポート用のプレミアムライセンスキー |
337
+ | `siem-format` | — | SIEM出力:`cef`、`ecs`、`sentinel`、`qradar`(プレミアム) |
338
+ | `sbom-format` | — | SBOM出力:`json`、`xml`、`spdx` |
339
+
340
+ #### Action出力
341
+
342
+ | 出力 | 説明 |
343
+ |--------|-------------|
344
+ | `findings-count` | 検出された発見項目の数 |
345
+ | `scan-id` | 後でレポートで参照するためのスキャンID |
346
+
347
+ #### 例:ポリシー+SBOMで特定パッケージをスキャン
348
+
349
+ ```yaml
350
+ - uses: lateos/npm-scan@main
351
+ with:
352
+ scan-type: package
353
+ package: lodash
354
+ policy-file: .npm-scan.yml
355
+ sbom-format: spdx
356
+ fail-on: critical
357
+ ```
358
+
359
+ #### 例:SIEMエクスポートでスキャン(プレミアム)
360
+
361
+ ```yaml
362
+ - uses: lateos/npm-scan@main
363
+ with:
364
+ scan-type: lockfile
365
+ siem-format: cef
366
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
367
+ ```
368
+
369
+ ### CI/CDパイプライン
370
+
371
+ 複合アクションを使わずに既存のパイプラインに直接統合:
372
+
373
+ ```bash
374
+ # ロックファイルをスキャン、高重要度でビルドを失敗
375
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
376
+
377
+ # 特定のパッケージをスキャン、クリティカルのみで失敗
378
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
379
+
380
+ # SBOMをビルドアーティファクトとして生成
381
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
382
+
383
+ # CIでHTMLコンプライアンスレポートを生成
384
+ npm-scan report --html > report.html
385
+
386
+ # レポートをアーティファクトとしてアップロード
387
+ # uses: actions/upload-artifact@v4
388
+ # with:
389
+ # name: npm-scan-report
390
+ # path: report.html
391
+ ```
392
+
393
+ ### Docker
394
+
395
+ ```bash
396
+ # プルして実行
397
+ docker pull ghcr.io/lateos/npm-scan:cli
398
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
399
+
400
+ # Composeを使用した完全パイプライン(Redisベースのキュー)
401
+ docker compose --profile pipeline up -d
402
+
403
+ # 永続ストレージ付きCLI
404
+ docker compose --profile cli up -d
405
+ ```
406
+
407
+ `linux/amd64`および`linux/arm64`向けマルチアーキテクチャイメージを提供。
408
+
409
+ ### GitHub Action(ダウンストリームユーザー向け)
410
+
411
+ すべてのPRでプロジェクトの`package-lock.json`をスキャン——タイポスクワッティング、難読化ペイロード、認証情報窃取ツール、ワーム伝播を本番環境に到達する前に検出:
412
+
413
+ ```yaml
414
+ # .github/workflows/scan.yml
415
+ name: npm-scan
416
+ on:
417
+ pull_request:
418
+ paths:
419
+ - 'package-lock.json'
420
+ - '**/package.json'
421
+ jobs:
422
+ scan:
423
+ runs-on: ubuntu-latest
424
+ steps:
425
+ - uses: actions/checkout@v4
426
+ - uses: actions/setup-node@v4
427
+ with:
428
+ node-version: 20
429
+ - name: Scan lockfile
430
+ uses: lateos/npm-scan@main
431
+ with:
432
+ scan-type: lockfile
433
+ fail-on: high
434
+ ```
435
+
436
+ #### Action入力
437
+
438
+ | 入力 | デフォルト | 説明 |
439
+ |-------|---------|-------------|
440
+ | `scan-type` | `lockfile` | `lockfile`は`package-lock.json`をスキャン、`package`は特定のnpmパッケージをスキャン |
441
+ | `package` | — | パッケージ名(`scan-type=package`時に必須) |
442
+ | `fail-on` | `high` | この重要度しきい値でワークフローを失敗させる:`none`、`low`、`medium`、`high`、`critical` |
443
+ | `policy-file` | — | 許可リスト、重要度上書き、抑制用のYAML/JSONポリシーファイルへのパス |
444
+ | `license-key` | — | SIEMエクスポートとPDFレポート用のプレミアムライセンスキー |
445
+ | `siem-format` | — | SIEM出力:`cef`、`ecs`、`sentinel`、`qradar`(プレミアム) |
446
+ | `sbom-format` | — | SBOM出力:`json`、`xml`、`spdx` |
447
+
448
+ #### Action出力
449
+
450
+ | 出力 | 説明 |
451
+ |--------|-------------|
452
+ | `findings-count` | 検出された発見項目の数 |
453
+ | `scan-id` | 後でレポートで参照するためのスキャンID |
454
+
455
+ #### 例:ポリシー+SBOMで特定パッケージをスキャン
456
+
457
+ ```yaml
458
+ - uses: lateos/npm-scan@main
459
+ with:
460
+ scan-type: package
461
+ package: lodash
462
+ policy-file: .npm-scan.yml
463
+ sbom-format: spdx
464
+ fail-on: critical
465
+ ```
466
+
467
+ #### 例:SIEMエクスポートでスキャン(プレミアム)
468
+
469
+ ```yaml
470
+ - uses: lateos/npm-scan@main
471
+ with:
472
+ scan-type: lockfile
473
+ siem-format: cef
474
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
475
+ ```
476
+
477
+ ### CI/CDパイプライン
478
+
479
+ 複合アクションを使わずに既存のパイプラインに直接統合:
480
+
481
+ ```bash
482
+ # ロックファイルをスキャン、高重要度でビルドを失敗
483
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
484
+
485
+ # 特定のパッケージをスキャン、クリティカルのみで失敗
486
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
487
+
488
+ # SBOMをビルドアーティファクトとして生成
489
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
490
+
491
+ # CIでHTMLコンプライアンスレポートを生成
492
+ npm-scan report --html > report.html
493
+
494
+ # レポートをアーティファクトとしてアップロード
495
+ # uses: actions/upload-artifact@v4
496
+ # with:
497
+ # name: npm-scan-report
498
+ # path: report.html
499
+ ```
500
+
501
+ ### Docker
502
+
503
+ ```bash
504
+ # プルして実行
505
+ docker pull ghcr.io/lateos/npm-scan:cli
506
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
507
+
508
+ # Composeを使用した完全パイプライン(Redisベースのキュー)
509
+ docker compose --profile pipeline up -d
510
+
511
+ # 永続ストレージ付きCLI
512
+ docker compose --profile cli up -d
513
+ ```
514
+
515
+ `linux/amd64`および`linux/arm64`向けマルチアーキテクチャイメージを提供。
516
+
517
+ ---
518
+
519
+ ## 🗺️ ロードマップとエンタープライズ機能
520
+
521
+ ### 無料版(出荷済み)
522
+
523
+ - 全11ATK検出器(静的+行動)
524
+ - SBOM出力(CycloneDX + SPDX)
525
+ - HTML、テキスト、コンプライアンスレポート(NIST + EU CRA)
526
+ - ポリシー・アズ・コードエンジン(YAML)
527
+ - ローカルSQLiteスキャン履歴
528
+ - GitHub Action
529
+ - Dockerイメージ+Composeパイプライン
530
+
531
+ ### プレミアム(🔐 ライセンスキー)
532
+
533
+ - NISTトレーサビリティマトリックス付きPDFコンプライアンスレポート
534
+ - SIEMエクスポート(Splunk CEF、Elastic ECS、Microsoft Sentinel、IBM QRadar)
535
+ - 動的サンドボックス(gVisorベース — ATK-008–010)
536
+ - 到達可能性分析(コールグラフフィルタリング)
537
+
538
+ ### エンタープライズ(🏢 カスタムライセンス)
539
+
540
+ - SAML 2.0 SSO(Okta、Azure AD、OneLogin、Keycloak)
541
+ - REST API + webhooks(FastAPI)
542
+ - チームRBAC+監査ログ
543
+ - Kubernetes展開用Helmチャート
544
+ - ホスティング/チーム階層向けPostgreSQLバックエンド
545
+ - SLA保証付き優先サポート
546
+
547
+ ---
548
+
549
+ ## 🤝 コントリビューション
550
+
551
+ コントリビューションを歓迎します——特に新しい検出器、回避耐性の向上、コンプライアンステンプレートを募集しています。
552
+
553
+ ATKガバナンスプロセスについては[`docs/attack-taxonomy.md`](docs/attack-taxonomy.md)を参照してください。新しい検出器には以下が必要です:
554
+
555
+ 1. 概念実証サンプル
556
+ 2. テスト付き検出ルール
557
+ 3. トップ500 npmパッケージに対する誤検出分析
558
+ 4. NIST 800-161コントロールマッピング
559
+
560
+ ### テスト
561
+
562
+ このプロジェクトは**Node.jsネイティブテストランナー**(`node:test` + `assert/strict`)を使用しています。
563
+
564
+ ```bash
565
+ # すべてのテストを実行
566
+ npm test
567
+
568
+ # カバレッジ付きでテストを実行
569
+ npm run test:coverage
570
+
571
+ # 詳細な出力付きでテストを実行
572
+ npm run test:verbose
573
+
574
+ # ローカルの悪意/クリーンコーパスを実行(ネットワーク不要)
575
+ node --test test/detectors-corpus.test.js
576
+ ```
577
+
578
+ **テスト構造:**
579
+ - `test/fixtures/mock-data.js` — 共有モックスキャン、パッケージ、コードスニペット
580
+ - `test/db.test.js` — データベースCRUD(保存、クエリ、永続化)
581
+ - `test/detectors-edge-cases.test.js` — 検出器ごとの境界テスト(no-op、クリーンクリア、重要度)
582
+ - `test/detectors-corpus.test.js` — 33悪意+50クリーンtarball統合テスト(オフライン)
583
+ - `test/fetch.test.js` — tarball抽出、一時ディレクトリクリーンアップ
584
+ - `test/policy-edge-cases.test.js` — 抑制、上書き、ロード検証のエッジケース
585
+ - `test/report-snapshots.test.js` — HTML/テキスト/CRA/PDF形式のアサーション
586
+ - `test/cli.test.js` — commander統合テスト(ヘルプ、バージョン、スキャン、レポート、エラーハンドリング)
587
+
588
+ ### ヘルプが必要ですか?
589
+
590
+ - 📖 [プロジェクト計画](docs/project-plan.md)を読む
591
+ - 🧬 [攻撃分類](docs/attack-taxonomy.md)を確認
592
+ - 🐛 IssueまたはPRを開く
593
+
594
+ ---
595
+
596
+ ## 📄 ライセンス
597
+
598
+ Apache-2.0コア+Commons Clause。
599
+ 無料版とプレミアム版機能の正確な境界については[`LICENSING.md`](LICENSING.md)を参照してください。
600
+
601
+ ```
602
+ @lateos/npm-scan — npm supply chain security scanner
603
+ Copyright (C) 2026 Lateos
604
+
605
+ Licensed under the Apache License, Version 2.0 (the "License");
606
+ you may not use this file except in compliance with the License.
607
+
608
+ Unless required by applicable law or agreed to in writing, software
609
+ distributed under the License is distributed on an "AS IS" BASIS,
610
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
611
+ ```
612
+
613
+ ---
614
+
615
+ **最初のパッケージを今すぐスキャン:**
616
+
617
+ ```bash
618
+ npx @lateos/npm-scan scan lodash
619
+ ```