@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.fr.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
|
+
**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
|
+
```
|