@lateos/npm-scan 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +619 -0
- package/README.fr.md +619 -0
- package/README.ja.md +619 -0
- package/README.md +244 -14
- package/README.zh.md +619 -0
- package/backend/db.js +1 -0
- package/package.json +3 -1
- package/test/fixtures/mock-data.js +69 -0
package/README.de.md
ADDED
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
# @lateos/npm-scan
|
|
2
|
+
|
|
3
|
+
[](README.md)
|
|
4
|
+
[](README.zh.md)
|
|
5
|
+
[](README.ja.md)
|
|
6
|
+
[](README.fr.md)
|
|
7
|
+
[](README.de.md)
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/@lateos/npm-scan)
|
|
10
|
+
[](LICENSING.md)
|
|
11
|
+
[](package.json)
|
|
12
|
+
[](https://github.com/lateos/npm-scan)
|
|
13
|
+
[](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
|
+
```
|