@lateos/npm-scan 0.9.2 → 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.de.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
+ **Moderne Lieferkettensicherheit für das npm-Ökosystem.**
16
+ Statische + verhaltensbasierte Analyse, die erkennt, was npm audit, Snyk und Socket übersehen — obfuskierte Payloads, Credential-Stealer, bedingte Auslöser, Sandbox-Evasion und wurmartige Verbreitung.
17
+
18
+ ---
19
+
20
+ ## 📌 Das Problem
21
+
22
+ Die Welle von npm-Lieferkettenangriffen 2025–2026 hat bewiesen, dass herkömmliche Werkzeuge nicht mehr ausreichen.
23
+
24
+ Angreifer haben sich längst über einfaches Typosquatting hinausentwickelt. Sie liefern nun **obfuskierte Preinstall-Hooks**, **hinter Umgebungserkennung versteckte Credential-Stealer**, **schlafende Hintertüren mit zeitbasierter Aktivierung** und **wurmartige transitive Verbreitung**, die sich über Peer-Abhängigkeiten ausbreitet.
25
+
26
+ **npm audit** prüft bekannte CVEs. **Snyk** scannt nach Schwachstellen. **Socket** untersucht das Paketverhalten. Keines dieser Tools wurde für die Angriffsgeneration entwickelt, die 2025 auftrat — Angriffe, die harmlos aussehen, bis sie die Produktion erreichen.
27
+
28
+ **@lateos/npm-scan** wurde für diesen Moment entwickelt.
29
+
30
+ ---
31
+
32
+ ## 🔬 Warum @lateos/npm-scan?
33
+
34
+ | Fähigkeit | npm audit | Snyk | Socket | **@lateos/npm-scan** |
35
+ |---|---|---|---|---|
36
+ | Bekannte CVE-Übereinstimmung | ✅ | ✅ | ❌ | ✅ |
37
+ | Statische Analyse | ❌ | ✅ | ✅ | ✅ |
38
+ | Erkennung obfuskierter Payloads | ❌ | ❌ | ❌ | ✅ |
39
+ | Verhaltens-/heuristische Analyse | ❌ | ❌ | Teilweise | ✅ |
40
+ | Erkennung bedingter Auslöser (ATK-009) | ❌ | ❌ | ❌ | ✅ |
41
+ | Sandbox-Evasion-Erkennung (ATK-010) | ❌ | ❌ | ❌ | ✅ |
42
+ | Transitive Wurmverbreitung (ATK-011) | ❌ | ❌ | ❌ | ✅ |
43
+ | Angriffstaxonomie (ATK-Serie) | ❌ | ❌ | ❌ | ✅ |
44
+ | SBOM-Ausgabe (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
45
+ | NIST 800-161-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
46
+ | EU-CRA-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
47
+ | SIEM-Export (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
48
+ | Vollständig lokale Ausführung — keine Telemetrie | ✅ | ❌ | ❌ | ✅ |
49
+ | Policy-as-Code (YAML-Whitelists) | ❌ | ❌ | ❌ | ✅ |
50
+
51
+ > **Datenschutz an erster Stelle.** Alle Scans erfolgen auf Ihrem Rechner. Kein Code verlässt Ihre Umgebung. Keine Telemetrie. Keine Cloud-Abhängigkeit.
52
+
53
+ ---
54
+
55
+ ## ✨ Hauptfunktionen
56
+
57
+ | Symbol | Funktion | Beschreibung |
58
+ |------|---------|-------------|
59
+ | 🕵️ | **Heuristische statische Analyse** | AST-Level-Inspektion erkennt Obfuskation, eval-Ketten, Umgebungsabfragen und verdächtige Lebenszyklus-Skripte, die regex-basierten Tools entgehen |
60
+ | 🧠 | **Verhaltenserkennung** | Identifiziert bedingte Auslöser (zeitbasiert, CI-bewusst), Sandbox-Evasion und schlafende Aktivierungsmuster |
61
+ | 🧬 | **ATK-Angriffstaxonomie** | 11 klassifizierte Angriffstypen mit NIST 800-161-Zuordnungen — versioniert, dokumentiert und PR-fähig |
62
+ | 📦 | **SBOM-Generierung** | CycloneDX 1.5 und SPDX 2.3 mit eingebetteten Ergebnissen als Schwachstellen |
63
+ | 🧾 | **Compliance-Berichte** | NIST SP 800-161-Rückverfolgbarkeitsmatrix + EU Cyber Resilience Act-Zuordnung (kostenlos) |
64
+ | 🔌 | **SIEM-Export** | Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar-Formate (Premium) |
65
+ | 📜 | **Policy-as-Code** | YAML/JSON-Policy-Engine mit Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen |
66
+ | 🐳 | **Docker + GitHub Action** | Multi-Arch-Images, Ein-Befehl-Compose-Pipeline, PR-Scan-Action |
67
+ | 🛡️ | **Null Telemetrie** | Keine Daten verlassen Ihren Rechner. Keine Cloud. Keine Rückrufe. |
68
+ | 💾 | **Lokaler Scan-Verlauf** | SQLite-basierte Persistenz, keine externen Abhängigkeiten |
69
+
70
+ ---
71
+
72
+ ## ⚡ Schnellstart
73
+
74
+ ```bash
75
+ # Global installieren
76
+ npm install -g @lateos/npm-scan
77
+
78
+ # Ein einzelnes Paket scannen
79
+ npm-scan scan lodash
80
+
81
+ # Ihre Lock-Datei scannen
82
+ npm-scan scan-lockfile
83
+
84
+ # Letzte Scans anzeigen
85
+ npm-scan report
86
+ ```
87
+
88
+ **Keine Installation? Kein Problem:**
89
+
90
+ ```bash
91
+ npx @lateos/npm-scan scan commander
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 📖 Verwendungsbeispiele
97
+
98
+ ### Ein einzelnes Paket scannen
99
+
100
+ ```bash
101
+ # Standard-JSON-Ausgabe mit allen Ergebnissen
102
+ npm-scan scan axios
103
+
104
+ # SBOM zusammen mit dem Scan generieren
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
+ # Eine YAML-Policy anwenden
110
+ npm-scan scan some-package --policy .npm-scan.yml
111
+ ```
112
+
113
+ ### Eine Lock-Datei scannen
114
+
115
+ ```bash
116
+ # Die Abhängigkeiten des aktuellen Projekts scannen
117
+ npm-scan scan-lockfile
118
+
119
+ # Eine bestimmte Lock-Datei scannen
120
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
121
+ ```
122
+
123
+ ### Berichte generieren
124
+
125
+ ```bash
126
+ # Alle letzten Scans auflisten
127
+ npm-scan report
128
+
129
+ # Einen bestimmten Scan anzeigen
130
+ npm-scan report -i 42
131
+
132
+ # HTML-Bericht (kostenlos) mit vollständigen Ergebnissen + NIST-Tabelle
133
+ npm-scan report -i 42 --html
134
+
135
+ # NIST 800-161-Compliance-Tabelle ausgeben
136
+ npm-scan report -i 42 --nist
137
+
138
+ # EU-CRA-Compliance-Tabelle ausgeben
139
+ npm-scan report --cra
140
+
141
+ # Textbericht (kostenlos)
142
+ npm-scan report --text
143
+
144
+ # PDF-Bericht (Premium)
145
+ npm-scan report --pdf --license-key <key>
146
+
147
+ # SIEM-Export (Premium)
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
+ # Alle Scans in einem einzigen Bericht zusammenfassen
154
+ npm-scan report --html # alle Scans
155
+ npm-scan report --pdf # alle Scans (Premium)
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 🧬 Erkennungsfähigkeiten (ATK-Taxonomie)
161
+
162
+ | ID | Angriffsklasse | Erkennungsmethode | Schweregrad | NIST 800-161 |
163
+ |---|---|---|---|---|
164
+ | **ATK-001** | Böswillige Lebenszyklus-Skripte (`preinstall`, `postinstall`, `install`) | Statisch | 🔴 hoch | SR-3.1 |
165
+ | **ATK-002** | Obfuskierte Payload-Zustellung (hex, base64, eval-Ketten) | Statisch | 🟠 mittel | SR-4.2 |
166
+ | **ATK-003** | Credential-Diebstahl (Umgebungsvariablen, .npmrc, SSH-Schlüssel) | Statisch + Dynamisch | 🔴 hoch | SR-5.3 |
167
+ | **ATK-004** | Persistenz über Editor-/Konfigurationsverzeichnisse (.vscode, .claude, .cursor) | Statisch | 🔴 hoch | SR-6.4 |
168
+ | **ATK-005** | Netzwerk-Exfiltration (GitHub-API, DNS-Tunneling, HTTP C2) | Statisch + Dynamisch | ⚫ kritisch | SR-7.5 |
169
+ | **ATK-006** | Abhängigkeitsverwirrung / Namespace-Squatting | Statisch (Lock-Datei) | 🟠 mittel | SR-2.2 |
170
+ | **ATK-007** | Typosquatting (Edit-Distanz-Matching) | Statisch | 🟢 niedrig | SR-2.1 |
171
+ | **ATK-008** | Tarball-Manipulation (veröffentlicht ≠ Quelle) | Statisch | 🔴 hoch | SR-8.1 |
172
+ | **ATK-009** | Bedingte/schlafende Auslöser (CI-Erkennung, zeitbasiert) | Verhaltensbasiert | 🔴 hoch | SR-9.2 |
173
+ | **ATK-010** | Sandbox-Evasion / Anti-Analyse | Verhaltensbasiert | 🟠 mittel | SR-10.3 |
174
+ | **ATK-011** | Transitive Verbreitung (wurmartige laterale Ausbreitung) | Verhaltensbasiert | 🔴 hoch | SR-11.4 |
175
+
176
+ > **Wie ausweichende Angriffe erkannt werden:** ATK-009 erkennt Pakete, die `process.env.CI` prüfen, Hostnamen sondieren oder zeitbasierte Aktivierung verwenden. ATK-010 markiert `debugger`-Anweisungen, `os.hostname()`-Sonden und Umgebungs-Fingerprinting. ATK-011 verfolgt Peer-Abhängigkeitsgraphen, um wurmartige Verbreitungsmuster zu erkennen.
177
+ > Vollständige Dokumentation der Ausweichfläche und PoC-Beispiele finden Sie in [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md).
178
+
179
+ ---
180
+
181
+ ## 📊 Ausgaben und Berichte
182
+
183
+ ### Formate
184
+
185
+ | Format | Verfügbarkeit | Beschreibung |
186
+ |--------|-------------|-------------|
187
+ | JSON | ✅ Kostenlos | Strukturierte maschinenlesbare Ergebnisse |
188
+ | HTML | ✅ Kostenlos | Reichhaltiger HTML-Bericht mit NIST-Compliance-Tabelle, Schweregrad-Abzeichen, Kontrollmatrix |
189
+ | Text | ✅ Kostenlos | Sauberer, terminalfreundlicher Textbericht |
190
+ | CycloneDX SBOM | ✅ Kostenlos | Branchenstandard-SBOM mit Ergebnissen als Schwachstellen eingebettet |
191
+ | SPDX SBOM | ✅ Kostenlos | SPDX 2.3-Dokumentformat |
192
+ | NIST 800-161 | ✅ Kostenlos | Kontroll-Rückverfolgbarkeitsmatrix (SR-2.1 → SR-11.4) |
193
+ | EU CRA | ✅ Kostenlos | Zuordnung der Cyber Resilience Act-Artikel |
194
+ | PDF | 🔐 Premium | Mehrseitiges PDF mit Titelseite, Ergebnistabelle, NIST-Compliance-Matrix |
195
+ | Splunk CEF | 🔐 Premium | Common Event Format für Splunk-Erfassung |
196
+ | Elastic ECS | 🔐 Premium | Elastic Common Schema-Format |
197
+ | Microsoft Sentinel | 🔐 Premium | Sentinel-ready formatierte Ausgabe |
198
+ | IBM QRadar | 🔐 Premium | QRadar-DSM-ready-Format mit QID-Zuordnungen |
199
+
200
+ ### Beispielausgabe
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
+ ## ⚙️ Konfiguration und erweiterte Nutzung
219
+
220
+ ### Policy-as-Code
221
+
222
+ Definieren Sie Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen in einer YAML-Datei:
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
+ ### Umgebungsvariablen
246
+
247
+ | Variable | Beschreibung | Standard |
248
+ |----------|-------------|---------|
249
+ | `NPM_SCAN_LICENSE_KEY` | Premium-/Enterprise-Lizenzschlüssel | — |
250
+ | `NPM_SCAN_DATA_DIR` | Scan-Verlaufsverzeichnis | `./.npm-scan` |
251
+ | `NPM_SCAN_LOG_LEVEL` | Ausführlichkeitsgrad der Protokollierung | `info` |
252
+
253
+ ### Premium-Lizenzierung
254
+
255
+ ```bash
256
+ # Einen Entwicklerschlüssel generieren
257
+ node -e "console.log(require('@lateos/npm-scan/backend/license').generateKey('premium'))"
258
+
259
+ # Verwenden
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
+ ## 🔗 Integrationen
268
+
269
+ ### GitHub Actions CI (für dieses Repository)
270
+
271
+ Jeder Push und PR führt Tests auf Node 18, 20 und 22 aus:
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 (für nachgelagerte Benutzer)
302
+
303
+ Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
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-Eingaben
329
+
330
+ | Eingabe | Standard | Beschreibung |
331
+ |-------|---------|-------------|
332
+ | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
333
+ | `package` | — | Paketname (erforderlich bei `scan-type=package`) |
334
+ | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
335
+ | `policy-file` | — | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
336
+ | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
337
+ | `siem-format` | — | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
338
+ | `sbom-format` | — | SBOM-Ausgabe: `json`, `xml`, `spdx` |
339
+
340
+ #### Action-Ausgaben
341
+
342
+ | Ausgabe | Beschreibung |
343
+ |--------|-------------|
344
+ | `findings-count` | Anzahl der erkannten Ergebnisse |
345
+ | `scan-id` | Scan-ID für spätere Referenz in Berichten |
346
+
347
+ #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
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
+ #### Beispiel: Mit SIEM-Export scannen (Premium)
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-Pipeline
370
+
371
+ Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
372
+
373
+ ```bash
374
+ # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
375
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
376
+
377
+ # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
378
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
379
+
380
+ # SBOM als Build-Artefakt generieren
381
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
382
+
383
+ # HTML-Compliance-Bericht in CI generieren
384
+ npm-scan report --html > report.html
385
+
386
+ # Bericht als Artefakt hochladen
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
+ # Pull and run
397
+ docker pull ghcr.io/lateos/npm-scan:cli
398
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
399
+
400
+ # Vollständige Pipeline mit Compose (Redis-basierte Warteschlange)
401
+ docker compose --profile pipeline up -d
402
+
403
+ # CLI mit persistentem Speicher
404
+ docker compose --profile cli up -d
405
+ ```
406
+
407
+ Multi-Arch-Images für `linux/amd64` und `linux/arm64` verfügbar.
408
+
409
+ ### GitHub Action (für nachgelagerte Benutzer)
410
+
411
+ Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
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-Eingaben
437
+
438
+ | Eingabe | Standard | Beschreibung |
439
+ |-------|---------|-------------|
440
+ | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
441
+ | `package` | — | Paketname (erforderlich bei `scan-type=package`) |
442
+ | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
443
+ | `policy-file` | — | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
444
+ | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
445
+ | `siem-format` | — | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
446
+ | `sbom-format` | — | SBOM-Ausgabe: `json`, `xml`, `spdx` |
447
+
448
+ #### Action-Ausgaben
449
+
450
+ | Ausgabe | Beschreibung |
451
+ |--------|-------------|
452
+ | `findings-count` | Anzahl der erkannten Ergebnisse |
453
+ | `scan-id` | Scan-ID für spätere Referenz in Berichten |
454
+
455
+ #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
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
+ #### Beispiel: Mit SIEM-Export scannen (Premium)
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-Pipeline
478
+
479
+ Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
480
+
481
+ ```bash
482
+ # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
483
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
484
+
485
+ # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
486
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
487
+
488
+ # SBOM als Build-Artefakt generieren
489
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
490
+
491
+ # HTML-Compliance-Bericht in CI generieren
492
+ npm-scan report --html > report.html
493
+
494
+ # Bericht als Artefakt hochladen
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
+ # Pull and run
505
+ docker pull ghcr.io/lateos/npm-scan:cli
506
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
507
+
508
+ # Vollständige Pipeline mit Compose (Redis-basierte Warteschlange)
509
+ docker compose --profile pipeline up -d
510
+
511
+ # CLI mit persistentem Speicher
512
+ docker compose --profile cli up -d
513
+ ```
514
+
515
+ Multi-Arch-Images für `linux/amd64` und `linux/arm64` verfügbar.
516
+
517
+ ---
518
+
519
+ ## 🗺️ Roadmap und Enterprise-Funktionen
520
+
521
+ ### Kostenlose Stufe (ausgeliefert)
522
+
523
+ - Alle 11 ATK-Detektoren (statisch + verhaltensbasiert)
524
+ - SBOM-Ausgabe (CycloneDX + SPDX)
525
+ - HTML-, Text- und Compliance-Berichte (NIST + EU CRA)
526
+ - Policy-as-Code-Engine (YAML)
527
+ - Lokaler SQLite-Scan-Verlauf
528
+ - GitHub Action
529
+ - Docker-Images + Compose-Pipeline
530
+
531
+ ### Premium (🔐 Lizenzschlüssel)
532
+
533
+ - PDF-Compliance-Berichte mit NIST-Rückverfolgbarkeitsmatrix
534
+ - SIEM-Export (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
535
+ - Dynamische Sandbox (gVisor-basiert — ATK-008–010)
536
+ - Erreichbarkeitsanalyse (Call-Graph-Filterung)
537
+
538
+ ### Enterprise (🏢 benutzerdefinierte Lizenz)
539
+
540
+ - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
541
+ - REST-API + Webhooks (FastAPI)
542
+ - Team-RBAC + Audit-Logs
543
+ - Helm-Chart für Kubernetes-Bereitstellung
544
+ - PostgreSQL-Backend für gehostete/Team-Stufe
545
+ - SLA-gestützter Prioritätssupport
546
+
547
+ ---
548
+
549
+ ## 🤝 Beitragen
550
+
551
+ Wir begrüßen Beiträge — insbesondere neue Detektoren, verbesserte Ausweichresistenz und Compliance-Vorlagen.
552
+
553
+ Siehe [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) für den ATK-Governance-Prozess. Jeder neue Detektor erfordert:
554
+
555
+ 1. Ein Proof-of-Concept-Beispiel
556
+ 2. Eine Erkennungsregel mit Tests
557
+ 3. False-Positive-Analyse auf den Top-500-npm-Paketen
558
+ 4. NIST 800-161-Control-Zuordnung
559
+
560
+ ### Tests
561
+
562
+ Das Projekt verwendet den **nativen Node.js-Test-Runner** (`node:test` + `assert/strict`).
563
+
564
+ ```bash
565
+ # Alle Tests ausführen
566
+ npm test
567
+
568
+ # Tests mit Codeabdeckung ausführen
569
+ npm run test:coverage
570
+
571
+ # Tests mit ausführlicher Ausgabe ausführen
572
+ npm run test:verbose
573
+
574
+ # Lokales bösartiges/sauberes Korpus ausführen (kein Netzwerk erforderlich)
575
+ node --test test/detectors-corpus.test.js
576
+ ```
577
+
578
+ **Teststruktur:**
579
+ - `test/fixtures/mock-data.js` — gemeinsam genutzte Mock-Scans, Pakete und Code-Snippets
580
+ - `test/db.test.js` — Datenbank-CRUD (Speichern, Abfragen, Persistieren)
581
+ - `test/detectors-edge-cases.test.js` — detektorspezifische Grenztests (No-Ops, saubere Bereinigung, Schweregrad)
582
+ - `test/detectors-corpus.test.js` — 33 bösartige + 50 saubere Tarball-Integrationstests (offline)
583
+ - `test/fetch.test.js` — Tarball-Extraktion, Bereinigung temporärer Verzeichnisse
584
+ - `test/policy-edge-cases.test.js` — Grenzfälle bei Unterdrückung, Überschreibung, Ladevalidierung
585
+ - `test/report-snapshots.test.js` — HTML/Text/CRA/PDF-Format-Assertions
586
+ - `test/cli.test.js` — Commander-Integrationstests (Hilfe, Version, Scan, Bericht, Fehlerbehandlung)
587
+
588
+ ### Hilfe benötigt?
589
+
590
+ - 📖 Lesen Sie den [Projektplan](docs/project-plan.md)
591
+ - 🧬 Überprüfen Sie die [Angriffstaxonomie](docs/attack-taxonomy.md)
592
+ - 🐛 Öffnen Sie ein Issue oder PR
593
+
594
+ ---
595
+
596
+ ## 📄 Lizenz
597
+
598
+ Apache-2.0 Core + Commons Clause.
599
+ Siehe [`LICENSING.md`](LICENSING.md) für die genaue Grenze zwischen kostenlosen und Premium-Funktionen.
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
+ **Scannen Sie Ihr erstes Paket jetzt:**
616
+
617
+ ```bash
618
+ npx @lateos/npm-scan scan lodash
619
+ ```