@lateos/npm-scan 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.fr.md ADDED
@@ -0,0 +1,619 @@
1
+ # @lateos/npm-scan
2
+
3
+ [![English](https://img.shields.io/badge/lang-en-blue?style=flat-square)](README.md)
4
+ [![中文](https://img.shields.io/badge/lang-zh--CN-red?style=flat-square)](README.zh.md)
5
+ [![日本語](https://img.shields.io/badge/lang-ja-purple?style=flat-square)](README.ja.md)
6
+ [![Français](https://img.shields.io/badge/lang-fr-orange?style=flat-square)](README.fr.md)
7
+ [![Deutsch](https://img.shields.io/badge/lang-de-green?style=flat-square)](README.de.md)
8
+
9
+ [![npm version](https://img.shields.io/npm/v/@lateos/npm-scan?style=flat-square)](https://www.npmjs.com/package/@lateos/npm-scan)
10
+ [![License](https://img.shields.io/badge/license-Apache%202.0%20%2B%20Commons%20Clause-blue?style=flat-square)](LICENSING.md)
11
+ [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](package.json)
12
+ [![Tests](https://img.shields.io/badge/tests-222%20passing-brightgreen?style=flat-square)](https://github.com/lateos/npm-scan)
13
+ [![Coverage](https://img.shields.io/badge/coverage-85%25-yellowgreen?style=flat-square)](https://github.com/lateos/npm-scan)
14
+
15
+ **Sécurité moderne de la chaîne d'approvisionnement pour l'écosystème npm.**
16
+ Analyse statique + comportementale qui détecte ce que npm audit, Snyk et Socket manquent — charges utiles obfusquées, voleurs d'identifiants, déclencheurs conditionnels, contournement de sandbox et propagation de type ver.
17
+
18
+ ---
19
+
20
+ ## 📌 Le problème
21
+
22
+ La vague d'attaques sur la chaîne d'approvisionnement npm de 2025–2026 a prouvé que les outils traditionnels ne suffisent plus.
23
+
24
+ Les attaquants ont dépassé le simple typosquatting. Ils livrent désormais des **hooks de pré-installation obfusqués**, des **voleurs d'identifiants cachés derrière la détection d'environnement**, des **portes dérobées dormantes avec activation temporelle**, et une **propagation transitive de type ver** qui se répand via les dépendances peer.
25
+
26
+ **npm audit** vérifie les CVE connus. **Snyk** recherche les vulnérabilités. **Socket** analyse le comportement des paquets. Aucun d'eux n'a été conçu pour la génération d'attaques apparue en 2025 — des attaques qui semblent bénignes jusqu'à ce qu'elles atteignent la production.
27
+
28
+ **@lateos/npm-scan** a été conçu pour ce moment.
29
+
30
+ ---
31
+
32
+ ## 🔬 Pourquoi @lateos/npm-scan ?
33
+
34
+ | Capacité | npm audit | Snyk | Socket | **@lateos/npm-scan** |
35
+ |---|---|---|---|---|
36
+ | Correspondance CVE connus | ✅ | ✅ | ❌ | ✅ |
37
+ | Analyse statique | ❌ | ✅ | ✅ | ✅ |
38
+ | Détection de charges utiles obfusquées | ❌ | ❌ | ❌ | ✅ |
39
+ | Analyse comportementale / heuristique | ❌ | ❌ | Partielle | ✅ |
40
+ | Détection de déclencheurs conditionnels (ATK-009) | ❌ | ❌ | ❌ | ✅ |
41
+ | Détection de contournement de sandbox (ATK-010) | ❌ | ❌ | ❌ | ✅ |
42
+ | Propagation transitive de ver (ATK-011) | ❌ | ❌ | ❌ | ✅ |
43
+ | Taxonomie d'attaques (série ATK) | ❌ | ❌ | ❌ | ✅ |
44
+ | Sortie SBOM (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
45
+ | Rapport de conformité NIST 800-161 | ❌ | ❌ | ❌ | ✅ |
46
+ | Rapport de conformité EU CRA | ❌ | ❌ | ❌ | ✅ |
47
+ | Export SIEM (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
48
+ | Exécution entièrement locale — aucune télémétrie | ✅ | ❌ | ❌ | ✅ |
49
+ | Politique en tant que code (listes blanches YAML) | ❌ | ❌ | ❌ | ✅ |
50
+
51
+ > **La vie privée d'abord.** Toute l'analyse s'effectue sur votre machine. Aucun code ne quitte votre environnement. Aucune télémétrie. Aucune dépendance au cloud.
52
+
53
+ ---
54
+
55
+ ## ✨ Fonctionnalités clés
56
+
57
+ | Icône | Fonctionnalité | Description |
58
+ |------|---------|-------------|
59
+ | 🕵️ | **Analyse statique heuristique** | L'inspection au niveau AST détecte l'obfuscation, les chaînes eval, le sondage d'environnement et les scripts de cycle de vie suspects que les outils basés sur les regex manquent |
60
+ | 🧠 | **Détection comportementale** | Identifie les déclencheurs conditionnels (temporels, conscients du CI), le contournement de sandbox et les modèles d'activation dormante |
61
+ | 🧬 | **Taxonomie d'attaques ATK** | 11 types d'attaques classifiés avec correspondances NIST 800-161 — versionnés, documentés et PR-ables |
62
+ | 📦 | **Génération SBOM** | CycloneDX 1.5 et SPDX 2.3 avec résultats intégrés comme vulnérabilités |
63
+ | 🧾 | **Rapports de conformité** | Matrice de traçabilité NIST SP 800-161 + cartographie EU Cyber Resilience Act (gratuit) |
64
+ | 🔌 | **Export SIEM** | Formats Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar (premium) |
65
+ | 📜 | **Politique en tant que code** | Moteur de politique YAML/JSON avec listes blanches, surcharges de sévérité, suppressions et seuils d'échec |
66
+ | 🐳 | **Docker + GitHub Action** | Images multi-arch, pipeline Compose en une commande, action de scan PR |
67
+ | 🛡️ | **Zéro télémétrie** | Aucune donnée ne quitte votre machine. Pas de cloud. Pas de rappels. |
68
+ | 💾 | **Historique de scan local** | Persistance basée sur SQLite, zéro dépendance externe |
69
+
70
+ ---
71
+
72
+ ## ⚡ Démarrage rapide
73
+
74
+ ```bash
75
+ # Installation globale
76
+ npm install -g @lateos/npm-scan
77
+
78
+ # Scanner un seul paquet
79
+ npm-scan scan lodash
80
+
81
+ # Scanner votre fichier de verrouillage
82
+ npm-scan scan-lockfile
83
+
84
+ # Voir les derniers scans
85
+ npm-scan report
86
+ ```
87
+
88
+ **Pas d'installation ? Pas de problème :**
89
+
90
+ ```bash
91
+ npx @lateos/npm-scan scan commander
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 📖 Exemples d'utilisation
97
+
98
+ ### Scanner un seul paquet
99
+
100
+ ```bash
101
+ # Sortie JSON par défaut avec tous les résultats
102
+ npm-scan scan axios
103
+
104
+ # Générer un SBOM en même temps que le scan
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
+ # Appliquer une politique YAML
110
+ npm-scan scan some-package --policy .npm-scan.yml
111
+ ```
112
+
113
+ ### Scanner un fichier de verrouillage
114
+
115
+ ```bash
116
+ # Scanner les dépendances du projet actuel
117
+ npm-scan scan-lockfile
118
+
119
+ # Scanner un fichier de verrouillage spécifique
120
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
121
+ ```
122
+
123
+ ### Générer des rapports
124
+
125
+ ```bash
126
+ # Lister tous les scans récents
127
+ npm-scan report
128
+
129
+ # Voir un scan spécifique
130
+ npm-scan report -i 42
131
+
132
+ # Générer un rapport HTML (gratuit) avec tous les résultats + tableau NIST
133
+ npm-scan report -i 42 --html
134
+
135
+ # Afficher le tableau de conformité NIST 800-161
136
+ npm-scan report -i 42 --nist
137
+
138
+ # Afficher le tableau de conformité EU CRA
139
+ npm-scan report --cra
140
+
141
+ # Rapport texte (gratuit)
142
+ npm-scan report --text
143
+
144
+ # Rapport PDF (premium)
145
+ npm-scan report --pdf --license-key <key>
146
+
147
+ # Export SIEM (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
+ # Combiner tous les scans en un seul rapport
154
+ npm-scan report --html # tous les scans
155
+ npm-scan report --pdf # tous les scans (premium)
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 🧬 Capacités de détection (Taxonomie ATK)
161
+
162
+ | ID | Classe d'attaque | Méthode de détection | Sévérité | NIST 800-161 |
163
+ |---|---|---|---|---|
164
+ | **ATK-001** | Scripts de cycle de vie malveillants (`preinstall`, `postinstall`, `install`) | Statique | 🔴 élevée | SR-3.1 |
165
+ | **ATK-002** | Livraison de charge utile obfusquée (hex, base64, chaînes eval) | Statique | 🟠 moyenne | SR-4.2 |
166
+ | **ATK-003** | Vol d'identifiants (variables d'env, .npmrc, clés SSH) | Statique + Dynamique | 🔴 élevée | SR-5.3 |
167
+ | **ATK-004** | Persistance via les répertoires d'éditeur/config (.vscode, .claude, .cursor) | Statique | 🔴 élevée | SR-6.4 |
168
+ | **ATK-005** | Exfiltration réseau (API GitHub, tunneling DNS, HTTP C2) | Statique + Dynamique | ⚫ critique | SR-7.5 |
169
+ | **ATK-006** | Confusion de dépendances / accaparement d'espace de noms | Statique (fichier de verrouillage) | 🟠 moyenne | SR-2.2 |
170
+ | **ATK-007** | Typosquatting (correspondance par distance d'édition) | Statique | 🟢 faible | SR-2.1 |
171
+ | **ATK-008** | Altération de tarball (publié ≠ source) | Statique | 🔴 élevée | SR-8.1 |
172
+ | **ATK-009** | Déclencheurs conditionnels/dormants (détection CI, temporel) | Comportementale | 🔴 élevée | SR-9.2 |
173
+ | **ATK-010** | Contournement de sandbox / anti-analyse | Comportementale | 🟠 moyenne | SR-10.3 |
174
+ | **ATK-011** | Propagation transitive (dissémination latérale de type ver) | Comportementale | 🔴 élevée | SR-11.4 |
175
+
176
+ > **Comment les attaques furtives sont détectées :** ATK-009 détecte les paquets qui vérifient `process.env.CI`, sondent les noms d'hôte ou utilisent une activation temporelle. ATK-009 signale les instructions `debugger`, les sondes `os.hostname()` et l'empreinte environnementale. ATK-011 trace les graphes de dépendances peer pour détecter les schémas de propagation de type ver.
177
+ > Voir [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour la documentation complète de la surface d'évasion et des exemples de PoC.
178
+
179
+ ---
180
+
181
+ ## 📊 Sorties et rapports
182
+
183
+ ### Formats
184
+
185
+ | Format | Disponibilité | Description |
186
+ |--------|-------------|-------------|
187
+ | JSON | ✅ Gratuit | Résultats structurés lisibles par machine |
188
+ | HTML | ✅ Gratuit | Rapport HTML riche avec tableau de conformité NIST, badges de sévérité, matrice de contrôle |
189
+ | Texte | ✅ Gratuit | Rapport texte propre et adapté au terminal |
190
+ | CycloneDX SBOM | ✅ Gratuit | SBOM standard de l'industrie avec résultats intégrés comme vulnérabilités |
191
+ | SPDX SBOM | ✅ Gratuit | Format de document SPDX 2.3 |
192
+ | NIST 800-161 | ✅ Gratuit | Matrice de traçabilité des contrôles (SR-2.1 → SR-11.4) |
193
+ | EU CRA | ✅ Gratuit | Cartographie des articles du Cyber Resilience Act |
194
+ | PDF | 🔐 Premium | PDF multipage avec page de titre, tableau des résultats, matrice de conformité NIST |
195
+ | Splunk CEF | 🔐 Premium | Format d'événement commun pour l'ingestion Splunk |
196
+ | Elastic ECS | 🔐 Premium | Format Elastic Common Schema |
197
+ | Microsoft Sentinel | 🔐 Premium | Sortie formatée prête pour Sentinel |
198
+ | IBM QRadar | 🔐 Premium | Format prêt pour QRadar DSM avec correspondances QID |
199
+
200
+ ### Exemple de sortie
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
+ ## ⚙️ Configuration et utilisation avancée
219
+
220
+ ### Politique en tant que code
221
+
222
+ Définissez des listes blanches, des surcharges de sévérité, des suppressions et des seuils d'échec dans un fichier YAML :
223
+
224
+ ```yaml
225
+ # .npm-scan.yml
226
+ allowlist:
227
+ - lodash
228
+ - chalk
229
+
230
+ severity_overrides:
231
+ - id: ATK-001
232
+ severity: medium
233
+
234
+ suppress:
235
+ - atk_id: ATK-009
236
+ - package: some-package
237
+
238
+ fail_on: high
239
+ ```
240
+
241
+ ```bash
242
+ npm-scan scan target --policy .npm-scan.yml
243
+ ```
244
+
245
+ ### Variables d'environnement
246
+
247
+ | Variable | Description | Défaut |
248
+ |----------|-------------|---------|
249
+ | `NPM_SCAN_LICENSE_KEY` | Clé de licence Premium / Enterprise | — |
250
+ | `NPM_SCAN_DATA_DIR` | Répertoire d'historique des scans | `./.npm-scan` |
251
+ | `NPM_SCAN_LOG_LEVEL` | Niveau de verbosité des logs | `info` |
252
+
253
+ ### Licence premium
254
+
255
+ ```bash
256
+ # Générer une clé de développement
257
+ node -e "console.log(require('@lateos/npm-scan/backend/license').generateKey('premium'))"
258
+
259
+ # L'utiliser
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
+ ## 🔗 Intégrations
268
+
269
+ ### GitHub Actions CI (pour ce dépôt)
270
+
271
+ Chaque push et PR exécute les tests sur Node 18, 20 et 22 :
272
+
273
+ ```yaml
274
+ # .github/workflows/ci.yml
275
+ name: CI
276
+ on:
277
+ push:
278
+ branches: [ main ]
279
+ pull_request:
280
+ branches: [ main ]
281
+ jobs:
282
+ test:
283
+ runs-on: ubuntu-latest
284
+ strategy:
285
+ matrix:
286
+ node-version: [18, 20, 22]
287
+ steps:
288
+ - uses: actions/checkout@v4
289
+ - uses: actions/setup-node@v4
290
+ with:
291
+ node-version: ${{ matrix.node-version }}
292
+ cache: 'npm'
293
+ - run: npm ci
294
+ - run: npm test
295
+ - run: npm run test:coverage
296
+ - run: node --test test/detectors-corpus.test.js
297
+ - run: npm run lint
298
+ - run: npm run build
299
+ ```
300
+
301
+ ### GitHub Action (pour les utilisateurs en aval)
302
+
303
+ Scannez le `package-lock.json` de votre projet à chaque PR — détecte les typosquattings, les charges utiles obfusquées, les voleurs d'identifiants et la propagation de ver avant qu'ils n'atteignent la production :
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
+ #### Entrées de l'action
329
+
330
+ | Entrée | Défaut | Description |
331
+ |-------|---------|-------------|
332
+ | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
333
+ | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
334
+ | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
335
+ | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
336
+ | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
337
+ | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
338
+ | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
339
+
340
+ #### Sorties de l'action
341
+
342
+ | Sortie | Description |
343
+ |--------|-------------|
344
+ | `findings-count` | Nombre de résultats détectés |
345
+ | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
346
+
347
+ #### Exemple : scanner un paquet spécifique avec politique + SBOM
348
+
349
+ ```yaml
350
+ - uses: lateos/npm-scan@main
351
+ with:
352
+ scan-type: package
353
+ package: lodash
354
+ policy-file: .npm-scan.yml
355
+ sbom-format: spdx
356
+ fail-on: critical
357
+ ```
358
+
359
+ #### Exemple : scanner avec export SIEM (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
+ ### Pipeline CI/CD
370
+
371
+ Intégrez directement dans votre pipeline existant sans l'action composite :
372
+
373
+ ```bash
374
+ # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
375
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
376
+
377
+ # Scanner un paquet spécifique, échouer seulement sur critique
378
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
379
+
380
+ # Générer un SBOM comme artefact de build
381
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
382
+
383
+ # Générer un rapport de conformité HTML dans le CI
384
+ npm-scan report --html > report.html
385
+
386
+ # Télécharger le rapport comme artefact
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
+ # Tirer et exécuter
397
+ docker pull ghcr.io/lateos/npm-scan:cli
398
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
399
+
400
+ # Pipeline complet avec Compose (file d'attente basée sur Redis)
401
+ docker compose --profile pipeline up -d
402
+
403
+ # CLI avec stockage persistant
404
+ docker compose --profile cli up -d
405
+ ```
406
+
407
+ Images multi-arch disponibles pour `linux/amd64` et `linux/arm64`.
408
+
409
+ ### GitHub Action (pour les utilisateurs en aval)
410
+
411
+ Scannez le `package-lock.json` de votre projet à chaque PR — détecte les typosquattings, les charges utiles obfusquées, les voleurs d'identifiants et la propagation de ver avant qu'ils n'atteignent la production :
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
+ #### Entrées de l'action
437
+
438
+ | Entrée | Défaut | Description |
439
+ |-------|---------|-------------|
440
+ | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
441
+ | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
442
+ | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
443
+ | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
444
+ | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
445
+ | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
446
+ | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
447
+
448
+ #### Sorties de l'action
449
+
450
+ | Sortie | Description |
451
+ |--------|-------------|
452
+ | `findings-count` | Nombre de résultats détectés |
453
+ | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
454
+
455
+ #### Exemple : scanner un paquet spécifique avec politique + SBOM
456
+
457
+ ```yaml
458
+ - uses: lateos/npm-scan@main
459
+ with:
460
+ scan-type: package
461
+ package: lodash
462
+ policy-file: .npm-scan.yml
463
+ sbom-format: spdx
464
+ fail-on: critical
465
+ ```
466
+
467
+ #### Exemple : scanner avec export SIEM (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
+ ### Pipeline CI/CD
478
+
479
+ Intégrez directement dans votre pipeline existant sans l'action composite :
480
+
481
+ ```bash
482
+ # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
483
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
484
+
485
+ # Scanner un paquet spécifique, échouer seulement sur critique
486
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
487
+
488
+ # Générer un SBOM comme artefact de build
489
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
490
+
491
+ # Générer un rapport de conformité HTML dans le CI
492
+ npm-scan report --html > report.html
493
+
494
+ # Télécharger le rapport comme artefact
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
+ # Tirer et exécuter
505
+ docker pull ghcr.io/lateos/npm-scan:cli
506
+ docker run --rm ghcr.io/lateos/npm-scan:cli scan lodash
507
+
508
+ # Pipeline complet avec Compose (file d'attente basée sur Redis)
509
+ docker compose --profile pipeline up -d
510
+
511
+ # CLI avec stockage persistant
512
+ docker compose --profile cli up -d
513
+ ```
514
+
515
+ Images multi-arch disponibles pour `linux/amd64` et `linux/arm64`.
516
+
517
+ ---
518
+
519
+ ## 🗺️ Feuille de route et fonctionnalités Enterprise
520
+
521
+ ### Niveau gratuit (livré)
522
+
523
+ - Les 11 détecteurs ATK (statique + comportemental)
524
+ - Sortie SBOM (CycloneDX + SPDX)
525
+ - Rapports HTML, texte et conformité (NIST + EU CRA)
526
+ - Moteur de politique en tant que code (YAML)
527
+ - Historique de scan local SQLite
528
+ - GitHub Action
529
+ - Images Docker + pipeline Compose
530
+
531
+ ### Premium (🔐 clé de licence)
532
+
533
+ - Rapports de conformité PDF avec matrice de traçabilité NIST
534
+ - Export SIEM (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
535
+ - Sandbox dynamique (basé sur gVisor — ATK-008–010)
536
+ - Analyse d'atteignabilité (filtrage par graphe d'appels)
537
+
538
+ ### Enterprise (🏢 licence personnalisée)
539
+
540
+ - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
541
+ - API REST + webhooks (FastAPI)
542
+ - RBAC d'équipe + journaux d'audit
543
+ - Chart Helm pour déploiement Kubernetes
544
+ - Backend PostgreSQL pour niveau hébergé/équipe
545
+ - Support prioritaire avec garantie SLA
546
+
547
+ ---
548
+
549
+ ## 🤝 Contribuer
550
+
551
+ Nous accueillons les contributions — en particulier les nouveaux détecteurs, l'amélioration de la résistance à l'évasion et les modèles de conformité.
552
+
553
+ Consultez [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour le processus de gouvernance ATK. Chaque nouveau détecteur nécessite :
554
+
555
+ 1. Un échantillon de preuve de concept
556
+ 2. Une règle de détection avec tests
557
+ 3. Une analyse des faux positifs sur les 500 premiers paquets npm
558
+ 4. Un mappage de contrôle NIST 800-161
559
+
560
+ ### Tests
561
+
562
+ Le projet utilise **le moteur de test natif Node.js** (`node:test` + `assert/strict`).
563
+
564
+ ```bash
565
+ # Exécuter tous les tests
566
+ npm test
567
+
568
+ # Exécuter les tests avec couverture
569
+ npm run test:coverage
570
+
571
+ # Exécuter les tests avec sortie détaillée
572
+ npm run test:verbose
573
+
574
+ # Exécuter le corpus local malveillant/clean (aucun réseau requis)
575
+ node --test test/detectors-corpus.test.js
576
+ ```
577
+
578
+ **Structure des tests :**
579
+ - `test/fixtures/mock-data.js` — simulations partagées, paquets et extraits de code
580
+ - `test/db.test.js` — CRUD de base de données (sauvegarde, requête, persistance)
581
+ - `test/detectors-edge-cases.test.js` — tests limites par détecteur (no-ops, nettoyages, sévérité)
582
+ - `test/detectors-corpus.test.js` — 33 tarballs malveillants + 50 propres (hors ligne)
583
+ - `test/fetch.test.js` — extraction de tarball, nettoyage de répertoire temporaire
584
+ - `test/policy-edge-cases.test.js` — cas limites dans la suppression, la surcharge, la validation de chargement
585
+ - `test/report-snapshots.test.js` — assertions de format HTML/texte/CRA/PDF
586
+ - `test/cli.test.js` — tests d'intégration commander (aide, version, scan, rapport, gestion d'erreurs)
587
+
588
+ ### Besoin d'aide ?
589
+
590
+ - 📖 Lire le [plan du projet](docs/project-plan.md)
591
+ - 🧬 Consulter la [taxonomie des attaques](docs/attack-taxonomy.md)
592
+ - 🐛 Ouvrir une issue ou une PR
593
+
594
+ ---
595
+
596
+ ## 📄 Licence
597
+
598
+ Apache-2.0 core + Commons Clause.
599
+ Voir [`LICENSING.md`](LICENSING.md) pour la limite exacte entre les fonctionnalités gratuites et premium.
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
+ **Scannez votre premier paquet dès maintenant :**
616
+
617
+ ```bash
618
+ npx @lateos/npm-scan scan lodash
619
+ ```