@lateos/npm-scan 0.16.0 → 0.16.5

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.
Files changed (110) hide show
  1. package/.dockerignore +20 -20
  2. package/.husky/pre-commit +1 -1
  3. package/CHANGELOG.md +199 -199
  4. package/LICENSING.md +19 -19
  5. package/README.de.md +708 -669
  6. package/README.fr.md +707 -668
  7. package/README.ja.md +704 -665
  8. package/README.md +826 -801
  9. package/README.zh.md +708 -669
  10. package/SECURITY.md +72 -72
  11. package/backend/cra.js +68 -68
  12. package/backend/db/schema.sql +32 -32
  13. package/backend/db.js +88 -88
  14. package/backend/detectors/atk-001-lifecycle.js +17 -17
  15. package/backend/detectors/atk-002-obfusc.js +261 -261
  16. package/backend/detectors/atk-003-creds.js +13 -13
  17. package/backend/detectors/atk-004-persist.js +13 -13
  18. package/backend/detectors/atk-005-exfil.js +13 -13
  19. package/backend/detectors/atk-006-depconf.js +14 -14
  20. package/backend/detectors/atk-007-typosquat.js +34 -34
  21. package/backend/detectors/atk-008-tarball-tamper.js +91 -91
  22. package/backend/detectors/atk-009-dormant-trigger.js +62 -62
  23. package/backend/detectors/atk-010-sandbox-evasion.js +50 -50
  24. package/backend/detectors/atk-011-transitive-prop.js +76 -76
  25. package/backend/detectors/axios-poisoning/d1-version-fingerprint.js +24 -0
  26. package/backend/detectors/axios-poisoning/d2-decoy-dep.js +24 -0
  27. package/backend/detectors/axios-poisoning/d3-postinstall-rat.js +90 -0
  28. package/backend/detectors/axios-poisoning/index.js +94 -0
  29. package/backend/detectors/cve-2026-48710-badhost/codePattern.js +99 -99
  30. package/backend/detectors/cve-2026-48710-badhost/findings.js +105 -105
  31. package/backend/detectors/cve-2026-48710-badhost/index.js +15 -15
  32. package/backend/detectors/cve-2026-48710-badhost/manifest.js +305 -305
  33. package/backend/detectors/cve-2026-48710-badhost/transitive.js +189 -189
  34. package/backend/detectors/hf-impersonation/index.js +396 -396
  35. package/backend/detectors/hf-impersonation/jaro-winkler.js +44 -44
  36. package/backend/detectors/hf-impersonation/known-orgs.js +5 -5
  37. package/backend/detectors/hf-impersonation/simhash.js +46 -46
  38. package/backend/detectors/index.js +75 -38
  39. package/backend/detectors/megalodon/d1-workflow-scan.js +147 -147
  40. package/backend/detectors/megalodon/d2-credential-harvest.js +61 -61
  41. package/backend/detectors/megalodon/d3-publish-velocity.js +67 -67
  42. package/backend/detectors/megalodon/d4-publisher-drift.js +124 -124
  43. package/backend/detectors/megalodon/d5-bot-commit-identity.js +3 -3
  44. package/backend/detectors/megalodon/d6-date-anachronism.js +3 -3
  45. package/backend/detectors/megalodon/index.js +80 -80
  46. package/backend/detectors/megalodon/types.js +9 -9
  47. package/backend/detectors/mini-shai-hulud/d1-burst-publish.js +42 -42
  48. package/backend/detectors/mini-shai-hulud/d2-sibling-compromise.js +116 -116
  49. package/backend/detectors/mini-shai-hulud/d3-slsa-mismatch.js +72 -72
  50. package/backend/detectors/mini-shai-hulud/d4-maintainer-anomaly.js +45 -45
  51. package/backend/detectors/mini-shai-hulud/d5-ioc-check.js +95 -95
  52. package/backend/detectors/mini-shai-hulud/d6-token-exfil.js +38 -38
  53. package/backend/detectors/mini-shai-hulud/index.js +118 -118
  54. package/backend/detectors/mini-shai-hulud/iocs.json +79 -79
  55. package/backend/detectors/msh-supplement/d1-obfuscation.js +18 -0
  56. package/backend/detectors/msh-supplement/d2-persistence.js +47 -0
  57. package/backend/detectors/msh-supplement/d3-geo-killswitch.js +35 -0
  58. package/backend/detectors/msh-supplement/d4-c2-deaddrop.js +33 -0
  59. package/backend/detectors/msh-supplement/index.js +107 -0
  60. package/backend/detectors/tier1-binary-embed.js +219 -0
  61. package/backend/detectors/tier1-infostealer.js +280 -0
  62. package/backend/detectors/tier1-lifecycle-hook.js +176 -0
  63. package/backend/detectors/tier1-metadata-spoof.js +180 -0
  64. package/backend/detectors/tier1-typosquat.js +219 -0
  65. package/backend/detectors/typosquat-vpmdhaj/d1-maintainer.js +77 -0
  66. package/backend/detectors/typosquat-vpmdhaj/d2-preinstall-loader.js +37 -0
  67. package/backend/detectors/typosquat-vpmdhaj/d3-cred-exfil.js +66 -0
  68. package/backend/detectors/typosquat-vpmdhaj/index.js +98 -0
  69. package/backend/fetch.js +175 -175
  70. package/backend/index.js +4 -4
  71. package/backend/license.js +89 -89
  72. package/backend/lockfile.js +379 -379
  73. package/backend/pdf.js +245 -245
  74. package/backend/policy.js +193 -176
  75. package/backend/provenance.js +79 -0
  76. package/backend/report.js +254 -254
  77. package/backend/sbom.js +66 -66
  78. package/backend/siem/cef.js +32 -32
  79. package/backend/siem/ecs.js +40 -40
  80. package/backend/siem/index.js +18 -18
  81. package/backend/siem/qradar.js +56 -56
  82. package/backend/siem/sentinel.js +27 -27
  83. package/backend/vsix-scan/detectors/activation-event-risk.js +116 -116
  84. package/backend/vsix-scan/detectors/burst-publish.js +52 -52
  85. package/backend/vsix-scan/detectors/exfil-pattern.js +88 -88
  86. package/backend/vsix-scan/detectors/known-ioc.js +105 -105
  87. package/backend/vsix-scan/detectors/orphan-commit-fetch.js +69 -69
  88. package/backend/vsix-scan/detectors/publisher-anomaly.js +70 -70
  89. package/backend/vsix-scan/index.js +183 -183
  90. package/backend/vsix-scan/marketplace-client.js +145 -145
  91. package/backend/vsix-scan/vsix-iocs.json +31 -31
  92. package/cli/cli.js +458 -458
  93. package/deploy/helm/npm-scan/Chart.yaml +21 -21
  94. package/deploy/helm/npm-scan/templates/_helpers.tpl +8 -8
  95. package/deploy/helm/npm-scan/templates/api.yaml +93 -93
  96. package/deploy/helm/npm-scan/templates/ingress.yaml +27 -27
  97. package/deploy/helm/npm-scan/templates/postgresql.yaml +66 -66
  98. package/deploy/helm/npm-scan/templates/secrets.yaml +18 -18
  99. package/deploy/helm/npm-scan/templates/worker.yaml +31 -31
  100. package/deploy/helm/npm-scan/values.byoc.yaml +74 -74
  101. package/deploy/helm/npm-scan/values.yaml +102 -102
  102. package/package.json +57 -57
  103. package/scripts/download-corpus.js +30 -30
  104. package/scripts/gen-mal-corpus.js +34 -34
  105. package/scripts/generate-campaign-fixtures.js +170 -0
  106. package/src/config/top-5000.json +87 -0
  107. package/test/fixtures/lockfiles/npm-lock.json +68 -68
  108. package/test/fixtures/lockfiles/pnpm-lock.yaml +117 -117
  109. package/test/fixtures/lockfiles/yarn.lock +103 -103
  110. package/test/fixtures/mock-data.js +69 -69
package/README.de.md CHANGED
@@ -1,670 +1,709 @@
1
- # @lateos/npm-scan
2
-
3
- [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.md)
4
- [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.zh.md)
5
- [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.ja.md)
6
- [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.fr.md)
7
- [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/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-459%20passing-brightgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
13
- [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
14
- [![Docker](https://img.shields.io/badge/docker-lateos%2Fnpm--scan-2496ED?style=flat-square&logo=docker)](https://hub.docker.com/r/lateos/npm-scan)
15
- [![Sigstore](https://img.shields.io/static/v1?label=Sigstore&message=Provenance&color=green&style=flat-square&logo=sigstore)](https://github.com/lateos-ai/npm-scan/actions/workflows/publish.yml)
16
-
17
- **Moderne Lieferkettensicherheit für das npm-Ökosystem.**
18
- Statische + verhaltensbasierte Analyse, die erkennt, was npm audit, Snyk und Socket übersehen — obfuskierte Payloads, Credential-Stealer, bedingte Auslöser, Sandbox-Evasion und wurmartige Verbreitung.
19
-
20
- ---
21
-
22
- ## 📌 Das Problem
23
-
24
- Die Welle von npm-Lieferkettenangriffen 20252026 hat bewiesen, dass herkömmliche Werkzeuge nicht mehr ausreichen.
25
-
26
- 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.
27
-
28
- **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.
29
-
30
- **@lateos/npm-scan** wurde für diesen Moment entwickelt.
31
-
32
- ---
33
-
34
- ## 🔬 Warum @lateos/npm-scan?
35
-
36
- | Fähigkeit | npm audit | Snyk | Socket | **@lateos/npm-scan** |
37
- |---|---|---|---|---|
38
- | Bekannte CVE-Übereinstimmung | | | | |
39
- | Statische Analyse | ❌ | ✅ | ✅ | ✅ |
40
- | Erkennung obfuskierter Payloads | | | | |
41
- | AST-Level heuristische Analyse | ❌ | ❌ | ❌ | ✅ |
42
- | Runtime-Verhaltenssandbox | | | | |
43
- | Erkennung bedingter Auslöser (ATK-009) | ❌ | ❌ | ❌ | ✅ |
44
- | Sandbox-Evasion-Erkennung (ATK-010) | | ❌ | ❌ | ✅ |
45
- | Transitive Wurmverbreitung (ATK-011) | ❌ | ❌ | ❌ | ✅ |
46
- | Angriffstaxonomie (ATK-Serie) | ❌ | ❌ | ❌ | ✅ |
47
- | SBOM-Ausgabe (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
48
- | NIST 800-161-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
49
- | EU-CRA-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
50
- | SIEM-Export (CEF / ECS / Sentinel / QRadar) | | | | ✅ |
51
- | Vollständig lokale Ausführung — keine Telemetrie | ✅ | ❌ | ❌ | ✅ |
52
- | Policy-as-Code (YAML-Whitelists) | | | ❌ | ✅ |
53
-
54
- > **Datenschutz an erster Stelle.** Alle Scans erfolgen auf Ihrem Rechner. Kein Code verlässt Ihre Umgebung. Keine Telemetrie. Keine Cloud-Abhängigkeit.
55
-
56
- ---
57
-
58
- ## Hauptfunktionen
59
-
60
- | Symbol | Funktion | Beschreibung |
61
- |------|---------|-------------|
62
- | 🕵️ | **Heuristische statische Analyse** | AST-Level-Inspektion erkennt Obfuskation, eval-Ketten, Umgebungsabfragen und verdächtige Lebenszyklus-Skripte, die regex-basierten Tools entgehen |
63
- | 🧠 | **Verhaltenserkennung** | Identifiziert bedingte Auslöser (zeitbasiert, CI-bewusst), Sandbox-Evasion und schlafende Aktivierungsmuster |
64
- | 🧬 | **ATK-Angriffstaxonomie** | 11 klassifizierte Angriffstypen mit NIST 800-161-Zuordnungen versioniert, dokumentiert und PR-fähig |
65
- | 📦 | **SBOM-Generierung** | CycloneDX 1.5 und SPDX 2.3 mit eingebetteten Ergebnissen als Schwachstellen |
66
- | 🧾 | **Compliance-Berichte** | NIST SP 800-161-Rückverfolgbarkeitsmatrix + EU Cyber Resilience Act-Zuordnung (kostenlos) |
67
- | 🔌 | **SIEM-Export** | Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar-Formate (Premium) |
68
- | 📜 | **Policy-as-Code** | YAML/JSON-Policy-Engine mit Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen |
69
- | 🐳 | **Docker + GitHub Action** | Multi-Arch-Images, Ein-Befehl-Compose-Pipeline, PR-Scan-Action |
70
- | 🛡️ | **Null Telemetrie** | Keine Daten verlassen Ihren Rechner. Keine Cloud. Keine Rückrufe. |
71
- | 💾 | **Lokaler Scan-Verlauf** | SQLite-basierte Persistenz, keine externen Abhängigkeiten |
72
-
73
- ---
74
-
75
- ## Schnellstart
76
-
77
- ```bash
78
- # Global installieren
79
- npm install -g @lateos/npm-scan
80
-
81
- # Ein einzelnes Paket scannen
82
- npm-scan scan lodash
83
-
84
- # Ihre Lock-Datei scannen
85
- npm-scan scan-lockfile
86
-
87
- # Letzte Scans anzeigen
88
- npm-scan report
89
- ```
90
-
91
- **Keine Installation? Kein Problem:**
92
-
93
- ```bash
94
- npx @lateos/npm-scan scan commander
95
- ```
96
-
97
- ---
98
-
99
- ## 🐳 @lateos/npm-scan überall mit Docker ausführen keine Installation
100
-
101
- ```bash
102
- # Einmaligen Scan pullen und ausführen kein Node.js oder npm erforderlich
103
- docker run --rm lateos/npm-scan:cli scan lodash
104
-
105
- # Vollständige Pipeline mit persistentem Speicher und Compose
106
- docker compose --profile pipeline up -d
107
- ```
108
-
109
- Kein Node.js. Kein `npm install`. Keine globalen Pakete. Funktioniert auf jedem System mit Docker — CI-Server, Air-Gapped-Umgebungen, Kubernetes-Cluster. Multi-Arch-Images für `linux/amd64` und `linux/arm64`.
110
-
111
- ---
112
-
113
- ## 🛡️ Behörden- & SOC 2-bereit
114
-
115
- | Funktion | SOC 2-Kontrollen | NIST 800-161 | STIG/FedRAMP-Ausrichtung |
116
- |----------|-------|--------------|--------------|
117
- | Audit-Protokolle (--audit-log) | CC6.8 | AU-2 | ✓ |
118
- | FIPS-Krypto (--fips) | CC6.1 | SC-13 | ✓ |
119
- | STIG-Bericht (--stig) | CC7.3 | RA-5 | ✓ |
120
- | Offline-Cache (--cache-dir) | A1.2 | SC-8 | ✓ |
121
- | Sigstore-Herleitung | CC6.2 | SI-7 | ✓ |
122
- | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
123
-
124
- ```bash
125
- # Vollständig konformer Scan in luftdichten Umgebungen
126
- npm-scan scan-lockfile --cache-dir /offline/cache --audit-log /var/log/npm-scan.audit --fips
127
- npm-scan report --stig
128
- ```
129
-
130
- ---
131
-
132
- ## 📖 Verwendungsbeispiele
133
-
134
- ### Ein einzelnes Paket scannen
135
-
136
- ```bash
137
- # Standard-JSON-Ausgabe mit allen Ergebnissen
138
- npm-scan scan axios
139
-
140
- # SBOM zusammen mit dem Scan generieren
141
- npm-scan scan express --sbom # CycloneDX JSON
142
- npm-scan scan express --sbom xml # CycloneDX XML
143
- npm-scan scan express --sbom spdx # SPDX 2.3
144
-
145
- # Eine YAML-Policy anwenden
146
- npm-scan scan some-package --policy .npm-scan.yml
147
-
148
- # Lokales Tarball scannen (kein Registry-Abruf nötig)
149
- npm-scan scan --file path/to/malicious-package.tgz
150
- ```
151
-
152
- ### Eine Lock-Datei scannen
153
-
154
- ```bash
155
- # Die Abhängigkeiten des aktuellen Projekts scannen
156
- npm-scan scan-lockfile
157
-
158
- # Eine bestimmte Lock-Datei scannen
159
- npm-scan scan-lockfile -f ./path/to/package-lock.json
160
-
161
- # CI/CD bei hohen oder kritischen Problemen fehlschlagen (Exit-Code 1)
162
- npm-scan scan-lockfile --fail-on high
163
-
164
- # Bei allen Erkenntnissen fehlschlagen (low und höher)
165
- npm-scan scan-lockfile --fail-on low
166
-
167
- # SARIF v2.1-Ausgabe für GitHub Advanced Security / VS Code generieren
168
- npm-scan scan-lockfile --sarif results.sarif
169
-
170
- # Nur Risiko-Score ausgeben (0-10) für Dashboards/Schwellenwerte
171
- npm-scan scan-lockfile --score-only
172
- ```
173
-
174
- ### Berichte generieren
175
-
176
- ```bash
177
- # Alle letzten Scans auflisten
178
- npm-scan report
179
-
180
- # Einen bestimmten Scan anzeigen
181
- npm-scan report -i 42
182
-
183
- # HTML-Bericht (kostenlos) mit vollständigen Ergebnissen + NIST-Tabelle
184
- npm-scan report -i 42 --html
185
-
186
- # NIST 800-161-Compliance-Tabelle ausgeben
187
- npm-scan report -i 42 --nist
188
-
189
- # EU-CRA-Compliance-Tabelle ausgeben
190
- npm-scan report --cra
191
-
192
- # CSV-Export für Excel / Sheets (audit-bereit)
193
- npm-scan report --csv risks.csv
194
- npm-scan scan lodash --csv # CSV nach stdout
195
-
196
- # Textbericht (kostenlos)
197
- npm-scan report --text
198
-
199
- # PDF-Bericht (Premium)
200
- npm-scan report --pdf --license-key <key>
201
-
202
- # SIEM-Export (Premium)
203
- npm-scan report --siem cef # Splunk CEF
204
- npm-scan report --siem ecs # Elastic ECS
205
- npm-scan report --siem sentinel # Microsoft Sentinel
206
- npm-scan report --siem qradar # IBM QRadar
207
-
208
- # Alle Scans in einem einzigen Bericht zusammenfassen
209
- npm-scan report --html # alle Scans
210
- npm-scan report --pdf # alle Scans (Premium)
211
- ```
212
-
213
- ---
214
-
215
- ## 🧬 Erkennungsfähigkeiten (ATK-Taxonomie)
216
-
217
- | ID | Angriffsklasse | Erkennungsmethode | Schweregrad | NIST 800-161 |
218
- |---|---|---|---|---|
219
- | **ATK-001** | Böswillige Lebenszyklus-Skripte (`preinstall`, `postinstall`, `install`) | Statisch | 🔴 hoch | SR-3.1 |
220
- | **ATK-002** | Obfuskierte Payload-Zustellung (hex, base64, eval-Ketten) | Statisch | 🟠 mittel | SR-4.2 |
221
- | **ATK-003** | Credential-Diebstahl (Umgebungsvariablen, .npmrc, SSH-Schlüssel) | Statisch + Dynamisch | 🔴 hoch | SR-5.3 |
222
- | **ATK-004** | Persistenz über Editor-/Konfigurationsverzeichnisse (.vscode, .claude, .cursor) | Statisch | 🔴 hoch | SR-6.4 |
223
- | **ATK-005** | Netzwerk-Exfiltration (GitHub-API, DNS-Tunneling, HTTP C2) | Statisch + Dynamisch | ⚫ kritisch | SR-7.5 |
224
- | **ATK-006** | Abhängigkeitsverwirrung / Namespace-Squatting | Statisch (Lock-Datei) | 🟠 mittel | SR-2.2 |
225
- | **ATK-007** | Typosquatting (Edit-Distanz-Matching) | Statisch | 🟢 niedrig | SR-2.1 |
226
- | **ATK-008** | Tarball-Manipulation (veröffentlicht ≠ Quelle) | Statisch | 🔴 hoch | SR-8.1 |
227
- | **ATK-009** | Bedingte/schlafende Auslöser (CI-Erkennung, zeitbasiert) | Verhaltensbasiert | 🔴 hoch | SR-9.2 |
228
- | **ATK-010** | Sandbox-Evasion / Anti-Analyse | Verhaltensbasiert | 🟠 mittel | SR-10.3 |
229
- | **ATK-011** | Transitive Verbreitung (wurmartige laterale Ausbreitung) | Verhaltensbasiert | 🔴 hoch | SR-11.4 |
230
- | **CVE-2026-48710** | BadHost — Starlette Authentifizierungs-Bypass via Host-Header-Injection (CVE-2026-48710, CVSS 7.0). Python-Abhängigkeitsversionserkennung (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg), transitive Heuristik (15 bekannte Downstream-Pakete: fastapi, vllm, litellm, MCP-Server, etc.), statische Code-Pattern-Analyse für gefährliche `request.url.path`-Nutzung in Auth/Middleware-Kontexten mit `request.scope["path"]`-Unterdrückung | Statisch + Registry | 🔴 hoch / 🟠 mittel / ℹ️ info | SR-3.1, SR-5.3 |
231
- | **TRAPDOOR** | TrapDoor plattformübergreifende Angriffskampagne — Kampagnenmarker P-2024-001, trap-core.js-Payload-Fingerprint, Publisher-Blocklist asdxzxc, Gist-basierter Credential-Exfil, KI-Kontextvergiftung (Zero-Width-Unicode), Crypto/DeFi-Locknamen, Fernet+ECDH-Verschlüsselung, XOR-Key cargo-build-helper-2026, STS/GitHub-API-Validierung | Statisch + Registry | 🟠 mittel / 🔴 hoch / ⚫ kritisch | SR-3.1, SR-5.3, SR-7.5 |
232
- | **NODE_IPC_COMPROMISE** | node-ipc Supply-Chain-Kompromittierung (14. Mai 2026) — Versions-Blocklist (9.1.6/9.2.3/12.0.1) mit sicheren Pins, Tarball-SHA-256-Verifikation, CJS-Payload-IIFE-Injektion, DNS-over-nicht-Standard-Port-C2, Bootstrap-Resolver sh.azurestaticprovider.net, DNS-TXT-Exfiltrationszone bt.node.js, setImmediate()-Laufzeitauslöser, ~/nt-*/ Staging-Artefakte, unbefugter Publisher atiertant, Lockfile-Blastradius | Statisch + Registry | ⚫ kritisch | SR-3.1, SR-5.3, SR-7.5 |
233
-
234
- > **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.
235
- > Vollständige Dokumentation der Ausweichfläche und PoC-Beispiele finden Sie in [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md).
236
-
237
- ---
238
-
239
- ## 📊 Ausgaben und Berichte
240
-
241
- ### Formate
242
-
243
- | Format | Verfügbarkeit | Beschreibung |
244
- |--------|-------------|-------------|
245
- | JSON | ✅ Kostenlos | Strukturierte maschinenlesbare Ergebnisse |
246
- | HTML | ✅ Kostenlos | Reichhaltiger HTML-Bericht mit NIST-Compliance-Tabelle, Schweregrad-Abzeichen, Kontrollmatrix |
247
- | Text | ✅ Kostenlos | Sauberer, terminalfreundlicher Textbericht |
248
- | CycloneDX SBOM | ✅ Kostenlos | Branchenstandard-SBOM mit Ergebnissen als Schwachstellen eingebettet |
249
- | SPDX SBOM | ✅ Kostenlos | SPDX 2.3-Dokumentformat |
250
- | NIST 800-161 | Kostenlos | Kontroll-Rückverfolgbarkeitsmatrix (SR-2.1 SR-11.4) |
251
- | EU CRA | ✅ Kostenlos | Zuordnung der Cyber Resilience Act-Artikel |
252
- | PDF | 🔐 Premium | Mehrseitiges PDF mit Titelseite, Ergebnistabelle, NIST-Compliance-Matrix |
253
- | Splunk CEF | 🔐 Premium | Common Event Format für Splunk-Erfassung |
254
- | Elastic ECS | 🔐 Premium | Elastic Common Schema-Format |
255
- | Microsoft Sentinel | 🔐 Premium | Sentinel-ready formatierte Ausgabe |
256
- | IBM QRadar | 🔐 Premium | QRadar-DSM-ready-Format mit QID-Zuordnungen |
257
-
258
- ### Beispielausgabe
259
-
260
- ```json
261
- {
262
- "scanId": 1,
263
- "findings": [
264
- {
265
- "id": "ATK-003",
266
- "severity": "high",
267
- "title": "Credential harvesting",
268
- "evidence": "process.env.NPM_TOKEN detected in postinstall.js:17"
269
- }
270
- ]
271
- }
272
- ```
273
-
274
- ---
275
-
276
- ## ⚙️ Konfiguration und erweiterte Nutzung
277
-
278
- ### Policy-as-Code
279
-
280
- Definieren Sie Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen in einer YAML-Datei:
281
-
282
- ```yaml
283
- # .npm-scan.yml
284
- allowlist:
285
- - lodash
286
- - chalk
287
-
288
- severity_overrides:
289
- - id: ATK-001
290
- severity: medium
291
-
292
- suppress:
293
- - atk_id: ATK-009
294
- - package: some-package
295
-
296
- fail_on: high
297
- ```
298
-
299
- ```bash
300
- npm-scan scan target --policy .npm-scan.yml
301
- ```
302
-
303
- ### Umgebungsvariablen
304
-
305
- | Variable | Beschreibung | Standard |
306
- |----------|-------------|---------|
307
- | `NPM_SCAN_LICENSE_KEY` | Premium-/Enterprise-Lizenzschlüssel | — |
308
- | `NPM_SCAN_DATA_DIR` | Scan-Verlaufsverzeichnis | `./.npm-scan` |
309
- | `NPM_SCAN_LOG_LEVEL` | Ausführlichkeitsgrad der Protokollierung | `info` |
310
-
311
- ### Premium-Lizenzierung
312
-
313
- Kontaktieren Sie leo@lateos.ai, um einen Premium/Enterprise-Lizenzschlüssel zu erhalten.
314
-
315
- ```bash
316
- # Verwenden
317
- npm-scan scan target --license-key <key>
318
- npm-scan report --pdf --license-key <key>
319
- npm-scan report --siem cef --license-key <key>
320
- ```
321
-
322
- ---
323
-
324
- ## 🔗 Integrationen
325
-
326
- ### GitHub Actions CI (für dieses Repository)
327
-
328
- Jeder Push und PR führt Tests auf Node 18, 20 und 22 aus:
329
-
330
- ```yaml
331
- # .github/workflows/ci.yml
332
- name: CI
333
- on:
334
- push:
335
- branches: [ main ]
336
- pull_request:
337
- branches: [ main ]
338
- jobs:
339
- test:
340
- runs-on: ubuntu-latest
341
- strategy:
342
- matrix:
343
- node-version: [18, 20, 22]
344
- steps:
345
- - uses: actions/checkout@v4
346
- - uses: actions/setup-node@v4
347
- with:
348
- node-version: ${{ matrix.node-version }}
349
- cache: 'npm'
350
- - run: npm ci
351
- - run: npm test
352
- - run: npm run test:coverage
353
- - run: node --test test/detectors-corpus.test.js
354
- - run: npm run lint
355
- - run: npm run build
356
- ```
357
-
358
- ### GitHub Action (für nachgelagerte Benutzer)
359
-
360
- Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
361
-
362
- ```yaml
363
- # .github/workflows/scan.yml
364
- name: npm-scan
365
- on:
366
- pull_request:
367
- paths:
368
- - 'package-lock.json'
369
- - '**/package.json'
370
- jobs:
371
- scan:
372
- runs-on: ubuntu-latest
373
- steps:
374
- - uses: actions/checkout@v4
375
- - uses: actions/setup-node@v4
376
- with:
377
- node-version: 20
378
- - name: Scan lockfile
379
- uses: lateos/npm-scan@v1
380
- with:
381
- scan-type: lockfile
382
- fail-on: high
383
- ```
384
-
385
- #### Action-Eingaben
386
-
387
- | Eingabe | Standard | Beschreibung |
388
- |-------|---------|-------------|
389
- | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
390
- | `package` | | Paketname (erforderlich bei `scan-type=package`) |
391
- | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
392
- | `policy-file` | — | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
393
- | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
394
- | `siem-format` | | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
395
- | `sbom-format` | — | SBOM-Ausgabe: `json`, `xml`, `spdx` |
396
-
397
- #### Action-Ausgaben
398
-
399
- | Ausgabe | Beschreibung |
400
- |--------|-------------|
401
- | `findings-count` | Anzahl der erkannten Ergebnisse |
402
- | `scan-id` | Scan-ID für spätere Referenz in Berichten |
403
-
404
- #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
405
-
406
- ```yaml
407
- - uses: lateos/npm-scan@v1
408
- with:
409
- scan-type: package
410
- package: lodash
411
- policy-file: .npm-scan.yml
412
- sbom-format: spdx
413
- fail-on: critical
414
- ```
415
-
416
- #### Beispiel: Mit SIEM-Export scannen (Premium)
417
-
418
- ```yaml
419
- - uses: lateos/npm-scan@v1
420
- with:
421
- scan-type: lockfile
422
- siem-format: cef
423
- license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
424
- ```
425
-
426
- ### CI/CD-Pipeline
427
-
428
- Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
429
-
430
- ```bash
431
- # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
432
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
433
-
434
- # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
435
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
436
-
437
- # SBOM als Build-Artefakt generieren
438
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
439
-
440
- # HTML-Compliance-Bericht in CI generieren
441
- npm-scan report --html > report.html
442
-
443
- # Bericht als Artefakt hochladen
444
- # uses: actions/upload-artifact@v4
445
- # with:
446
- # name: npm-scan-report
447
- # path: report.html
448
- ```
449
-
450
- ### Docker
451
-
452
- Siehe den obigen [Docker-Schnellstart-Abschnitt](#-lateosnpm-scan-überall-mit-docker-ausführen--keine-installation) für Pull-Befehle, Compose-Pipeline und Multi-Arch-Images.
453
-
454
- Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
455
-
456
- ```yaml
457
- # .github/workflows/scan.yml
458
- name: npm-scan
459
- on:
460
- pull_request:
461
- paths:
462
- - 'package-lock.json'
463
- - '**/package.json'
464
- jobs:
465
- scan:
466
- runs-on: ubuntu-latest
467
- steps:
468
- - uses: actions/checkout@v4
469
- - uses: actions/setup-node@v4
470
- with:
471
- node-version: 20
472
- - name: Scan lockfile
473
- uses: lateos/npm-scan@v1
474
- with:
475
- scan-type: lockfile
476
- fail-on: high
477
- ```
478
-
479
- #### Action-Eingaben
480
-
481
- | Eingabe | Standard | Beschreibung |
482
- |-------|---------|-------------|
483
- | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
484
- | `package` | — | Paketname (erforderlich bei `scan-type=package`) |
485
- | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
486
- | `policy-file` | — | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
487
- | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
488
- | `siem-format` | | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
489
- | `sbom-format` | — | SBOM-Ausgabe: `json`, `xml`, `spdx` |
490
-
491
- #### Action-Ausgaben
492
-
493
- | Ausgabe | Beschreibung |
494
- |--------|-------------|
495
- | `findings-count` | Anzahl der erkannten Ergebnisse |
496
- | `scan-id` | Scan-ID für spätere Referenz in Berichten |
497
-
498
- #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
499
-
500
- ```yaml
501
- - uses: lateos/npm-scan@v1
502
- with:
503
- scan-type: package
504
- package: lodash
505
- policy-file: .npm-scan.yml
506
- sbom-format: spdx
507
- fail-on: critical
508
- ```
509
-
510
- #### Beispiel: Mit SIEM-Export scannen (Premium)
511
-
512
- ```yaml
513
- - uses: lateos/npm-scan@v1
514
- with:
515
- scan-type: lockfile
516
- siem-format: cef
517
- license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
518
- ```
519
-
520
- ### CI/CD-Pipeline
521
-
522
- Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
523
-
524
- ```bash
525
- # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
526
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
527
-
528
- # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
529
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
530
-
531
- # SBOM als Build-Artefakt generieren
532
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
533
-
534
- # HTML-Compliance-Bericht in CI generieren
535
- npm-scan report --html > report.html
536
-
537
- # Bericht als Artefakt hochladen
538
- # uses: actions/upload-artifact@v4
539
- # with:
540
- # name: npm-scan-report
541
- # path: report.html
542
- ```
543
-
544
- ### Docker
545
-
546
- Siehe den obigen [Docker-Schnellstart-Abschnitt](#-lateosnpm-scan-überall-mit-docker-ausführen--keine-installation) für Pull-Befehle, Compose-Pipeline und Multi-Arch-Images.
547
-
548
- ---
549
-
550
- ## 🗺️ Roadmap und Enterprise-Funktionen
551
-
552
- ### Kostenlose Stufe (ausgeliefert)
553
-
554
- - Alle 11 ATK-Detektoren (statisch + verhaltensbasiert) + **MEGALODON** + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** + **VSIX_SCAN** + **CVE-2026-48710 (BadHost)** + **TRAPDOOR** (9 Regeln) + **NODE_IPC_COMPROMISE** (11 Regeln)
555
- - SBOM-Ausgabe (CycloneDX + SPDX)
556
- - HTML-, Text- und Compliance-Berichte (NIST + EU CRA)
557
- - Policy-as-Code-Engine (YAML)
558
- - Lokaler SQLite-Scan-Verlauf
559
- - GitHub Action
560
- - Docker-Images + Compose-Pipeline
561
-
562
- ### Premium (🔐 Lizenzschlüssel)
563
-
564
- - PDF-Compliance-Berichte mit NIST-Rückverfolgbarkeitsmatrix
565
- - SIEM-Export (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
566
- - Dynamische Sandbox (gVisor-basiert — ATK-008–010)
567
- - Erreichbarkeitsanalyse (Call-Graph-Filterung)
568
-
569
- ### Enterprise (🏢 benutzerdefinierte Lizenz)
570
-
571
- - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
572
- - REST-API + Webhooks (FastAPI)
573
- - Team-RBAC + Audit-Logs
574
- - Helm-Chart für Kubernetes-Bereitstellung
575
- - PostgreSQL-Backend für gehostete/Team-Stufe
576
- - SLA-gestützter Prioritätssupport
577
-
578
- ---
579
-
580
- ## 🤝 Beitragen
581
-
582
- Wir begrüßen Beiträge insbesondere neue Detektoren, verbesserte Ausweichresistenz und Compliance-Vorlagen.
583
-
584
- Siehe [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) für den ATK-Governance-Prozess. Jeder neue Detektor erfordert:
585
-
586
- 1. Ein Proof-of-Concept-Beispiel
587
- 2. Eine Erkennungsregel mit Tests
588
- 3. False-Positive-Analyse auf den Top-500-npm-Paketen
589
- 4. NIST 800-161-Control-Zuordnung
590
-
591
- ### Tests
592
-
593
- Das Projekt verwendet den **nativen Node.js-Test-Runner** (`node:test` + `assert/strict`).
594
-
595
- ```bash
596
- # Alle Tests ausführen
597
- npm test
598
-
599
- # Tests mit Codeabdeckung ausführen
600
- npm run test:coverage
601
-
602
- # Tests mit ausführlicher Ausgabe ausführen
603
- npm run test:verbose
604
-
605
- # Lokales bösartiges/sauberes Korpus ausführen (kein Netzwerk erforderlich)
606
- node --test test/detectors-corpus.test.js
607
- ```
608
-
609
- **Teststruktur:**
610
- - `test/fixtures/mock-data.js` gemeinsam genutzte Mock-Scans, Pakete und Code-Snippets
611
- - `test/db.test.js` Datenbank-CRUD (Speichern, Abfragen, Persistieren)
612
- - `test/detectors-edge-cases.test.js` — detektorspezifische Grenztests (No-Ops, saubere Bereinigung, Schweregrad)
613
- - `test/detectors-corpus.test.js` — 33 bösartige + 50 saubere Tarball-Integrationstests (offline)
614
- - `test/fetch.test.js` — Tarball-Extraktion, Bereinigung temporärer Verzeichnisse
615
- - `test/policy-edge-cases.test.js` — Grenzfälle bei Unterdrückung, Überschreibung, Ladevalidierung
616
- - `test/report-snapshots.test.js` — HTML/Text/CRA/PDF-Format-Assertions
617
- - `test/cve-2026-48710-badhost/manifest.test.js` — 13 Python-Manifest-Parsing-Tests (requirements.txt, pyproject.toml, poetry.lock, Version-Grenzfälle)
618
- - `test/cve-2026-48710-badhost/transitive.test.js`7 transitive Abhängigkeitstests (Tier 1/2, fastapi-Version-Gating, Pin-Unterdrückung)
619
- - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 statische Code-Pattern-Tests (Auth-Kontext, INFO-Durchgriff, Scope-Unterdrückung)
620
- - `test/cve-2026-48710-badhost/integration.test.js` 4 Integrationstests (End-to-End-Composite-Findings, sauberes Projekt, keine Python-Dateien)
621
- - `test/trapdoor.test.js` — 40 TrapDoor-Kampagnenerkennungstests (D1–D9: Kampagnenmarker, Payload-Fingerprint, Publisher-Blocklist, Gist-Exfil, KI-Vergiftung, Lockname, Krypto-Primitive, XOR-Key, Credential-Validierung)
622
- - `test/node-ipc.test.js` 37 node-ipc-Kompromittierungstests (D1–D11: Versions-Blocklist, Tarball-Hash, CJS-Injektion, Payload-Hash, DNS-C2-Muster, Bootstrap-Resolver, DNS-TXT-Exfil, Laufzeitauslöser, Temp-Artefakte, unbefugter Publisher, Blastradius)
623
- - `test/cli.test.js` Commander-Integrationstests (Hilfe, Version, Scan, Bericht, Fehlerbehandlung)
624
-
625
- ### Hilfe benötigt?
626
-
627
- - 🔒 Siehe [Sicherheitsrichtlinie](SECURITY.md) für die Offenlegung von Schwachstellen
628
- - 📖 Lesen Sie den [Projektplan](docs/project-plan.md)
629
- - 🧬 Überprüfen Sie die [Angriffstaxonomie](docs/attack-taxonomy.md)
630
- - 🐛 Öffnen Sie ein Issue oder PR
631
-
632
- ---
633
-
634
- ## 📄 Lizenz
635
-
636
- Apache-2.0 Core + Commons Clause.
637
- Siehe [`LICENSING.md`](LICENSING.md) für die genaue Grenze zwischen kostenlosen und Premium-Funktionen.
638
-
639
- ---
640
-
641
- ## 👤 Über den Maintainer
642
-
643
- **Roongrunchai Chongolnee** — Ersteller und Maintainer von `@lateos/npm-scan`. Zertifizierter Sicherheitsexperte (CISSP, CEH, Cisco Security, AWS Cloud Practitioner) mit einem Jahrzehnt Erfahrung in Infrastruktur- und Anwendungssicherheit bei Philips. Ich habe dieses Tool entwickelt, um der Open-Source-Community eine praktische, detektorgesteuerte Abwehr gegen Supply-Chain-Malware zu bieten — und ich bin bestrebt, es transparent, gemeinschaftseigen und kontinuierlich verbessert zu halten.
644
-
645
- [![LinkedIn](https://img.shields.io/badge/LinkedIn-0A66C2?style=flat-square&logo=linkedin)](https://www.linkedin.com/in/roongrunchai-chong-c-ab9742108/)
646
- [![GitHub](https://img.shields.io/badge/GitHub-lateos--ai-181717?style=flat-square&logo=github)](https://github.com/lateos-ai/npm-scan)
647
-
648
- Issues, Ideen und Pull-Requests sind immer willkommen Sicherheit ist am stärksten, wenn wir zusammenarbeiten.
649
-
650
- ---
651
-
652
- ```
653
- @lateos/npm-scannpm supply chain security scanner
654
- Copyright (C) 2026 Lateos
655
-
656
- Licensed under the Apache License, Version 2.0 (the "License");
657
- you may not use this file except in compliance with the License.
658
-
659
- Unless required by applicable law or agreed to in writing, software
660
- distributed under the License is distributed on an "AS IS" BASIS,
661
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
662
- ```
663
-
664
- ---
665
-
666
- **Scannen Sie Ihr erstes Paket jetzt:**
667
-
668
- ```bash
669
- npx @lateos/npm-scan scan lodash
1
+ # @lateos/npm-scan
2
+
3
+ [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.md)
4
+ [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.zh.md)
5
+ [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.ja.md)
6
+ [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/README.fr.md)
7
+ [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](https://github.com/lateos-ai/npm-scan/blob/main/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-459%20passing-brightgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
13
+ [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos-ai/npm-scan)
14
+ [![Docker](https://img.shields.io/badge/docker-lateos%2Fnpm--scan-2496ED?style=flat-square&logo=docker)](https://hub.docker.com/r/lateos/npm-scan)
15
+ [![Sigstore](https://img.shields.io/static/v1?label=Sigstore&message=Provenance&color=green&style=flat-square&logo=sigstore)](https://github.com/lateos-ai/npm-scan/actions/workflows/publish.yml)
16
+
17
+ **Moderne Lieferkettensicherheit für das npm-Ökosystem.**
18
+ Statische + verhaltensbasierte Analyse, die erkennt, was npm audit, Snyk und Socket übersehen — obfuskierte Payloads, Credential-Stealer, bedingte Auslöser, Sandbox-Evasion und wurmartige Verbreitung.
19
+
20
+ ---
21
+
22
+ ## 📌 Das Problem
23
+
24
+ Die Welle von npm-Lieferkettenangriffen 2025-2026 hat bewiesen, dass herkömmliche Werkzeuge nicht mehr ausreichen.
25
+
26
+ 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.
27
+
28
+ Die **Megalodon-Kampagne** (2026) kompromittierte allein über 5.500 Repositorys durch gefälschte GitHub-PRs, böswillige Workflow-Injektion und Cloud-Credential-Exfiltration - alles koordiniert durch einen einzelnen Akteur, der die gesamte Kill-Chain automatisierte. **@lateos/npm-scan** erkennt Artefakte dieser Kampagne jetzt standardmäßig.
29
+
30
+ Die **Mini Shai-Hulud-Wurm-Kampagne** (Mai 2026) traf das npm-Ökosystem in drei Wellen - TanStack CI/CD-Entführung (84 Artefakte in 6 Minuten), AntV/atool-Maintainer-Kompromittierung (600+ bösartige Versionen in 300+ Paketen) und Nx Console VS-Code-Erweiterungsvergiftung (CVE-2026-48027) - alle unter Verwendung von ctf-scramble-v2-Obfuskation, dämonisierter Persistenz mit CI-Umgebungsprüfungen, geografischen Killswitches gegen sanktionierte Regionen und GitHub-C2-Dead-Drop-Kanälen zur Token-Wiederherstellung. **@lateos/npm-scan** erkennt jetzt alle 10 Mini-Shai-Hulud-Signale über zwei Detektor-Suites.
31
+
32
+ Ein wachsender Angriffsvektor ist die **HuggingFace-Organisations-Identitätsdiebstahl**.
33
+
34
+ Die **TrapDoor-Kampagne** (Mai 2026) erstreckt sich über npm, PyPI und Crates.io.
35
+
36
+ Die **node-ipc-Kompromittierung** (14. Mai 2026) nutzte eine abgelaufene Maintainer-E-Mail-Domain aus.
37
+
38
+ Die **Massen-Typosquatting-Kampagne (vpmdhaj)** (Mai 2026) bewaffnete das npm-Maintainer-Konto `vpmdhaj`, um in einem 4-Stunden-Fenster 14 Typosquatting-Pakete zu veröffentlichen - mit Preinstall-Stagern, Bun-Laufzeitmissbrauch und Cloud-Credential-Exfiltration gegen AWS/CI/CD-Umgebungen. **@lateos/npm-scan** erkennt jetzt alle 3 Typosquatting-Kampagnensignale.
39
+
40
+ Die **Axios-Registry-Vergiftungskampagne** (Mai 2026) kompromittierte die npm-Registry-Metadaten des Axios-Pakets, um `axios@1.14.1` und `axios@0.30.4` mit injizierten Abhängigkeiten zu veröffentlichen, die plattformübergreifende RAT-Payloads enthielten. **@lateos/npm-scan** erkennt jetzt alle 3 Axios-Vergiftungssignale.
41
+
42
+ **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.
43
+
44
+ **@lateos/npm-scan** wurde für diesen Moment entwickelt.
45
+
46
+ ---
47
+
48
+ ## 🔬 Warum @lateos/npm-scan?
49
+
50
+ | Fähigkeit | npm audit | Snyk | Socket | **@lateos/npm-scan** |
51
+ |---|---|---|---|---|
52
+ | Bekannte CVE-Übereinstimmung | | | ❌ | ✅ |
53
+ | Statische Analyse | ❌ | ✅ | ✅ | ✅ |
54
+ | Erkennung obfuskierter Payloads | | | | |
55
+ | AST-Level heuristische Analyse | ❌ | ❌ | ❌ | ✅ |
56
+ | Runtime-Verhaltenssandbox | ❌ | ❌ | ✅ | ✅ |
57
+ | Erkennung bedingter Auslöser (ATK-009) | ❌ | ❌ | ❌ | ✅ |
58
+ | Sandbox-Evasion-Erkennung (ATK-010) | ❌ | ❌ | ❌ | ✅ |
59
+ | Transitive Wurmverbreitung (ATK-011) | ❌ | ❌ | ❌ | ✅ |
60
+ | Kampagnenerkennung (Megalodon CI/CD) | | | ❌ | ✅ |
61
+ | Wurm-Kampagnenerkennung (Mini Shai-Hulud Welle 1-3) | ❌ | ❌ | ❌ | ✅ |
62
+ | HF-Modell-Repo-Identitätsdiebstahl + README-Klon | | | | |
63
+ | VS-Code-Erweiterungs-Supply-Chain-Scan (--vsix) | | | | |
64
+ | Python-Schwachstellenerkennung (CVE-2026-48710 BadHost) | | | | |
65
+ | Plattformübergreifende Angriffserkennung (TrapDoor) | | | | |
66
+ | Abgelaufene-Domain-Entführungserkennung (node-ipc) | | | | |
67
+ | Malware-Obfuskationserkennung (ctf-scramble-v2) | | | | |
68
+ | Massen-Typosquatting-Kampagne (vpmdhaj-Maintainer) | | | | |
69
+ | Registry-Vergiftungserkennung (axios-Fake-Versionen) | | | | |
70
+ | Angriffstaxonomie (ATK-Serie) | | | | |
71
+ | SBOM-Ausgabe (CycloneDX + SPDX) | | | | ✅ |
72
+ | NIST 800-161-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
73
+ | EU-CRA-Compliance-Bericht | ❌ | ❌ | ❌ | ✅ |
74
+ | SIEM-Export (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
75
+ | Vollständig lokale Ausführung — keine Telemetrie | ✅ | ❌ | ❌ | ✅ |
76
+ | Policy-as-Code (YAML-Whitelists) | ❌ | ❌ | ❌ | ✅ |
77
+
78
+ > **Datenschutz an erster Stelle.** Alle Scans erfolgen auf Ihrem Rechner. Kein Code verlässt Ihre Umgebung. Keine Telemetrie. Keine Cloud-Abhängigkeit.
79
+
80
+ ---
81
+
82
+ ## Hauptfunktionen
83
+
84
+ | Symbol | Funktion | Beschreibung |
85
+ |------|---------|-------------|
86
+ | 🕵️ | **Heuristische statische Analyse** | AST-Level-Inspektion erkennt Obfuskation, eval-Ketten, Umgebungsabfragen und verdächtige Lebenszyklus-Skripte, die regex-basierten Tools entgehen |
87
+ | 🧠 | **Verhaltenserkennung** | Identifiziert bedingte Auslöser (zeitbasiert, CI-bewusst), Sandbox-Evasion und schlafende Aktivierungsmuster |
88
+ | 🧬 | **ATK-Angriffstaxonomie** | 11 klassifizierte Angriffstypen mit NIST 800-161-Zuordnungen — versioniert, dokumentiert und PR-fähig |
89
+ | 🪱 | **Wurm-Kampagnenerkennung** | Mini Shai-Hulud - 10 Sub-Checks über 2 Suites: Burst-Publish, Sibling-Kompromittierung, SLSA-Attestierungsabweichung, Publisher-Drift, IOC-Match, Token-Exfil, ctf-scramble-v2-Obfuskation, dämonisierte Persistenz, geografischer Killswitch, GitHub-C2-Dead-Drop |
90
+ | 🧩 | **VSIX-Erweiterungsscan** | `npm-scan scan --vsix` - erkennt VS Code Marketplace Supply-Chain-Angriffe |
91
+ | 🐍 | **Python-Schwachstellenerkennung** | CVE-2026-48710 (BadHost) - Starlette Host-Header-Injection |
92
+ | 🪤 | **Plattformübergreifende Angriffserkennung** | TrapDoor - 9 Sub-Checks |
93
+ | 📡 | **Abgelaufene-Domain-Entführungserkennung** | node-ipc-Kompromittierung - 11 Sub-Checks |
94
+ | ☣️ | **Malware-Obfuskationserkennung** | ctf-scramble-v2 - scannt Paket-dist/lib nach bekannten Malware-Obfuskationsmustern, stoppt Analyse sofort mit CRITICAL-Stoppbedingung |
95
+ | 🎭 | **Massen-Typosquatting-Kampagnenerkennung** | vpmdhaj-Maintainer-Blocklist mit Stoppbedingung, Levenshtein-basierte Typosquatting-Erkennung, Preinstall-Stager-Identifikation, AWS-ECS/Vault/GitHub-Credential-Exfiltrationsmuster |
96
+ | ☠️ | **Registry-Vergiftungserkennung** | Axios-Versions-Blocklist (1.14.1/0.30.4) mit Stoppbedingung, Decoy-Abhängigkeitserkennung (plain-crypto-js), plattformübergreifende RAT-Payload-Erkennung |
97
+ | 🔏 | **Provenance-Prüfpfad** | Aureus-Elicitor v1.7-Framework - HMAC-SHA256-signierte Erkennungsmanifeste, inhaltshash-verifizierte Prüfpfade, Regel-Provenance-URLs, Kampagnenquellenattribution |
98
+ | 📦 | **SBOM-Generierung** | CycloneDX 1.5 und SPDX 2.3 mit eingebetteten Ergebnissen als Schwachstellen |
99
+ | 🧾 | **Compliance-Berichte** | NIST SP 800-161-Rückverfolgbarkeitsmatrix + EU Cyber Resilience Act-Zuordnung (kostenlos) |
100
+ | 🔌 | **SIEM-Export** | Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar-Formate (Premium) |
101
+ | 📜 | **Policy-as-Code** | YAML/JSON-Policy-Engine mit Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen |
102
+ | 🐳 | **Docker + GitHub Action** | Multi-Arch-Images, Ein-Befehl-Compose-Pipeline, PR-Scan-Action |
103
+ | 🛡️ | **Null Telemetrie** | Keine Daten verlassen Ihren Rechner. Keine Cloud. Keine Rückrufe. |
104
+ | 💾 | **Lokaler Scan-Verlauf** | SQLite-basierte Persistenz, keine externen Abhängigkeiten |
105
+
106
+ ---
107
+
108
+ ## ⚡ Schnellstart
109
+
110
+ ```bash
111
+ # Global installieren
112
+ npm install -g @lateos/npm-scan
113
+
114
+ # Ein einzelnes Paket scannen
115
+ npm-scan scan lodash
116
+
117
+ # Ihre Lock-Datei scannen
118
+ npm-scan scan-lockfile
119
+
120
+ # Letzte Scans anzeigen
121
+ npm-scan report
122
+ ```
123
+
124
+ **Keine Installation? Kein Problem:**
125
+
126
+ ```bash
127
+ npx @lateos/npm-scan scan commander
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 🐳 @lateos/npm-scan überall mit Docker ausführen — keine Installation
133
+
134
+ ```bash
135
+ # Einmaligen Scan pullen und ausführen — kein Node.js oder npm erforderlich
136
+ docker run --rm lateos/npm-scan:cli scan lodash
137
+
138
+ # Vollständige Pipeline mit persistentem Speicher und Compose
139
+ docker compose --profile pipeline up -d
140
+ ```
141
+
142
+ Kein Node.js. Kein `npm install`. Keine globalen Pakete. Funktioniert auf jedem System mit Docker — CI-Server, Air-Gapped-Umgebungen, Kubernetes-Cluster. Multi-Arch-Images für `linux/amd64` und `linux/arm64`.
143
+
144
+ ---
145
+
146
+ ## 🛡️ Behörden- & SOC 2-bereit
147
+
148
+ | Funktion | SOC 2-Kontrollen | NIST 800-161 | STIG/FedRAMP-Ausrichtung |
149
+ |----------|-------|--------------|--------------|
150
+ | Audit-Protokolle (--audit-log) | CC6.8 | AU-2 | ✓ |
151
+ | FIPS-Krypto (--fips) | CC6.1 | SC-13 | ✓ |
152
+ | STIG-Bericht (--stig) | CC7.3 | RA-5 | ✓ |
153
+ | Offline-Cache (--cache-dir) | A1.2 | SC-8 | ✓ |
154
+ | Sigstore-Herleitung | CC6.2 | SI-7 | ✓ |
155
+ | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
156
+
157
+ ```bash
158
+ # Vollständig konformer Scan in luftdichten Umgebungen
159
+ npm-scan scan-lockfile --cache-dir /offline/cache --audit-log /var/log/npm-scan.audit --fips
160
+ npm-scan report --stig
161
+ ```
162
+
163
+ ---
164
+
165
+ ## 📖 Verwendungsbeispiele
166
+
167
+ ### Ein einzelnes Paket scannen
168
+
169
+ ```bash
170
+ # Standard-JSON-Ausgabe mit allen Ergebnissen
171
+ npm-scan scan axios
172
+
173
+ # SBOM zusammen mit dem Scan generieren
174
+ npm-scan scan express --sbom # CycloneDX JSON
175
+ npm-scan scan express --sbom xml # CycloneDX XML
176
+ npm-scan scan express --sbom spdx # SPDX 2.3
177
+
178
+ # Eine YAML-Policy anwenden
179
+ npm-scan scan some-package --policy .npm-scan.yml
180
+
181
+ # Lokales Tarball scannen (kein Registry-Abruf nötig)
182
+ npm-scan scan --file path/to/malicious-package.tgz
183
+ ```
184
+
185
+ ### Eine Lock-Datei scannen
186
+
187
+ ```bash
188
+ # Die Abhängigkeiten des aktuellen Projekts scannen
189
+ npm-scan scan-lockfile
190
+
191
+ # Eine bestimmte Lock-Datei scannen
192
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
193
+
194
+ # CI/CD bei hohen oder kritischen Problemen fehlschlagen (Exit-Code 1)
195
+ npm-scan scan-lockfile --fail-on high
196
+
197
+ # Bei allen Erkenntnissen fehlschlagen (low und höher)
198
+ npm-scan scan-lockfile --fail-on low
199
+
200
+ # SARIF v2.1-Ausgabe für GitHub Advanced Security / VS Code generieren
201
+ npm-scan scan-lockfile --sarif results.sarif
202
+
203
+ # Nur Risiko-Score ausgeben (0-10) für Dashboards/Schwellenwerte
204
+ npm-scan scan-lockfile --score-only
205
+ ```
206
+
207
+ ### Berichte generieren
208
+
209
+ ```bash
210
+ # Alle letzten Scans auflisten
211
+ npm-scan report
212
+
213
+ # Einen bestimmten Scan anzeigen
214
+ npm-scan report -i 42
215
+
216
+ # HTML-Bericht (kostenlos) mit vollständigen Ergebnissen + NIST-Tabelle
217
+ npm-scan report -i 42 --html
218
+
219
+ # NIST 800-161-Compliance-Tabelle ausgeben
220
+ npm-scan report -i 42 --nist
221
+
222
+ # EU-CRA-Compliance-Tabelle ausgeben
223
+ npm-scan report --cra
224
+
225
+ # CSV-Export für Excel / Sheets (audit-bereit)
226
+ npm-scan report --csv risks.csv
227
+ npm-scan scan lodash --csv # CSV nach stdout
228
+
229
+ # Textbericht (kostenlos)
230
+ npm-scan report --text
231
+
232
+ # PDF-Bericht (Premium)
233
+ npm-scan report --pdf --license-key <key>
234
+
235
+ # SIEM-Export (Premium)
236
+ npm-scan report --siem cef # Splunk CEF
237
+ npm-scan report --siem ecs # Elastic ECS
238
+ npm-scan report --siem sentinel # Microsoft Sentinel
239
+ npm-scan report --siem qradar # IBM QRadar
240
+
241
+ # Alle Scans in einem einzigen Bericht zusammenfassen
242
+ npm-scan report --html # alle Scans
243
+ npm-scan report --pdf # alle Scans (Premium)
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 🧬 Erkennungsfähigkeiten (ATK-Taxonomie)
249
+
250
+ | ID | Angriffsklasse | Erkennungsmethode | Schweregrad | NIST 800-161 |
251
+ |---|---|---|---|---|
252
+ | **ATK-001** | Böswillige Lebenszyklus-Skripte (`preinstall`, `postinstall`, `install`) | Statisch | 🔴 hoch | SR-3.1 |
253
+ | **ATK-002** | Obfuskierte Payload-Zustellung (hex, base64, eval-Ketten) | Statisch | 🟠 mittel | SR-4.2 |
254
+ | **ATK-003** | Credential-Diebstahl (Umgebungsvariablen, .npmrc, SSH-Schlüssel) | Statisch + Dynamisch | 🔴 hoch | SR-5.3 |
255
+ | **ATK-004** | Persistenz über Editor-/Konfigurationsverzeichnisse (.vscode, .claude, .cursor) | Statisch | 🔴 hoch | SR-6.4 |
256
+ | **ATK-005** | Netzwerk-Exfiltration (GitHub-API, DNS-Tunneling, HTTP C2) | Statisch + Dynamisch | kritisch | SR-7.5 |
257
+ | **ATK-006** | Abhängigkeitsverwirrung / Namespace-Squatting | Statisch (Lock-Datei) | 🟠 mittel | SR-2.2 |
258
+ | **ATK-007** | Typosquatting (Edit-Distanz-Matching) | Statisch | 🟢 niedrig | SR-2.1 |
259
+ | **ATK-008** | Tarball-Manipulation (veröffentlicht ≠ Quelle) | Statisch | 🔴 hoch | SR-8.1 |
260
+ | **ATK-009** | Bedingte/schlafende Auslöser (CI-Erkennung, zeitbasiert) | Verhaltensbasiert | 🔴 hoch | SR-9.2 |
261
+ | **ATK-010** | Sandbox-Evasion / Anti-Analyse | Verhaltensbasiert | 🟠 mittel | SR-10.3 |
262
+ | **ATK-011** | Transitive Verbreitung (wurmartige laterale Ausbreitung) | Verhaltensbasiert | 🔴 hoch | SR-11.4 |
263
+ | **CVE-2026-48710** | BadHost — Starlette Authentifizierungs-Bypass via Host-Header-Injection (CVE-2026-48710, CVSS 7.0). Python-Abhängigkeitsversionserkennung (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg), transitive Heuristik (15 bekannte Downstream-Pakete: fastapi, vllm, litellm, MCP-Server, etc.), statische Code-Pattern-Analyse für gefährliche `request.url.path`-Nutzung in Auth/Middleware-Kontexten mit `request.scope["path"]`-Unterdrückung | Statisch + Registry | 🔴 hoch / 🟠 mittel / ℹ️ info | SR-3.1, SR-5.3 |
264
+ | **TRAPDOOR** | TrapDoor plattformübergreifende Angriffskampagne — Kampagnenmarker P-2024-001, trap-core.js-Payload-Fingerprint, Publisher-Blocklist asdxzxc, Gist-basierter Credential-Exfil, KI-Kontextvergiftung (Zero-Width-Unicode), Crypto/DeFi-Locknamen, Fernet+ECDH-Verschlüsselung, XOR-Key cargo-build-helper-2026, STS/GitHub-API-Validierung | Statisch + Registry | 🟠 mittel / 🔴 hoch / ⚫ kritisch | SR-3.1, SR-5.3, SR-7.5 |
265
+ | **NODE_IPC_COMPROMISE** | node-ipc Supply-Chain-Kompromittierung (14. Mai 2026) — Versions-Blocklist (9.1.6/9.2.3/12.0.1) mit sicheren Pins, Tarball-SHA-256-Verifikation, CJS-Payload-IIFE-Injektion, DNS-over-nicht-Standard-Port-C2, Bootstrap-Resolver sh.azurestaticprovider.net, DNS-TXT-Exfiltrationszone bt.node.js, setImmediate()-Laufzeitauslöser, ~/nt-*/ Staging-Artefakte, unbefugter Publisher atiertant, Lockfile-Blastradius | Statisch + Registry | ⚫ kritisch | SR-3.1, SR-5.3, SR-7.5 |
266
+ | **MSH_SUPPLEMENT** | Mini Shai-Hulud-Ergänzung - ctf-scramble-v2-Obfuskation (STOP bei Treffer), dämonisierte Persistenz, geografischer Killswitch (ru_RU/be_BY), C2-Dead-Drop-Indikatoren (OhNoWhatsGoingOnWithGitHub) | Statisch + Verhalten | ⚫ kritisch | SR-3.1, SR-7.5, SR-9.2 |
267
+ | **TYPOSQUAT_VPMDHAJ** | Massen-Typosquatting-Kampagne (vpmdhaj) - Maintainer-Blocklist (STOP bei Treffer), vpmdhaj-*-Namespace-Präfixerkennung, Levenshtein-Typosquatting, Preinstall-Stager, Cloud-Credential-Exfiltration (AWS IMDSv2, ECS, Vault, GitHub) | Statisch + Registry | ⚫ kritisch | SR-2.1, SR-3.1, SR-5.3 |
268
+ | **AXIOS_POISONING** | Axios-Registry-Vergiftung - Versions-Blocklist (1.14.1/0.30.4, STOP bei Treffer), Decoy-Abhängigkeitsinjektion (plain-crypto-js), plattformübergreifende RAT-Payload-Erkennung (PowerShell, launchd, systemd, DLL, C2) | Statisch + Verhalten | ⚫ kritisch | SR-3.1, SR-5.3, SR-7.5 |
269
+
270
+ > **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.
271
+ > Vollständige Dokumentation der Ausweichfläche und PoC-Beispiele finden Sie in [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md).
272
+
273
+ ---
274
+
275
+ ## 📊 Ausgaben und Berichte
276
+
277
+ ### Formate
278
+
279
+ | Format | Verfügbarkeit | Beschreibung |
280
+ |--------|-------------|-------------|
281
+ | JSON | ✅ Kostenlos | Strukturierte maschinenlesbare Ergebnisse |
282
+ | HTML | ✅ Kostenlos | Reichhaltiger HTML-Bericht mit NIST-Compliance-Tabelle, Schweregrad-Abzeichen, Kontrollmatrix |
283
+ | Text | ✅ Kostenlos | Sauberer, terminalfreundlicher Textbericht |
284
+ | CycloneDX SBOM | ✅ Kostenlos | Branchenstandard-SBOM mit Ergebnissen als Schwachstellen eingebettet |
285
+ | SPDX SBOM | ✅ Kostenlos | SPDX 2.3-Dokumentformat |
286
+ | NIST 800-161 | ✅ Kostenlos | Kontroll-Rückverfolgbarkeitsmatrix (SR-2.1 → SR-11.4) |
287
+ | EU CRA | ✅ Kostenlos | Zuordnung der Cyber Resilience Act-Artikel |
288
+ | PDF | 🔐 Premium | Mehrseitiges PDF mit Titelseite, Ergebnistabelle, NIST-Compliance-Matrix |
289
+ | Splunk CEF | 🔐 Premium | Common Event Format für Splunk-Erfassung |
290
+ | Elastic ECS | 🔐 Premium | Elastic Common Schema-Format |
291
+ | Microsoft Sentinel | 🔐 Premium | Sentinel-ready formatierte Ausgabe |
292
+ | IBM QRadar | 🔐 Premium | QRadar-DSM-ready-Format mit QID-Zuordnungen |
293
+
294
+ ### Beispielausgabe
295
+
296
+ ```json
297
+ {
298
+ "scanId": 1,
299
+ "findings": [
300
+ {
301
+ "id": "ATK-003",
302
+ "severity": "high",
303
+ "title": "Credential harvesting",
304
+ "evidence": "process.env.NPM_TOKEN detected in postinstall.js:17"
305
+ }
306
+ ]
307
+ }
308
+ ```
309
+
310
+ ---
311
+
312
+ ## ⚙️ Konfiguration und erweiterte Nutzung
313
+
314
+ ### Policy-as-Code
315
+
316
+ Definieren Sie Whitelists, Schweregrad-Überschreibungen, Unterdrückungen und Fehlerschwellen in einer YAML-Datei:
317
+
318
+ ```yaml
319
+ # .npm-scan.yml
320
+ allowlist:
321
+ - lodash
322
+ - chalk
323
+
324
+ severity_overrides:
325
+ - id: ATK-001
326
+ severity: medium
327
+
328
+ suppress:
329
+ - atk_id: ATK-009
330
+ - package: some-package
331
+
332
+ fail_on: high
333
+ ```
334
+
335
+ ```bash
336
+ npm-scan scan target --policy .npm-scan.yml
337
+ ```
338
+
339
+ ### Umgebungsvariablen
340
+
341
+ | Variable | Beschreibung | Standard |
342
+ |----------|-------------|---------|
343
+ | `NPM_SCAN_LICENSE_KEY` | Premium-/Enterprise-Lizenzschlüssel | |
344
+ | `NPM_SCAN_DATA_DIR` | Scan-Verlaufsverzeichnis | `./.npm-scan` |
345
+ | `NPM_SCAN_LOG_LEVEL` | Ausführlichkeitsgrad der Protokollierung | `info` |
346
+
347
+ ### Premium-Lizenzierung
348
+
349
+ Kontaktieren Sie leo@lateos.ai, um einen Premium/Enterprise-Lizenzschlüssel zu erhalten.
350
+
351
+ ```bash
352
+ # Verwenden
353
+ npm-scan scan target --license-key <key>
354
+ npm-scan report --pdf --license-key <key>
355
+ npm-scan report --siem cef --license-key <key>
356
+ ```
357
+
358
+ ---
359
+
360
+ ## 🔗 Integrationen
361
+
362
+ ### GitHub Actions CI (für dieses Repository)
363
+
364
+ Jeder Push und PR führt Tests auf Node 18, 20 und 22 aus:
365
+
366
+ ```yaml
367
+ # .github/workflows/ci.yml
368
+ name: CI
369
+ on:
370
+ push:
371
+ branches: [ main ]
372
+ pull_request:
373
+ branches: [ main ]
374
+ jobs:
375
+ test:
376
+ runs-on: ubuntu-latest
377
+ strategy:
378
+ matrix:
379
+ node-version: [18, 20, 22]
380
+ steps:
381
+ - uses: actions/checkout@v4
382
+ - uses: actions/setup-node@v4
383
+ with:
384
+ node-version: ${{ matrix.node-version }}
385
+ cache: 'npm'
386
+ - run: npm ci
387
+ - run: npm test
388
+ - run: npm run test:coverage
389
+ - run: node --test test/detectors-corpus.test.js
390
+ - run: npm run lint
391
+ - run: npm run build
392
+ ```
393
+
394
+ ### GitHub Action (für nachgelagerte Benutzer)
395
+
396
+ Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
397
+
398
+ ```yaml
399
+ # .github/workflows/scan.yml
400
+ name: npm-scan
401
+ on:
402
+ pull_request:
403
+ paths:
404
+ - 'package-lock.json'
405
+ - '**/package.json'
406
+ jobs:
407
+ scan:
408
+ runs-on: ubuntu-latest
409
+ steps:
410
+ - uses: actions/checkout@v4
411
+ - uses: actions/setup-node@v4
412
+ with:
413
+ node-version: 20
414
+ - name: Scan lockfile
415
+ uses: lateos/npm-scan@v1
416
+ with:
417
+ scan-type: lockfile
418
+ fail-on: high
419
+ ```
420
+
421
+ #### Action-Eingaben
422
+
423
+ | Eingabe | Standard | Beschreibung |
424
+ |-------|---------|-------------|
425
+ | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
426
+ | `package` | — | Paketname (erforderlich bei `scan-type=package`) |
427
+ | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
428
+ | `policy-file` | | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
429
+ | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
430
+ | `siem-format` | — | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
431
+ | `sbom-format` | | SBOM-Ausgabe: `json`, `xml`, `spdx` |
432
+
433
+ #### Action-Ausgaben
434
+
435
+ | Ausgabe | Beschreibung |
436
+ |--------|-------------|
437
+ | `findings-count` | Anzahl der erkannten Ergebnisse |
438
+ | `scan-id` | Scan-ID für spätere Referenz in Berichten |
439
+
440
+ #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
441
+
442
+ ```yaml
443
+ - uses: lateos/npm-scan@v1
444
+ with:
445
+ scan-type: package
446
+ package: lodash
447
+ policy-file: .npm-scan.yml
448
+ sbom-format: spdx
449
+ fail-on: critical
450
+ ```
451
+
452
+ #### Beispiel: Mit SIEM-Export scannen (Premium)
453
+
454
+ ```yaml
455
+ - uses: lateos/npm-scan@v1
456
+ with:
457
+ scan-type: lockfile
458
+ siem-format: cef
459
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
460
+ ```
461
+
462
+ ### CI/CD-Pipeline
463
+
464
+ Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
465
+
466
+ ```bash
467
+ # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
468
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
469
+
470
+ # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
471
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
472
+
473
+ # SBOM als Build-Artefakt generieren
474
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
475
+
476
+ # HTML-Compliance-Bericht in CI generieren
477
+ npm-scan report --html > report.html
478
+
479
+ # Bericht als Artefakt hochladen
480
+ # uses: actions/upload-artifact@v4
481
+ # with:
482
+ # name: npm-scan-report
483
+ # path: report.html
484
+ ```
485
+
486
+ ### Docker
487
+
488
+ Siehe den obigen [Docker-Schnellstart-Abschnitt](#-lateosnpm-scan-überall-mit-docker-ausführen--keine-installation) für Pull-Befehle, Compose-Pipeline und Multi-Arch-Images.
489
+
490
+ Scannen Sie die `package-lock.json` Ihres Projekts bei jedem PR — erkennt Typosquatting, obfuskierte Payloads, Credential-Stealer und Wurmverbreitung, bevor sie die Produktion erreichen:
491
+
492
+ ```yaml
493
+ # .github/workflows/scan.yml
494
+ name: npm-scan
495
+ on:
496
+ pull_request:
497
+ paths:
498
+ - 'package-lock.json'
499
+ - '**/package.json'
500
+ jobs:
501
+ scan:
502
+ runs-on: ubuntu-latest
503
+ steps:
504
+ - uses: actions/checkout@v4
505
+ - uses: actions/setup-node@v4
506
+ with:
507
+ node-version: 20
508
+ - name: Scan lockfile
509
+ uses: lateos/npm-scan@v1
510
+ with:
511
+ scan-type: lockfile
512
+ fail-on: high
513
+ ```
514
+
515
+ #### Action-Eingaben
516
+
517
+ | Eingabe | Standard | Beschreibung |
518
+ |-------|---------|-------------|
519
+ | `scan-type` | `lockfile` | `lockfile` zum Scannen von `package-lock.json` oder `package` zum Scannen eines bestimmten npm-Pakets |
520
+ | `package` | — | Paketname (erforderlich bei `scan-type=package`) |
521
+ | `fail-on` | `high` | Workflow bei diesem Schweregrad-Schwellwert fehlschlagen lassen: `none`, `low`, `medium`, `high`, `critical` |
522
+ | `policy-file` | | Pfad zu einer YAML/JSON-Policy-Datei für Whitelists, Schweregrad-Überschreibungen und Unterdrückungen |
523
+ | `license-key` | — | Premium-Lizenzschlüssel für SIEM-Export und PDF-Berichte |
524
+ | `siem-format` | — | SIEM-Ausgabe: `cef`, `ecs`, `sentinel`, `qradar` (Premium) |
525
+ | `sbom-format` | | SBOM-Ausgabe: `json`, `xml`, `spdx` |
526
+
527
+ #### Action-Ausgaben
528
+
529
+ | Ausgabe | Beschreibung |
530
+ |--------|-------------|
531
+ | `findings-count` | Anzahl der erkannten Ergebnisse |
532
+ | `scan-id` | Scan-ID für spätere Referenz in Berichten |
533
+
534
+ #### Beispiel: Bestimmtes Paket mit Policy + SBOM scannen
535
+
536
+ ```yaml
537
+ - uses: lateos/npm-scan@v1
538
+ with:
539
+ scan-type: package
540
+ package: lodash
541
+ policy-file: .npm-scan.yml
542
+ sbom-format: spdx
543
+ fail-on: critical
544
+ ```
545
+
546
+ #### Beispiel: Mit SIEM-Export scannen (Premium)
547
+
548
+ ```yaml
549
+ - uses: lateos/npm-scan@v1
550
+ with:
551
+ scan-type: lockfile
552
+ siem-format: cef
553
+ license-key: ${{ secrets.NPM_SCAN_LICENSE_KEY }}
554
+ ```
555
+
556
+ ### CI/CD-Pipeline
557
+
558
+ Direkte Integration in Ihre bestehende Pipeline ohne die Composite-Action:
559
+
560
+ ```bash
561
+ # Lock-Datei scannen, Build bei hohem Schweregrad fehlschlagen lassen
562
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
563
+
564
+ # Bestimmtes Paket scannen, nur bei kritisch fehlschlagen
565
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
566
+
567
+ # SBOM als Build-Artefakt generieren
568
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
569
+
570
+ # HTML-Compliance-Bericht in CI generieren
571
+ npm-scan report --html > report.html
572
+
573
+ # Bericht als Artefakt hochladen
574
+ # uses: actions/upload-artifact@v4
575
+ # with:
576
+ # name: npm-scan-report
577
+ # path: report.html
578
+ ```
579
+
580
+ ### Docker
581
+
582
+ Siehe den obigen [Docker-Schnellstart-Abschnitt](#-lateosnpm-scan-überall-mit-docker-ausführen--keine-installation) für Pull-Befehle, Compose-Pipeline und Multi-Arch-Images.
583
+
584
+ ---
585
+
586
+ ## 🗺️ Roadmap und Enterprise-Funktionen
587
+
588
+ ### Kostenlose Stufe (ausgeliefert)
589
+
590
+ - Alle 11 ATK-Detektoren (statisch + verhaltensbasiert) + **MEGALODON** (D1-D6) + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** (D1-D7, 3 Wellen, mit **MSH_SUPPLEMENT** D1-D4) + **VSIX_SCAN** (6 Detektoren) + **CVE-2026-48710 (BadHost)** (3 Ebenen) + **TRAPDOOR** (9 Regeln) + **NODE_IPC_COMPROMISE** (11 Regeln) + **TYPOSQUAT_VPMDHAJ** (3 Regeln) + **AXIOS_POISONING** (3 Regeln)
591
+ - SBOM-Ausgabe (CycloneDX + SPDX)
592
+ - HTML-, Text- und Compliance-Berichte (NIST + EU CRA)
593
+ - Policy-as-Code-Engine (YAML)
594
+ - Lokaler SQLite-Scan-Verlauf
595
+ - GitHub Action
596
+ - Docker-Images + Compose-Pipeline
597
+
598
+ ### Premium (🔐 Lizenzschlüssel)
599
+
600
+ - PDF-Compliance-Berichte mit NIST-Rückverfolgbarkeitsmatrix
601
+ - SIEM-Export (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
602
+ - Dynamische Sandbox (gVisor-basiert ATK-008–010)
603
+ - Erreichbarkeitsanalyse (Call-Graph-Filterung)
604
+
605
+ ### Enterprise (🏢 benutzerdefinierte Lizenz)
606
+
607
+ - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
608
+ - REST-API + Webhooks (FastAPI)
609
+ - Team-RBAC + Audit-Logs
610
+ - Helm-Chart für Kubernetes-Bereitstellung
611
+ - PostgreSQL-Backend für gehostete/Team-Stufe
612
+ - SLA-gestützter Prioritätssupport
613
+
614
+ ---
615
+
616
+ ## 🤝 Beitragen
617
+
618
+ Wir begrüßen Beiträge insbesondere neue Detektoren, verbesserte Ausweichresistenz und Compliance-Vorlagen.
619
+
620
+ Siehe [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) für den ATK-Governance-Prozess. Jeder neue Detektor erfordert:
621
+
622
+ 1. Ein Proof-of-Concept-Beispiel
623
+ 2. Eine Erkennungsregel mit Tests
624
+ 3. False-Positive-Analyse auf den Top-500-npm-Paketen
625
+ 4. NIST 800-161-Control-Zuordnung
626
+
627
+ ### Tests
628
+
629
+ Das Projekt verwendet den **nativen Node.js-Test-Runner** (`node:test` + `assert/strict`).
630
+
631
+ ```bash
632
+ # Alle Tests ausführen
633
+ npm test
634
+
635
+ # Tests mit Codeabdeckung ausführen
636
+ npm run test:coverage
637
+
638
+ # Tests mit ausführlicher Ausgabe ausführen
639
+ npm run test:verbose
640
+
641
+ # Lokales bösartiges/sauberes Korpus ausführen (kein Netzwerk erforderlich)
642
+ node --test test/detectors-corpus.test.js
643
+ ```
644
+
645
+ **Teststruktur:**
646
+ - `test/fixtures/mock-data.js` — gemeinsam genutzte Mock-Scans, Pakete und Code-Snippets
647
+ - `test/db.test.js` — Datenbank-CRUD (Speichern, Abfragen, Persistieren)
648
+ - `test/detectors-edge-cases.test.js`detektorspezifische Grenztests (No-Ops, saubere Bereinigung, Schweregrad)
649
+ - `test/detectors-corpus.test.js` — 33 bösartige + 50 saubere Tarball-Integrationstests (offline)
650
+ - `test/fetch.test.js` — Tarball-Extraktion, Bereinigung temporärer Verzeichnisse
651
+ - `test/policy-edge-cases.test.js` — Grenzfälle bei Unterdrückung, Überschreibung, Ladevalidierung
652
+ - `test/report-snapshots.test.js` — HTML/Text/CRA/PDF-Format-Assertions
653
+ - `test/cve-2026-48710-badhost/manifest.test.js`13 Python-Manifest-Parsing-Tests (requirements.txt, pyproject.toml, poetry.lock, Version-Grenzfälle)
654
+ - `test/cve-2026-48710-badhost/transitive.test.js` — 7 transitive Abhängigkeitstests (Tier 1/2, fastapi-Version-Gating, Pin-Unterdrückung)
655
+ - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 statische Code-Pattern-Tests (Auth-Kontext, INFO-Durchgriff, Scope-Unterdrückung)
656
+ - `test/cve-2026-48710-badhost/integration.test.js` 4 Integrationstests (End-to-End-Composite-Findings, sauberes Projekt, keine Python-Dateien)
657
+ - `test/trapdoor.test.js` 40 TrapDoor-Kampagnenerkennungstests (D1–D9: Kampagnenmarker, Payload-Fingerprint, Publisher-Blocklist, Gist-Exfil, KI-Vergiftung, Lockname, Krypto-Primitive, XOR-Key, Credential-Validierung)
658
+ - `test/node-ipc.test.js` — 37 node-ipc-Kompromittierungstests (D1–D11: Versions-Blocklist, Tarball-Hash, CJS-Injektion, Payload-Hash, DNS-C2-Muster, Bootstrap-Resolver, DNS-TXT-Exfil, Laufzeitauslöser, Temp-Artefakte, unbefugter Publisher, Blastradius)
659
+ - `test/msh-supplement.test.js` - 17 MSH-Ergänzungstests (ctf-scramble-v2-Stopp, Dämonisierung, geografischer Killswitch, C2-Dead-Drop)
660
+ - `test/typosquat-vpmdhaj.test.js` - 16 Typosquatting-Kampagnentests (Maintainer-Block, Präfixerkennung, Levenshtein, Preinstall-Stager, Bun-Loader, AWS/ECS/Vault/GitHub-Cred-Exfil)
661
+ - `test/axios-poisoning.test.js` - 13 Axios-Vergiftungstests (Versions-Blocklist-Stopp, Decoy-Abhängigkeit, Krypto-Heuristik, plattformübergreifender RAT, C2-Callback)
662
+ - `test/cli.test.js` — Commander-Integrationstests (Hilfe, Version, Scan, Bericht, Fehlerbehandlung)
663
+
664
+ ### Hilfe benötigt?
665
+
666
+ - 🔒 Siehe [Sicherheitsrichtlinie](SECURITY.md) für die Offenlegung von Schwachstellen
667
+ - 📖 Lesen Sie den [Projektplan](docs/project-plan.md)
668
+ - 🧬 Überprüfen Sie die [Angriffstaxonomie](docs/attack-taxonomy.md)
669
+ - 🐛 Öffnen Sie ein Issue oder PR
670
+
671
+ ---
672
+
673
+ ## 📄 Lizenz
674
+
675
+ Apache-2.0 Core + Commons Clause.
676
+ Siehe [`LICENSING.md`](LICENSING.md) für die genaue Grenze zwischen kostenlosen und Premium-Funktionen.
677
+
678
+ ---
679
+
680
+ ## 👤 Über den Maintainer
681
+
682
+ **Roongrunchai Chongolnee** — Ersteller und Maintainer von `@lateos/npm-scan`. Zertifizierter Sicherheitsexperte (CISSP, CEH, Cisco Security, AWS Cloud Practitioner) mit einem Jahrzehnt Erfahrung in Infrastruktur- und Anwendungssicherheit bei Philips. Ich habe dieses Tool entwickelt, um der Open-Source-Community eine praktische, detektorgesteuerte Abwehr gegen Supply-Chain-Malware zu bieten — und ich bin bestrebt, es transparent, gemeinschaftseigen und kontinuierlich verbessert zu halten.
683
+
684
+ [![LinkedIn](https://img.shields.io/badge/LinkedIn-0A66C2?style=flat-square&logo=linkedin)](https://www.linkedin.com/in/roongrunchai-chong-c-ab9742108/)
685
+ [![GitHub](https://img.shields.io/badge/GitHub-lateos--ai-181717?style=flat-square&logo=github)](https://github.com/lateos-ai/npm-scan)
686
+
687
+ Issues, Ideen und Pull-Requests sind immer willkommen — Sicherheit ist am stärksten, wenn wir zusammenarbeiten.
688
+
689
+ ---
690
+
691
+ ```
692
+ @lateos/npm-scan — npm supply chain security scanner
693
+ Copyright (C) 2026 Lateos
694
+
695
+ Licensed under the Apache License, Version 2.0 (the "License");
696
+ you may not use this file except in compliance with the License.
697
+
698
+ Unless required by applicable law or agreed to in writing, software
699
+ distributed under the License is distributed on an "AS IS" BASIS,
700
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
701
+ ```
702
+
703
+ ---
704
+
705
+ **Scannen Sie Ihr erstes Paket jetzt:**
706
+
707
+ ```bash
708
+ npx @lateos/npm-scan scan lodash
670
709
  ```