@lateos/npm-scan 0.18.2 → 0.18.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.
Files changed (89) hide show
  1. package/.dockerignore +20 -20
  2. package/.husky/pre-commit +1 -1
  3. package/CHANGELOG.md +233 -233
  4. package/LICENSING.md +19 -19
  5. package/README.de.md +708 -708
  6. package/README.fr.md +707 -707
  7. package/README.ja.md +704 -704
  8. package/README.md +826 -826
  9. package/README.zh.md +708 -708
  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/cve-2026-48710-badhost/codePattern.js +99 -99
  26. package/backend/detectors/cve-2026-48710-badhost/findings.js +105 -105
  27. package/backend/detectors/cve-2026-48710-badhost/index.js +15 -15
  28. package/backend/detectors/cve-2026-48710-badhost/manifest.js +305 -305
  29. package/backend/detectors/cve-2026-48710-badhost/transitive.js +189 -189
  30. package/backend/detectors/hf-impersonation/index.js +396 -396
  31. package/backend/detectors/hf-impersonation/jaro-winkler.js +44 -44
  32. package/backend/detectors/hf-impersonation/known-orgs.js +5 -5
  33. package/backend/detectors/hf-impersonation/simhash.js +46 -46
  34. package/backend/detectors/index.js +81 -81
  35. package/backend/detectors/megalodon/d1-workflow-scan.js +147 -147
  36. package/backend/detectors/megalodon/d2-credential-harvest.js +61 -61
  37. package/backend/detectors/megalodon/d3-publish-velocity.js +67 -67
  38. package/backend/detectors/megalodon/d4-publisher-drift.js +124 -124
  39. package/backend/detectors/megalodon/d5-bot-commit-identity.js +3 -3
  40. package/backend/detectors/megalodon/d6-date-anachronism.js +3 -3
  41. package/backend/detectors/megalodon/index.js +80 -80
  42. package/backend/detectors/megalodon/types.js +9 -9
  43. package/backend/detectors/mini-shai-hulud/d1-burst-publish.js +42 -42
  44. package/backend/detectors/mini-shai-hulud/d2-sibling-compromise.js +116 -116
  45. package/backend/detectors/mini-shai-hulud/d3-slsa-mismatch.js +72 -72
  46. package/backend/detectors/mini-shai-hulud/d4-maintainer-anomaly.js +45 -45
  47. package/backend/detectors/mini-shai-hulud/d5-ioc-check.js +95 -95
  48. package/backend/detectors/mini-shai-hulud/d6-token-exfil.js +38 -38
  49. package/backend/detectors/mini-shai-hulud/index.js +118 -118
  50. package/backend/detectors/mini-shai-hulud/iocs.json +79 -79
  51. package/backend/fetch.js +175 -175
  52. package/backend/index.js +4 -4
  53. package/backend/license.js +89 -89
  54. package/backend/lockfile.js +379 -379
  55. package/backend/pdf.js +245 -245
  56. package/backend/policy.js +193 -193
  57. package/backend/report.js +254 -254
  58. package/backend/sbom.js +66 -66
  59. package/backend/siem/cef.js +32 -32
  60. package/backend/siem/ecs.js +40 -40
  61. package/backend/siem/index.js +18 -18
  62. package/backend/siem/qradar.js +56 -56
  63. package/backend/siem/sentinel.js +27 -27
  64. package/backend/vsix-scan/detectors/activation-event-risk.js +116 -116
  65. package/backend/vsix-scan/detectors/burst-publish.js +52 -52
  66. package/backend/vsix-scan/detectors/exfil-pattern.js +88 -88
  67. package/backend/vsix-scan/detectors/known-ioc.js +105 -105
  68. package/backend/vsix-scan/detectors/orphan-commit-fetch.js +69 -69
  69. package/backend/vsix-scan/detectors/publisher-anomaly.js +70 -70
  70. package/backend/vsix-scan/index.js +183 -183
  71. package/backend/vsix-scan/marketplace-client.js +145 -145
  72. package/backend/vsix-scan/vsix-iocs.json +31 -31
  73. package/cli/cli.js +458 -458
  74. package/deploy/helm/npm-scan/Chart.yaml +21 -21
  75. package/deploy/helm/npm-scan/templates/_helpers.tpl +8 -8
  76. package/deploy/helm/npm-scan/templates/api.yaml +93 -93
  77. package/deploy/helm/npm-scan/templates/ingress.yaml +27 -27
  78. package/deploy/helm/npm-scan/templates/postgresql.yaml +66 -66
  79. package/deploy/helm/npm-scan/templates/secrets.yaml +18 -18
  80. package/deploy/helm/npm-scan/templates/worker.yaml +31 -31
  81. package/deploy/helm/npm-scan/values.byoc.yaml +74 -74
  82. package/deploy/helm/npm-scan/values.yaml +102 -102
  83. package/package.json +57 -57
  84. package/scripts/download-corpus.js +30 -30
  85. package/scripts/gen-mal-corpus.js +34 -34
  86. package/test/fixtures/lockfiles/npm-lock.json +68 -68
  87. package/test/fixtures/lockfiles/pnpm-lock.yaml +117 -117
  88. package/test/fixtures/lockfiles/yarn.lock +103 -103
  89. package/test/fixtures/mock-data.js +69 -69
package/README.fr.md CHANGED
@@ -1,709 +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
- **Sécurité moderne de la chaîne d'approvisionnement pour l'écosystème npm.**
18
- 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.
19
-
20
- ---
21
-
22
- ## 📌 Le problème
23
-
24
- La vague d'attaques sur la chaîne d'approvisionnement npm de 2025-2026 a prouvé que les outils traditionnels ne suffisent plus.
25
-
26
- 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.
27
-
28
- La **campagne Megalodon** (2026) a à elle seule compromis plus de 5 500 dépôts via de fausses PR GitHub, l'injection de workflows malveillants et l'exfiltration d'identifiants cloud - le tout coordonné par un seul acteur automatisant l'ensemble de la chaîne de destruction. **@lateos/npm-scan** détecte désormais les artefacts de cette campagne dès la première utilisation.
29
-
30
- La **campagne de ver Mini Shai-Hulud** (mai 2026) a frappé l'écosystème npm en trois vagues - détournement CI/CD TanStack (84 artefacts en 6 minutes), compromission du mainteneur AntV/atool (600+ versions malveillantes dans 300+ packages), et empoisonnement de l'extension VS Code Nx Console (CVE-2026-48027) - toutes utilisant l'obfuscation ctf-scramble-v2, la persistance démonisée avec vérifications d'environnement CI, des killswitches géographiques ciblant les régions sanctionnées, et des canaux C2 GitHub dead-drop pour la récupération de jetons. **@lateos/npm-scan** détecte désormais les 10 signaux Mini Shai-Hulud répartis sur deux suites de détection.
31
-
32
- Un vecteur d'attaque croissant est **l'usurpation d'organisation HuggingFace** - des packages qui se font passer pour des dépôts de modèles HF légitimes pour tromper les utilisateurs.
33
-
34
- La **campagne TrapDoor** (mai 2026) couvre npm, PyPI et Crates.io - 34 packages malveillants, 384+ versions attribuées à un seul éditeur.
35
-
36
- La **compromission node-ipc** (14 mai 2026) a utilisé un domaine de maintenance expiré pour détourner l'un des packages les plus dépendus de npm.
37
-
38
- La **campagne de typosquattage massif (vpmdhaj)** (mai 2026) a utilisé le compte mainteneur npm `vpmdhaj` pour publier 14 packages typosquattés en 4 heures - ciblant les environnements AWS/CI/CD avec des stagers de pré-installation, un abus du runtime Bun, et l'exfiltration d'identifiants cloud. **@lateos/npm-scan** détecte désormais les 3 signaux de la campagne de typosquattage.
39
-
40
- La **campagne d'empoisonnement du registre Axios** (mai 2026) a compromis les métadonnées du package axios pour publier `axios@1.14.1` et `axios@0.30.4` avec des dépendances injectées contenant des RAT multiplateformes. **@lateos/npm-scan** détecte désormais les 3 signaux d'empoisonnement Axios.
41
-
42
- **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.
43
-
44
- **@lateos/npm-scan** a été conçu pour ce moment.
45
-
46
- ---
47
-
48
- ## 🔬 Pourquoi @lateos/npm-scan ?
49
-
50
- | Capacité | npm audit | Snyk | Socket | **@lateos/npm-scan** |
51
- |---|---|---|---|---|---|
52
- | Correspondance CVE connus | ✅ | ✅ | ❌ | ✅ |
53
- | Analyse statique | ❌ | ✅ | ✅ | ✅ |
54
- | Détection de charges utiles obfusquées | ❌ | ❌ | ❌ | ✅ |
55
- | Analyse heuristique au niveau AST | ❌ | ❌ | ❌ | ✅ |
56
- | Bac à sable comportemental runtime | ❌ | ❌ | ✅ | ✅ |
57
- | Détection de déclencheurs conditionnels (ATK-009) | ❌ | ❌ | ❌ | ✅ |
58
- | Détection de contournement de sandbox (ATK-010) | ❌ | ❌ | ❌ | ✅ |
59
- | Propagation transitive de ver (ATK-011) | ❌ | ❌ | ❌ | ✅ |
60
- | Détection de campagne (Megalodon CI/CD) | ❌ | ❌ | ❌ | ✅ |
61
- | Détection de campagne de ver (Mini Shai-Hulud Vagues 1-3) | ❌ | ❌ | ❌ | ✅ |
62
- | Détection d'usurpation HF (dépôt de modèles + clone README) | ❌ | ❌ | ❌ | ✅ |
63
- | Analyse d'extension VS Code (--vsix) | ❌ | ❌ | ❌ | ✅ |
64
- | Détection de vulnérabilité Python (CVE-2026-48710 BadHost) | ❌ | ❌ | ❌ | ✅ |
65
- | Détection d'attaque multi-écosystème (TrapDoor) | ❌ | ❌ | ❌ | ✅ |
66
- | Détection de détournement de domaine expiré (node-ipc) | ❌ | ❌ | ❌ | ✅ |
67
- | Détection d'obfuscation de malware (ctf-scramble-v2) | ❌ | ❌ | ❌ | ✅ |
68
- | Campagne de typosquattage massif (mainteneur vpmdhaj) | ❌ | ❌ | ❌ | ✅ |
69
- | Détection d'empoisonnement de registre (versions axios) | ❌ | ❌ | ❌ | ✅ |
70
- | Taxonomie d'attaques (série ATK) | ❌ | ❌ | ❌ | ✅ |
71
- | Sortie SBOM (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
72
- | Rapport de conformité NIST 800-161 | ❌ | ❌ | ❌ | ✅ |
73
- | Rapport de conformité EU CRA | ❌ | ❌ | ❌ | ✅ |
74
- | Export SIEM (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
75
- | Exécution entièrement locale - aucune télémétrie | ✅ | ❌ | ❌ | ✅ |
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
+ **Sécurité moderne de la chaîne d'approvisionnement pour l'écosystème npm.**
18
+ 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.
19
+
20
+ ---
21
+
22
+ ## 📌 Le problème
23
+
24
+ La vague d'attaques sur la chaîne d'approvisionnement npm de 2025-2026 a prouvé que les outils traditionnels ne suffisent plus.
25
+
26
+ 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.
27
+
28
+ La **campagne Megalodon** (2026) a à elle seule compromis plus de 5 500 dépôts via de fausses PR GitHub, l'injection de workflows malveillants et l'exfiltration d'identifiants cloud - le tout coordonné par un seul acteur automatisant l'ensemble de la chaîne de destruction. **@lateos/npm-scan** détecte désormais les artefacts de cette campagne dès la première utilisation.
29
+
30
+ La **campagne de ver Mini Shai-Hulud** (mai 2026) a frappé l'écosystème npm en trois vagues - détournement CI/CD TanStack (84 artefacts en 6 minutes), compromission du mainteneur AntV/atool (600+ versions malveillantes dans 300+ packages), et empoisonnement de l'extension VS Code Nx Console (CVE-2026-48027) - toutes utilisant l'obfuscation ctf-scramble-v2, la persistance démonisée avec vérifications d'environnement CI, des killswitches géographiques ciblant les régions sanctionnées, et des canaux C2 GitHub dead-drop pour la récupération de jetons. **@lateos/npm-scan** détecte désormais les 10 signaux Mini Shai-Hulud répartis sur deux suites de détection.
31
+
32
+ Un vecteur d'attaque croissant est **l'usurpation d'organisation HuggingFace** - des packages qui se font passer pour des dépôts de modèles HF légitimes pour tromper les utilisateurs.
33
+
34
+ La **campagne TrapDoor** (mai 2026) couvre npm, PyPI et Crates.io - 34 packages malveillants, 384+ versions attribuées à un seul éditeur.
35
+
36
+ La **compromission node-ipc** (14 mai 2026) a utilisé un domaine de maintenance expiré pour détourner l'un des packages les plus dépendus de npm.
37
+
38
+ La **campagne de typosquattage massif (vpmdhaj)** (mai 2026) a utilisé le compte mainteneur npm `vpmdhaj` pour publier 14 packages typosquattés en 4 heures - ciblant les environnements AWS/CI/CD avec des stagers de pré-installation, un abus du runtime Bun, et l'exfiltration d'identifiants cloud. **@lateos/npm-scan** détecte désormais les 3 signaux de la campagne de typosquattage.
39
+
40
+ La **campagne d'empoisonnement du registre Axios** (mai 2026) a compromis les métadonnées du package axios pour publier `axios@1.14.1` et `axios@0.30.4` avec des dépendances injectées contenant des RAT multiplateformes. **@lateos/npm-scan** détecte désormais les 3 signaux d'empoisonnement Axios.
41
+
42
+ **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.
43
+
44
+ **@lateos/npm-scan** a été conçu pour ce moment.
45
+
46
+ ---
47
+
48
+ ## 🔬 Pourquoi @lateos/npm-scan ?
49
+
50
+ | Capacité | npm audit | Snyk | Socket | **@lateos/npm-scan** |
51
+ |---|---|---|---|---|---|
52
+ | Correspondance CVE connus | ✅ | ✅ | ❌ | ✅ |
53
+ | Analyse statique | ❌ | ✅ | ✅ | ✅ |
54
+ | Détection de charges utiles obfusquées | ❌ | ❌ | ❌ | ✅ |
55
+ | Analyse heuristique au niveau AST | ❌ | ❌ | ❌ | ✅ |
56
+ | Bac à sable comportemental runtime | ❌ | ❌ | ✅ | ✅ |
57
+ | Détection de déclencheurs conditionnels (ATK-009) | ❌ | ❌ | ❌ | ✅ |
58
+ | Détection de contournement de sandbox (ATK-010) | ❌ | ❌ | ❌ | ✅ |
59
+ | Propagation transitive de ver (ATK-011) | ❌ | ❌ | ❌ | ✅ |
60
+ | Détection de campagne (Megalodon CI/CD) | ❌ | ❌ | ❌ | ✅ |
61
+ | Détection de campagne de ver (Mini Shai-Hulud Vagues 1-3) | ❌ | ❌ | ❌ | ✅ |
62
+ | Détection d'usurpation HF (dépôt de modèles + clone README) | ❌ | ❌ | ❌ | ✅ |
63
+ | Analyse d'extension VS Code (--vsix) | ❌ | ❌ | ❌ | ✅ |
64
+ | Détection de vulnérabilité Python (CVE-2026-48710 BadHost) | ❌ | ❌ | ❌ | ✅ |
65
+ | Détection d'attaque multi-écosystème (TrapDoor) | ❌ | ❌ | ❌ | ✅ |
66
+ | Détection de détournement de domaine expiré (node-ipc) | ❌ | ❌ | ❌ | ✅ |
67
+ | Détection d'obfuscation de malware (ctf-scramble-v2) | ❌ | ❌ | ❌ | ✅ |
68
+ | Campagne de typosquattage massif (mainteneur vpmdhaj) | ❌ | ❌ | ❌ | ✅ |
69
+ | Détection d'empoisonnement de registre (versions axios) | ❌ | ❌ | ❌ | ✅ |
70
+ | Taxonomie d'attaques (série ATK) | ❌ | ❌ | ❌ | ✅ |
71
+ | Sortie SBOM (CycloneDX + SPDX) | ❌ | ✅ | ❌ | ✅ |
72
+ | Rapport de conformité NIST 800-161 | ❌ | ❌ | ❌ | ✅ |
73
+ | Rapport de conformité EU CRA | ❌ | ❌ | ❌ | ✅ |
74
+ | Export SIEM (CEF / ECS / Sentinel / QRadar) | ❌ | ❌ | ❌ | ✅ |
75
+ | Exécution entièrement locale - aucune télémétrie | ✅ | ❌ | ❌ | ✅ |
76
76
  | Politique en tant que code (listes blanches YAML) | ❌ | ❌ | ❌ | ✅ |
77
-
78
- > **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.
79
-
80
- ---
81
-
82
- ## ✨ Fonctionnalités clés
83
-
84
- | Icône | Fonctionnalité | Description |
85
- |------|---------|-------------|
86
- | 🕵️ | **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 |
87
- | 🧠 | **Détection comportementale** | Identifie les déclencheurs conditionnels (temporels, conscients du CI), le contournement de sandbox et les modèles d'activation dormante |
88
- | 🧬 | **Taxonomie d'attaques ATK** | 11 types d'attaques classifiés avec correspondances NIST 800-161 - versionnés, documentés et PR-ables |
89
- | 🪱 | **Détection de campagne de ver** | Mini Shai-Hulud - 10 sous-vérifications réparties sur deux suites détectant les bursts de publication, les compromissions de pairs, les anomalies d'attestation SLSA, la dérive d'éditeur, la correspondance IOC, l'exfiltration de jetons, l'obfuscation ctf-scramble-v2, la persistance démonisée, les killswitches géographiques et les canaux C2 GitHub |
90
- | 🧩 | **Analyse d'extension VSIX** | `npm-scan scan --vsix` - détecte les attaques de la chaîne d'approvisionnement du Marketplace VS Code |
91
- | 🐍 | **Détection de vulnérabilité Python** | CVE-2026-48710 (BadHost) - injection d'en-tête Host Starlette |
92
- | 🪤 | **Détection d'attaque multi-écosystème** | TrapDoor - 9 sous-vérifications |
93
- | 📡 | **Détection de détournement de domaine expiré** | node-ipc - 11 sous-vérifications |
94
- | ☣️ | **Détection d'obfuscation de malware** | ctf-scramble-v2 - analyse des distributions à la recherche de motifs d'obfuscation de malware connus, arrêt immédiat avec condition d'arrêt de sévérité CRITIQUE |
95
- | 🎭 | **Détection de campagne de typosquattage massif** | Liste noire du mainteneur vpmdhaj avec condition d'arrêt, détection de typosquattage basée sur Levenshtein, identification de stager de pré-installation, motifs d'exfiltration d'identifiants AWS ECS/Vault/GitHub |
96
- | ☠️ | **Détection d'empoisonnement de registre** | Liste noire des versions Axios (1.14.1/0.30.4) avec condition d'arrêt, découverte de dépendance leurre (plain-crypto-js), détection de RAT multiplateforme |
97
- | 🔏 | **Piste d'audit de provenance** | Cadre Aureus-Elicitor v1.7 - manifests de détection signés HMAC-SHA256, pistes d'audit vérifiées par hachage de contenu, URLs de provenance de règle, attribution de source de campagne |
98
- | 📦 | **Génération SBOM** | CycloneDX 1.5 et SPDX 2.3 avec résultats intégrés comme vulnérabilités |
99
- | 🧾 | **Rapports de conformité** | Matrice de traçabilité NIST SP 800-161 + cartographie EU Cyber Resilience Act (gratuit) |
100
- | 🔌 | **Export SIEM** | Formats Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar (premium) |
101
- | 📜 | **Politique en tant que code** | Moteur de politique YAML/JSON avec listes blanches, surcharges de sévérité, suppressions et seuils d'échec |
102
- | 🐳 | **Docker + GitHub Action** | Images multi-arch, pipeline Compose en une commande, action de scan PR |
103
- | 🛡️ | **Zéro télémétrie** | Aucune donnée ne quitte votre machine. Pas de cloud. Pas de rappels. |
104
- | 💾 | **Historique de scan local** | Persistance basée sur SQLite, zéro dépendance externe |
105
-
106
- ---
107
-
108
- ## ⚡ Démarrage rapide
109
-
110
- ```bash
111
- # Installation globale
112
- npm install -g @lateos/npm-scan
113
-
114
- # Scanner un seul paquet
115
- npm-scan scan lodash
116
-
117
- # Scanner votre fichier de verrouillage
118
- npm-scan scan-lockfile
119
-
120
- # Voir les derniers scans
121
- npm-scan report
122
- ```
123
-
124
- **Pas d'installation ? Pas de problème :**
125
-
126
- ```bash
127
- npx @lateos/npm-scan scan commander
128
- ```
129
-
130
- ---
131
-
132
- ## 🐳 Exécutez @lateos/npm-scan partout avec Docker — zéro installation
133
-
134
- ```bash
135
- # Tirez et exécutez un scan unique — pas de Node.js ni npm requis
136
- docker run --rm lateos/npm-scan:cli scan lodash
137
-
138
- # Pipeline complet avec stockage persistant et Compose
139
- docker compose --profile pipeline up -d
140
- ```
141
-
142
- Pas de Node.js. Pas de `npm install`. Pas de paquets globaux. Fonctionne sur tout système avec Docker — serveurs CI, environnements air-gap, clusters Kubernetes. Images multi-arch pour `linux/amd64` et `linux/arm64`.
143
-
144
- ---
145
-
146
- ## 🛡️ Prêt pour le Gouvernement et SOC 2
147
-
148
- | Fonctionnalité | Contrôles SOC 2 | NIST 800-161 | Alignement STIG/FedRAMP |
149
- |----------------|-------|--------------|--------------|
150
- | Journaux d'audit (--audit-log) | CC6.8 | AU-2 | ✓ |
151
- | Crypto FIPS (--fips) | CC6.1 | SC-13 | ✓ |
152
- | Rapport STIG (--stig) | CC7.3 | RA-5 | ✓ |
153
- | Cache hors ligne (--cache-dir) | A1.2 | SC-8 | ✓ |
154
- | Provenance Sigstore | CC6.2 | SI-7 | ✓ |
155
- | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
156
-
157
- ```bash
158
- # Scan conforme en environnement hermétique
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
- ## 📖 Exemples d'utilisation
166
-
167
- ### Scanner un seul paquet
168
-
169
- ```bash
170
- # Sortie JSON par défaut avec tous les résultats
171
- npm-scan scan axios
172
-
173
- # Générer un SBOM en même temps que le scan
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
- # Appliquer une politique YAML
179
- npm-scan scan some-package --policy .npm-scan.yml
180
-
181
- # Scanner un fichier tarball local (pas de téléchargement depuis le registre)
182
- npm-scan scan --file path/to/malicious-package.tgz
183
- ```
184
-
185
- ### Scanner un fichier de verrouillage
186
-
187
- ```bash
188
- # Scanner les dépendances du projet actuel
189
- npm-scan scan-lockfile
190
-
191
- # Scanner un fichier de verrouillage spécifique
192
- npm-scan scan-lockfile -f ./path/to/package-lock.json
193
-
194
- # Échouer en CI/CD sur les découvertes de severity haute ou critique (code de sortie 1)
195
- npm-scan scan-lockfile --fail-on high
196
-
197
- # Échouer sur toute découverte (low et au-delà)
198
- npm-scan scan-lockfile --fail-on low
199
-
200
- # Générer une sortie SARIF v2.1 pour GitHub Advanced Security / VS Code
201
- npm-scan scan-lockfile --sarif results.sarif
202
-
203
- # Afficher uniquement le score de risque (0-10) pour les tableaux de bord/seuils
204
- npm-scan scan-lockfile --score-only
205
- ```
206
-
207
- ### Générer des rapports
208
-
209
- ```bash
210
- # Lister tous les scans récents
211
- npm-scan report
212
-
213
- # Voir un scan spécifique
214
- npm-scan report -i 42
215
-
216
- # Générer un rapport HTML (gratuit) avec tous les résultats + tableau NIST
217
- npm-scan report -i 42 --html
218
-
219
- # Afficher le tableau de conformité NIST 800-161
220
- npm-scan report -i 42 --nist
221
-
222
- # Afficher le tableau de conformité EU CRA
223
- npm-scan report --cra
224
-
225
- # Export CSV pour Excel / Sheets (prêt pour audit)
226
- npm-scan report --csv risks.csv
227
- npm-scan scan lodash --csv # CSV vers stdout
228
-
229
- # Rapport texte (gratuit)
230
- npm-scan report --text
231
-
232
- # Rapport PDF (premium)
233
- npm-scan report --pdf --license-key <key>
234
-
235
- # Export SIEM (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
- # Combiner tous les scans en un seul rapport
242
- npm-scan report --html # tous les scans
243
- npm-scan report --pdf # tous les scans (premium)
244
- ```
245
-
246
- ---
247
-
248
- ## 🧬 Capacités de détection (Taxonomie ATK)
249
-
250
- | ID | Classe d'attaque | Méthode de détection | Sévérité | NIST 800-161 |
251
- |---|---|---|---|---|
252
- | **ATK-001** | Scripts de cycle de vie malveillants (`preinstall`, `postinstall`, `install`) | Statique | 🔴 élevée | SR-3.1 |
253
- | **ATK-002** | Livraison de charge utile obfusquée (hex, base64, chaînes eval) | Statique | 🟠 moyenne | SR-4.2 |
254
- | **ATK-003** | Vol d'identifiants (variables d'env, .npmrc, clés SSH) | Statique + Dynamique | 🔴 élevée | SR-5.3 |
255
- | **ATK-004** | Persistance via les répertoires d'éditeur/config (.vscode, .claude, .cursor) | Statique | 🔴 élevée | SR-6.4 |
256
- | **ATK-005** | Exfiltration réseau (API GitHub, tunneling DNS, HTTP C2) | Statique + Dynamique | ⚫ critique | SR-7.5 |
257
- | **ATK-006** | Confusion de dépendances / accaparement d'espace de noms | Statique (fichier de verrouillage) | 🟠 moyenne | SR-2.2 |
258
- | **ATK-007** | Typosquatting (correspondance par distance d'édition) | Statique | 🟢 faible | SR-2.1 |
259
- | **ATK-008** | Altération de tarball (publié ≠ source) | Statique | 🔴 élevée | SR-8.1 |
260
- | **ATK-009** | Déclencheurs conditionnels/dormants (détection CI, temporel) | Comportementale | 🔴 élevée | SR-9.2 |
261
- | **ATK-010** | Contournement de sandbox / anti-analyse | Comportementale | 🟠 moyenne | SR-10.3 |
262
- | **ATK-011** | Propagation transitive (dissémination latérale de type ver) | Comportementale | 🔴 élevée | SR-11.4 |
263
- | **CVE-2026-48710** | BadHost — contournement d'authentification Starlette par injection d'en-tête Host (CVE-2026-48710, CVSS 7.0). Détection de version de dépendance Python (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg), heuristique transitive (15 paquets aval connus : fastapi, vllm, litellm, serveurs MCP, etc.), analyse statique de code pour `request.url.path` dangereux en contexte auth/middleware avec suppression par `request.scope["path"]` | Statique + Registre | 🔴 élevée / 🟠 moyenne / ℹ️ info | SR-3.1, SR-5.3 |
264
- | **TRAPDOOR** | Campagne d'attaque multi-écosystème TrapDoor — marqueur de campagne P-2024-001, empreinte de charge utile trap-core.js, liste noire d'éditeur asdxzxc, exfiltration d'identifiants via Gist, empoisonnement de contexte IA (Unicode largeur nulle), noms leurres crypto/DeFi, chiffrement Fernet+ECDH, clé XOR cargo-build-helper-2026, validation d'identifiants STS/API GitHub | Statique + Registre | 🟠 moyenne / 🔴 élevée / ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
265
- | **NODE_IPC_COMPROMISE** | Compromission de la chaîne d'approvisionnement node-ipc (14 mai 2026) — liste noire de versions (9.1.6/9.2.3/12.0.1) avec épingle de sécurité, vérification SHA-256 du tarball, injection IIFE de charge utile CJS, DNS sur port non standard, résolveur d'amorçage sh.azurestaticprovider.net, zone d'exfiltration DNS TXT bt.node.js, déclencheur d'exécution setImmediate(), artefacts de staging ~/nt-*/, éditeur non autorisé atiertant, détection du rayon d'impact dans les lockfiles avec recommandations d'épingle | Statique + Registre | ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
266
- | **MSH_SUPPLEMENT** | Supplément Mini Shai-Hulud - obfuscation ctf-scramble-v2 (ARRÊT sur correspondance), persistance de démonisation, détection de killswitch géographique (ru_RU/be_BY), indicateurs C2 dead-drop (OhNoWhatsGoingOnWithGitHub) | Statique + Comportementale | ⚫ critique | SR-3.1, SR-7.5, SR-9.2 |
267
- | **TYPOSQUAT_VPMDHAJ** | Campagne de typosquattage massif (vpmdhaj) - liste noire de mainteneur (ARRÊT sur correspondance), détection de préfixe d'espace de noms vpmdhaj-*, correspondance Levenshtein, stagers de pré-installation, exfiltration d'identifiants cloud (AWS IMDSv2, ECS, Vault, GitHub) | Statique + Registre | ⚫ critique | SR-2.1, SR-3.1, SR-5.3 |
268
- | **AXIOS_POISONING** | Empoisonnement du registre Axios - liste noire de versions (1.14.1/0.30.4, ARRÊT sur correspondance), injection de dépendance leurre (plain-crypto-js), détection de RAT multiplateforme (PowerShell, launchd, systemd, DLL, C2) | Statique + Comportementale | ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
269
-
270
- > **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.
271
- > Voir [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour la documentation complète de la surface d'évasion et des exemples de PoC.
272
-
273
- ---
274
-
275
- ## 📊 Sorties et rapports
276
-
277
- ### Formats
278
-
279
- | Format | Disponibilité | Description |
280
- |--------|-------------|-------------|
281
- | JSON | ✅ Gratuit | Résultats structurés lisibles par machine |
282
- | HTML | ✅ Gratuit | Rapport HTML riche avec tableau de conformité NIST, badges de sévérité, matrice de contrôle |
283
- | Texte | ✅ Gratuit | Rapport texte propre et adapté au terminal |
284
- | CycloneDX SBOM | ✅ Gratuit | SBOM standard de l'industrie avec résultats intégrés comme vulnérabilités |
285
- | SPDX SBOM | ✅ Gratuit | Format de document SPDX 2.3 |
286
- | NIST 800-161 | ✅ Gratuit | Matrice de traçabilité des contrôles (SR-2.1 → SR-11.4) |
287
- | EU CRA | ✅ Gratuit | Cartographie des articles du Cyber Resilience Act |
288
- | PDF | 🔐 Premium | PDF multipage avec page de titre, tableau des résultats, matrice de conformité NIST |
289
- | Splunk CEF | 🔐 Premium | Format d'événement commun pour l'ingestion Splunk |
290
- | Elastic ECS | 🔐 Premium | Format Elastic Common Schema |
291
- | Microsoft Sentinel | 🔐 Premium | Sortie formatée prête pour Sentinel |
292
- | IBM QRadar | 🔐 Premium | Format prêt pour QRadar DSM avec correspondances QID |
293
-
294
- ### Exemple de sortie
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
- ## ⚙️ Configuration et utilisation avancée
313
-
314
- ### Politique en tant que code
315
-
316
- Définissez des listes blanches, des surcharges de sévérité, des suppressions et des seuils d'échec dans un fichier YAML :
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
- ### Variables d'environnement
340
-
341
- | Variable | Description | Défaut |
342
- |----------|-------------|---------|
343
- | `NPM_SCAN_LICENSE_KEY` | Clé de licence Premium / Enterprise | — |
344
- | `NPM_SCAN_DATA_DIR` | Répertoire d'historique des scans | `./.npm-scan` |
345
- | `NPM_SCAN_LOG_LEVEL` | Niveau de verbosité des logs | `info` |
346
-
347
- ### Licence premium
348
-
349
- Contactez leo@lateos.ai pour obtenir une clé de licence premium/enterprise.
350
-
351
- ```bash
352
- # L'utiliser
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
- ## 🔗 Intégrations
361
-
362
- ### GitHub Actions CI (pour ce dépôt)
363
-
364
- Chaque push et PR exécute les tests sur Node 18, 20 et 22 :
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 (pour les utilisateurs en aval)
395
-
396
- 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 :
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
- #### Entrées de l'action
422
-
423
- | Entrée | Défaut | Description |
424
- |-------|---------|-------------|
425
- | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
426
- | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
427
- | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
428
- | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
429
- | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
430
- | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
431
- | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
432
-
433
- #### Sorties de l'action
434
-
435
- | Sortie | Description |
436
- |--------|-------------|
437
- | `findings-count` | Nombre de résultats détectés |
438
- | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
439
-
440
- #### Exemple : scanner un paquet spécifique avec politique + SBOM
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
- #### Exemple : scanner avec export SIEM (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
- ### Pipeline CI/CD
463
-
464
- Intégrez directement dans votre pipeline existant sans l'action composite :
465
-
466
- ```bash
467
- # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
468
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
469
-
470
- # Scanner un paquet spécifique, échouer seulement sur critique
471
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
472
-
473
- # Générer un SBOM comme artefact de build
474
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
475
-
476
- # Générer un rapport de conformité HTML dans le CI
477
- npm-scan report --html > report.html
478
-
479
- # Télécharger le rapport comme artefact
480
- # uses: actions/upload-artifact@v4
481
- # with:
482
- # name: npm-scan-report
483
- # path: report.html
484
- ```
485
-
486
- ### Docker
487
-
488
- Voir la [section Démarrage rapide Docker](#-exécutez-lateosnpm-scan-partout-avec-docker--zéro-installation) ci-dessus pour les commandes de tirage, le pipeline Compose et les images multi-arch.
489
-
490
- 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 :
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
- #### Entrées de l'action
516
-
517
- | Entrée | Défaut | Description |
518
- |-------|---------|-------------|
519
- | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
520
- | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
521
- | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
522
- | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
523
- | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
524
- | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
525
- | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
526
-
527
- #### Sorties de l'action
528
-
529
- | Sortie | Description |
530
- |--------|-------------|
531
- | `findings-count` | Nombre de résultats détectés |
532
- | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
533
-
534
- #### Exemple : scanner un paquet spécifique avec politique + SBOM
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
- #### Exemple : scanner avec export SIEM (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
- ### Pipeline CI/CD
557
-
558
- Intégrez directement dans votre pipeline existant sans l'action composite :
559
-
560
- ```bash
561
- # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
562
- npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
563
-
564
- # Scanner un paquet spécifique, échouer seulement sur critique
565
- npm-scan scan lodash --policy .npm-scan.yml || exit 1
566
-
567
- # Générer un SBOM comme artefact de build
568
- npm-scan scan express --sbom spdx > express-sbom.spdx.json
569
-
570
- # Générer un rapport de conformité HTML dans le CI
571
- npm-scan report --html > report.html
572
-
573
- # Télécharger le rapport comme artefact
574
- # uses: actions/upload-artifact@v4
575
- # with:
576
- # name: npm-scan-report
577
- # path: report.html
578
- ```
579
-
580
- ### Docker
581
-
582
- Voir la [section Démarrage rapide Docker](#-exécutez-lateosnpm-scan-partout-avec-docker--zéro-installation) ci-dessus pour les commandes de tirage, le pipeline Compose et les images multi-arch.
583
-
584
- ---
585
-
586
- ## 🗺️ Feuille de route et fonctionnalités Enterprise
587
-
588
- ### Niveau gratuit (livré)
589
-
590
- - Les 11 détecteurs ATK + **MEGALODON** (D1-D6) + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** (D1-D7, 3 vagues, avec **MSH_SUPPLEMENT** D1-D4) + **VSIX_SCAN** (6 détecteurs) + **CVE-2026-48710 (BadHost)** (3 couches) + **TRAPDOOR** (9 règles) + **NODE_IPC_COMPROMISE** (11 règles) + **TYPOSQUAT_VPMDHAJ** (3 règles) + **AXIOS_POISONING** (3 règles)
591
- - Sortie SBOM (CycloneDX + SPDX)
592
- - Rapports HTML, texte et conformité (NIST + EU CRA)
593
- - Moteur de politique en tant que code (YAML)
594
- - Historique de scan local SQLite
595
- - GitHub Action
596
- - Images Docker + pipeline Compose
597
-
598
- ### Premium (🔐 clé de licence)
599
-
600
- - Rapports de conformité PDF avec matrice de traçabilité NIST
601
- - Export SIEM (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
602
- - Sandbox dynamique (basé sur gVisor — ATK-008–010)
603
- - Analyse d'atteignabilité (filtrage par graphe d'appels)
604
-
605
- ### Enterprise (🏢 licence personnalisée)
606
-
607
- - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
608
- - API REST + webhooks (FastAPI)
609
- - RBAC d'équipe + journaux d'audit
610
- - Chart Helm pour déploiement Kubernetes
611
- - Backend PostgreSQL pour niveau hébergé/équipe
612
- - Support prioritaire avec garantie SLA
613
-
614
- ---
615
-
616
- ## 🤝 Contribuer
617
-
618
- 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é.
619
-
620
- Consultez [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour le processus de gouvernance ATK. Chaque nouveau détecteur nécessite :
621
-
622
- 1. Un échantillon de preuve de concept
623
- 2. Une règle de détection avec tests
624
- 3. Une analyse des faux positifs sur les 500 premiers paquets npm
625
- 4. Un mappage de contrôle NIST 800-161
626
-
627
- ### Tests
628
-
629
- Le projet utilise **le moteur de test natif Node.js** (`node:test` + `assert/strict`).
630
-
631
- ```bash
632
- # Exécuter tous les tests
633
- npm test
634
-
635
- # Exécuter les tests avec couverture
636
- npm run test:coverage
637
-
638
- # Exécuter les tests avec sortie détaillée
639
- npm run test:verbose
640
-
641
- # Exécuter le corpus local malveillant/clean (aucun réseau requis)
642
- node --test test/detectors-corpus.test.js
643
- ```
644
-
645
- **Structure des tests :**
646
- - `test/fixtures/mock-data.js` — simulations partagées, paquets et extraits de code
647
- - `test/db.test.js` — CRUD de base de données (sauvegarde, requête, persistance)
648
- - `test/detectors-edge-cases.test.js` — tests limites par détecteur (no-ops, nettoyages, sévérité)
649
- - `test/detectors-corpus.test.js` — 33 tarballs malveillants + 50 propres (hors ligne)
650
- - `test/fetch.test.js` — extraction de tarball, nettoyage de répertoire temporaire
651
- - `test/policy-edge-cases.test.js` — cas limites dans la suppression, la surcharge, la validation de chargement
652
- - `test/report-snapshots.test.js` — assertions de format HTML/texte/CRA/PDF
653
- - `test/cve-2026-48710-badhost/manifest.test.js` — 13 tests d'analyse de manifeste Python (requirements.txt, pyproject.toml, poetry.lock, cas limites de version)
654
- - `test/cve-2026-48710-badhost/transitive.test.js` — 7 tests de dépendances transitives (Tier 1/2, contrôle de version fastapi, suppression par épinglage)
655
- - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 tests de motifs de code statiques (contexte auth, passage INFO, suppression scope)
656
- - `test/cve-2026-48710-badhost/integration.test.js` — 4 tests d'intégration (résultats composites de bout en bout, projet propre, pas de fichiers Python)
657
- - `test/trapdoor.test.js` — 40 tests de détection de la campagne TrapDoor (D1–D9 : marqueur de campagne, empreinte de charge utile, liste noire d'éditeur, exfiltration Gist, empoisonnement IA, nom leurre, primitives cryptographiques, clé XOR, validation d'identifiants)
658
- - `test/node-ipc.test.js` — 37 tests de détection de compromission node-ipc (D1–D11 : liste noire de versions, hachage tarball, injection CJS, hachage de charge utile, motif DNS C2, résolveur d'amorçage, exfiltration DNS TXT, déclencheur d'exécution, artefacts temporaires, éditeur non autorisé, rayon d'impact)
659
- - `test/msh-supplement.test.js` — 17 tests MSH supplement (obfuscation ctf-scramble-v2, démonisation, killswitch géographique, C2 dead-drop)
660
- - `test/typosquat-vpmdhaj.test.js` — 16 tests campagne typosquattage (blocage mainteneur, détection préfixe, Levenshtein, stagers pré-installation, exfiltration identifiants AWS/ECS/Vault/GitHub)
661
- - `test/axios-poisoning.test.js` — 13 tests empoisonnement Axios (liste noire versions, dépendance leurre, heuristique crypto, RAT multiplateforme, rappel C2)
662
- - `test/cli.test.js` — tests d'intégration commander (aide, version, scan, rapport, gestion d'erreurs)
663
-
664
- ### Besoin d'aide ?
665
-
666
- - 🔒 Voir la [politique de sécurité](SECURITY.md) pour la divulgation des vulnérabilités
667
- - 📖 Lire le [plan du projet](docs/project-plan.md)
668
- - 🧬 Consulter la [taxonomie des attaques](docs/attack-taxonomy.md)
669
- - 🐛 Ouvrir une issue ou une PR
670
-
671
- ---
672
-
673
- ## 📄 Licence
674
-
675
- Apache-2.0 core + Commons Clause.
676
- Voir [`LICENSING.md`](LICENSING.md) pour la limite exacte entre les fonctionnalités gratuites et premium.
677
-
678
- ---
679
-
680
- ## 👤 À propos du mainteneur
681
-
682
- **Roongrunchai Chongolnee** — créateur et mainteneur de `@lateos/npm-scan`. Professionnel de la sécurité certifié (CISSP, CEH, Cisco Security, AWS Cloud Practitioner) avec une décennie d'expérience en sécurité des infrastructures et des applications chez Philips. J'ai construit cet outil pour offrir à la communauté open-source une défense pratique et pilotée par des détecteurs contre les logiciels malveillants de la chaîne d'approvisionnement — et je m'engage à le maintenir transparent, détenu par la communauté et en amélioration continue.
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
- Les issues, idées et pull requests sont toujours les bienvenus — la sécurité est plus forte quand nous collaborons.
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
- **Scannez votre premier paquet dès maintenant :**
706
-
707
- ```bash
708
- npx @lateos/npm-scan scan lodash
77
+
78
+ > **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.
79
+
80
+ ---
81
+
82
+ ## ✨ Fonctionnalités clés
83
+
84
+ | Icône | Fonctionnalité | Description |
85
+ |------|---------|-------------|
86
+ | 🕵️ | **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 |
87
+ | 🧠 | **Détection comportementale** | Identifie les déclencheurs conditionnels (temporels, conscients du CI), le contournement de sandbox et les modèles d'activation dormante |
88
+ | 🧬 | **Taxonomie d'attaques ATK** | 11 types d'attaques classifiés avec correspondances NIST 800-161 - versionnés, documentés et PR-ables |
89
+ | 🪱 | **Détection de campagne de ver** | Mini Shai-Hulud - 10 sous-vérifications réparties sur deux suites détectant les bursts de publication, les compromissions de pairs, les anomalies d'attestation SLSA, la dérive d'éditeur, la correspondance IOC, l'exfiltration de jetons, l'obfuscation ctf-scramble-v2, la persistance démonisée, les killswitches géographiques et les canaux C2 GitHub |
90
+ | 🧩 | **Analyse d'extension VSIX** | `npm-scan scan --vsix` - détecte les attaques de la chaîne d'approvisionnement du Marketplace VS Code |
91
+ | 🐍 | **Détection de vulnérabilité Python** | CVE-2026-48710 (BadHost) - injection d'en-tête Host Starlette |
92
+ | 🪤 | **Détection d'attaque multi-écosystème** | TrapDoor - 9 sous-vérifications |
93
+ | 📡 | **Détection de détournement de domaine expiré** | node-ipc - 11 sous-vérifications |
94
+ | ☣️ | **Détection d'obfuscation de malware** | ctf-scramble-v2 - analyse des distributions à la recherche de motifs d'obfuscation de malware connus, arrêt immédiat avec condition d'arrêt de sévérité CRITIQUE |
95
+ | 🎭 | **Détection de campagne de typosquattage massif** | Liste noire du mainteneur vpmdhaj avec condition d'arrêt, détection de typosquattage basée sur Levenshtein, identification de stager de pré-installation, motifs d'exfiltration d'identifiants AWS ECS/Vault/GitHub |
96
+ | ☠️ | **Détection d'empoisonnement de registre** | Liste noire des versions Axios (1.14.1/0.30.4) avec condition d'arrêt, découverte de dépendance leurre (plain-crypto-js), détection de RAT multiplateforme |
97
+ | 🔏 | **Piste d'audit de provenance** | Cadre Aureus-Elicitor v1.7 - manifests de détection signés HMAC-SHA256, pistes d'audit vérifiées par hachage de contenu, URLs de provenance de règle, attribution de source de campagne |
98
+ | 📦 | **Génération SBOM** | CycloneDX 1.5 et SPDX 2.3 avec résultats intégrés comme vulnérabilités |
99
+ | 🧾 | **Rapports de conformité** | Matrice de traçabilité NIST SP 800-161 + cartographie EU Cyber Resilience Act (gratuit) |
100
+ | 🔌 | **Export SIEM** | Formats Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar (premium) |
101
+ | 📜 | **Politique en tant que code** | Moteur de politique YAML/JSON avec listes blanches, surcharges de sévérité, suppressions et seuils d'échec |
102
+ | 🐳 | **Docker + GitHub Action** | Images multi-arch, pipeline Compose en une commande, action de scan PR |
103
+ | 🛡️ | **Zéro télémétrie** | Aucune donnée ne quitte votre machine. Pas de cloud. Pas de rappels. |
104
+ | 💾 | **Historique de scan local** | Persistance basée sur SQLite, zéro dépendance externe |
105
+
106
+ ---
107
+
108
+ ## ⚡ Démarrage rapide
109
+
110
+ ```bash
111
+ # Installation globale
112
+ npm install -g @lateos/npm-scan
113
+
114
+ # Scanner un seul paquet
115
+ npm-scan scan lodash
116
+
117
+ # Scanner votre fichier de verrouillage
118
+ npm-scan scan-lockfile
119
+
120
+ # Voir les derniers scans
121
+ npm-scan report
122
+ ```
123
+
124
+ **Pas d'installation ? Pas de problème :**
125
+
126
+ ```bash
127
+ npx @lateos/npm-scan scan commander
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 🐳 Exécutez @lateos/npm-scan partout avec Docker — zéro installation
133
+
134
+ ```bash
135
+ # Tirez et exécutez un scan unique — pas de Node.js ni npm requis
136
+ docker run --rm lateos/npm-scan:cli scan lodash
137
+
138
+ # Pipeline complet avec stockage persistant et Compose
139
+ docker compose --profile pipeline up -d
140
+ ```
141
+
142
+ Pas de Node.js. Pas de `npm install`. Pas de paquets globaux. Fonctionne sur tout système avec Docker — serveurs CI, environnements air-gap, clusters Kubernetes. Images multi-arch pour `linux/amd64` et `linux/arm64`.
143
+
144
+ ---
145
+
146
+ ## 🛡️ Prêt pour le Gouvernement et SOC 2
147
+
148
+ | Fonctionnalité | Contrôles SOC 2 | NIST 800-161 | Alignement STIG/FedRAMP |
149
+ |----------------|-------|--------------|--------------|
150
+ | Journaux d'audit (--audit-log) | CC6.8 | AU-2 | ✓ |
151
+ | Crypto FIPS (--fips) | CC6.1 | SC-13 | ✓ |
152
+ | Rapport STIG (--stig) | CC7.3 | RA-5 | ✓ |
153
+ | Cache hors ligne (--cache-dir) | A1.2 | SC-8 | ✓ |
154
+ | Provenance Sigstore | CC6.2 | SI-7 | ✓ |
155
+ | SBOM (SPDX/CycloneDX) | CC7.4 | SA-10 | ✓ |
156
+
157
+ ```bash
158
+ # Scan conforme en environnement hermétique
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
+ ## 📖 Exemples d'utilisation
166
+
167
+ ### Scanner un seul paquet
168
+
169
+ ```bash
170
+ # Sortie JSON par défaut avec tous les résultats
171
+ npm-scan scan axios
172
+
173
+ # Générer un SBOM en même temps que le scan
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
+ # Appliquer une politique YAML
179
+ npm-scan scan some-package --policy .npm-scan.yml
180
+
181
+ # Scanner un fichier tarball local (pas de téléchargement depuis le registre)
182
+ npm-scan scan --file path/to/malicious-package.tgz
183
+ ```
184
+
185
+ ### Scanner un fichier de verrouillage
186
+
187
+ ```bash
188
+ # Scanner les dépendances du projet actuel
189
+ npm-scan scan-lockfile
190
+
191
+ # Scanner un fichier de verrouillage spécifique
192
+ npm-scan scan-lockfile -f ./path/to/package-lock.json
193
+
194
+ # Échouer en CI/CD sur les découvertes de severity haute ou critique (code de sortie 1)
195
+ npm-scan scan-lockfile --fail-on high
196
+
197
+ # Échouer sur toute découverte (low et au-delà)
198
+ npm-scan scan-lockfile --fail-on low
199
+
200
+ # Générer une sortie SARIF v2.1 pour GitHub Advanced Security / VS Code
201
+ npm-scan scan-lockfile --sarif results.sarif
202
+
203
+ # Afficher uniquement le score de risque (0-10) pour les tableaux de bord/seuils
204
+ npm-scan scan-lockfile --score-only
205
+ ```
206
+
207
+ ### Générer des rapports
208
+
209
+ ```bash
210
+ # Lister tous les scans récents
211
+ npm-scan report
212
+
213
+ # Voir un scan spécifique
214
+ npm-scan report -i 42
215
+
216
+ # Générer un rapport HTML (gratuit) avec tous les résultats + tableau NIST
217
+ npm-scan report -i 42 --html
218
+
219
+ # Afficher le tableau de conformité NIST 800-161
220
+ npm-scan report -i 42 --nist
221
+
222
+ # Afficher le tableau de conformité EU CRA
223
+ npm-scan report --cra
224
+
225
+ # Export CSV pour Excel / Sheets (prêt pour audit)
226
+ npm-scan report --csv risks.csv
227
+ npm-scan scan lodash --csv # CSV vers stdout
228
+
229
+ # Rapport texte (gratuit)
230
+ npm-scan report --text
231
+
232
+ # Rapport PDF (premium)
233
+ npm-scan report --pdf --license-key <key>
234
+
235
+ # Export SIEM (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
+ # Combiner tous les scans en un seul rapport
242
+ npm-scan report --html # tous les scans
243
+ npm-scan report --pdf # tous les scans (premium)
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 🧬 Capacités de détection (Taxonomie ATK)
249
+
250
+ | ID | Classe d'attaque | Méthode de détection | Sévérité | NIST 800-161 |
251
+ |---|---|---|---|---|
252
+ | **ATK-001** | Scripts de cycle de vie malveillants (`preinstall`, `postinstall`, `install`) | Statique | 🔴 élevée | SR-3.1 |
253
+ | **ATK-002** | Livraison de charge utile obfusquée (hex, base64, chaînes eval) | Statique | 🟠 moyenne | SR-4.2 |
254
+ | **ATK-003** | Vol d'identifiants (variables d'env, .npmrc, clés SSH) | Statique + Dynamique | 🔴 élevée | SR-5.3 |
255
+ | **ATK-004** | Persistance via les répertoires d'éditeur/config (.vscode, .claude, .cursor) | Statique | 🔴 élevée | SR-6.4 |
256
+ | **ATK-005** | Exfiltration réseau (API GitHub, tunneling DNS, HTTP C2) | Statique + Dynamique | ⚫ critique | SR-7.5 |
257
+ | **ATK-006** | Confusion de dépendances / accaparement d'espace de noms | Statique (fichier de verrouillage) | 🟠 moyenne | SR-2.2 |
258
+ | **ATK-007** | Typosquatting (correspondance par distance d'édition) | Statique | 🟢 faible | SR-2.1 |
259
+ | **ATK-008** | Altération de tarball (publié ≠ source) | Statique | 🔴 élevée | SR-8.1 |
260
+ | **ATK-009** | Déclencheurs conditionnels/dormants (détection CI, temporel) | Comportementale | 🔴 élevée | SR-9.2 |
261
+ | **ATK-010** | Contournement de sandbox / anti-analyse | Comportementale | 🟠 moyenne | SR-10.3 |
262
+ | **ATK-011** | Propagation transitive (dissémination latérale de type ver) | Comportementale | 🔴 élevée | SR-11.4 |
263
+ | **CVE-2026-48710** | BadHost — contournement d'authentification Starlette par injection d'en-tête Host (CVE-2026-48710, CVSS 7.0). Détection de version de dépendance Python (requirements.txt, pyproject.toml, poetry.lock, Pipfile, setup.py/cfg), heuristique transitive (15 paquets aval connus : fastapi, vllm, litellm, serveurs MCP, etc.), analyse statique de code pour `request.url.path` dangereux en contexte auth/middleware avec suppression par `request.scope["path"]` | Statique + Registre | 🔴 élevée / 🟠 moyenne / ℹ️ info | SR-3.1, SR-5.3 |
264
+ | **TRAPDOOR** | Campagne d'attaque multi-écosystème TrapDoor — marqueur de campagne P-2024-001, empreinte de charge utile trap-core.js, liste noire d'éditeur asdxzxc, exfiltration d'identifiants via Gist, empoisonnement de contexte IA (Unicode largeur nulle), noms leurres crypto/DeFi, chiffrement Fernet+ECDH, clé XOR cargo-build-helper-2026, validation d'identifiants STS/API GitHub | Statique + Registre | 🟠 moyenne / 🔴 élevée / ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
265
+ | **NODE_IPC_COMPROMISE** | Compromission de la chaîne d'approvisionnement node-ipc (14 mai 2026) — liste noire de versions (9.1.6/9.2.3/12.0.1) avec épingle de sécurité, vérification SHA-256 du tarball, injection IIFE de charge utile CJS, DNS sur port non standard, résolveur d'amorçage sh.azurestaticprovider.net, zone d'exfiltration DNS TXT bt.node.js, déclencheur d'exécution setImmediate(), artefacts de staging ~/nt-*/, éditeur non autorisé atiertant, détection du rayon d'impact dans les lockfiles avec recommandations d'épingle | Statique + Registre | ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
266
+ | **MSH_SUPPLEMENT** | Supplément Mini Shai-Hulud - obfuscation ctf-scramble-v2 (ARRÊT sur correspondance), persistance de démonisation, détection de killswitch géographique (ru_RU/be_BY), indicateurs C2 dead-drop (OhNoWhatsGoingOnWithGitHub) | Statique + Comportementale | ⚫ critique | SR-3.1, SR-7.5, SR-9.2 |
267
+ | **TYPOSQUAT_VPMDHAJ** | Campagne de typosquattage massif (vpmdhaj) - liste noire de mainteneur (ARRÊT sur correspondance), détection de préfixe d'espace de noms vpmdhaj-*, correspondance Levenshtein, stagers de pré-installation, exfiltration d'identifiants cloud (AWS IMDSv2, ECS, Vault, GitHub) | Statique + Registre | ⚫ critique | SR-2.1, SR-3.1, SR-5.3 |
268
+ | **AXIOS_POISONING** | Empoisonnement du registre Axios - liste noire de versions (1.14.1/0.30.4, ARRÊT sur correspondance), injection de dépendance leurre (plain-crypto-js), détection de RAT multiplateforme (PowerShell, launchd, systemd, DLL, C2) | Statique + Comportementale | ⚫ critique | SR-3.1, SR-5.3, SR-7.5 |
269
+
270
+ > **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.
271
+ > Voir [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour la documentation complète de la surface d'évasion et des exemples de PoC.
272
+
273
+ ---
274
+
275
+ ## 📊 Sorties et rapports
276
+
277
+ ### Formats
278
+
279
+ | Format | Disponibilité | Description |
280
+ |--------|-------------|-------------|
281
+ | JSON | ✅ Gratuit | Résultats structurés lisibles par machine |
282
+ | HTML | ✅ Gratuit | Rapport HTML riche avec tableau de conformité NIST, badges de sévérité, matrice de contrôle |
283
+ | Texte | ✅ Gratuit | Rapport texte propre et adapté au terminal |
284
+ | CycloneDX SBOM | ✅ Gratuit | SBOM standard de l'industrie avec résultats intégrés comme vulnérabilités |
285
+ | SPDX SBOM | ✅ Gratuit | Format de document SPDX 2.3 |
286
+ | NIST 800-161 | ✅ Gratuit | Matrice de traçabilité des contrôles (SR-2.1 → SR-11.4) |
287
+ | EU CRA | ✅ Gratuit | Cartographie des articles du Cyber Resilience Act |
288
+ | PDF | 🔐 Premium | PDF multipage avec page de titre, tableau des résultats, matrice de conformité NIST |
289
+ | Splunk CEF | 🔐 Premium | Format d'événement commun pour l'ingestion Splunk |
290
+ | Elastic ECS | 🔐 Premium | Format Elastic Common Schema |
291
+ | Microsoft Sentinel | 🔐 Premium | Sortie formatée prête pour Sentinel |
292
+ | IBM QRadar | 🔐 Premium | Format prêt pour QRadar DSM avec correspondances QID |
293
+
294
+ ### Exemple de sortie
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
+ ## ⚙️ Configuration et utilisation avancée
313
+
314
+ ### Politique en tant que code
315
+
316
+ Définissez des listes blanches, des surcharges de sévérité, des suppressions et des seuils d'échec dans un fichier YAML :
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
+ ### Variables d'environnement
340
+
341
+ | Variable | Description | Défaut |
342
+ |----------|-------------|---------|
343
+ | `NPM_SCAN_LICENSE_KEY` | Clé de licence Premium / Enterprise | — |
344
+ | `NPM_SCAN_DATA_DIR` | Répertoire d'historique des scans | `./.npm-scan` |
345
+ | `NPM_SCAN_LOG_LEVEL` | Niveau de verbosité des logs | `info` |
346
+
347
+ ### Licence premium
348
+
349
+ Contactez leo@lateos.ai pour obtenir une clé de licence premium/enterprise.
350
+
351
+ ```bash
352
+ # L'utiliser
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
+ ## 🔗 Intégrations
361
+
362
+ ### GitHub Actions CI (pour ce dépôt)
363
+
364
+ Chaque push et PR exécute les tests sur Node 18, 20 et 22 :
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 (pour les utilisateurs en aval)
395
+
396
+ 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 :
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
+ #### Entrées de l'action
422
+
423
+ | Entrée | Défaut | Description |
424
+ |-------|---------|-------------|
425
+ | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
426
+ | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
427
+ | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
428
+ | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
429
+ | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
430
+ | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
431
+ | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
432
+
433
+ #### Sorties de l'action
434
+
435
+ | Sortie | Description |
436
+ |--------|-------------|
437
+ | `findings-count` | Nombre de résultats détectés |
438
+ | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
439
+
440
+ #### Exemple : scanner un paquet spécifique avec politique + SBOM
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
+ #### Exemple : scanner avec export SIEM (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
+ ### Pipeline CI/CD
463
+
464
+ Intégrez directement dans votre pipeline existant sans l'action composite :
465
+
466
+ ```bash
467
+ # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
468
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
469
+
470
+ # Scanner un paquet spécifique, échouer seulement sur critique
471
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
472
+
473
+ # Générer un SBOM comme artefact de build
474
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
475
+
476
+ # Générer un rapport de conformité HTML dans le CI
477
+ npm-scan report --html > report.html
478
+
479
+ # Télécharger le rapport comme artefact
480
+ # uses: actions/upload-artifact@v4
481
+ # with:
482
+ # name: npm-scan-report
483
+ # path: report.html
484
+ ```
485
+
486
+ ### Docker
487
+
488
+ Voir la [section Démarrage rapide Docker](#-exécutez-lateosnpm-scan-partout-avec-docker--zéro-installation) ci-dessus pour les commandes de tirage, le pipeline Compose et les images multi-arch.
489
+
490
+ 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 :
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
+ #### Entrées de l'action
516
+
517
+ | Entrée | Défaut | Description |
518
+ |-------|---------|-------------|
519
+ | `scan-type` | `lockfile` | `lockfile` pour scanner `package-lock.json` ou `package` pour scanner un paquet npm spécifique |
520
+ | `package` | — | Nom du paquet (requis quand `scan-type=package`) |
521
+ | `fail-on` | `high` | Faire échouer le workflow à ce seuil de sévérité : `none`, `low`, `medium`, `high`, `critical` |
522
+ | `policy-file` | — | Chemin vers un fichier de politique YAML/JSON pour listes blanches, surcharges de sévérité et suppressions |
523
+ | `license-key` | — | Clé de licence premium pour l'export SIEM et les rapports PDF |
524
+ | `siem-format` | — | Sortie SIEM : `cef`, `ecs`, `sentinel`, `qradar` (premium) |
525
+ | `sbom-format` | — | Sortie SBOM : `json`, `xml`, `spdx` |
526
+
527
+ #### Sorties de l'action
528
+
529
+ | Sortie | Description |
530
+ |--------|-------------|
531
+ | `findings-count` | Nombre de résultats détectés |
532
+ | `scan-id` | ID du scan pour référence ultérieure dans les rapports |
533
+
534
+ #### Exemple : scanner un paquet spécifique avec politique + SBOM
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
+ #### Exemple : scanner avec export SIEM (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
+ ### Pipeline CI/CD
557
+
558
+ Intégrez directement dans votre pipeline existant sans l'action composite :
559
+
560
+ ```bash
561
+ # Scanner le fichier de verrouillage, échouer le build en sévérité élevée
562
+ npm-scan scan-lockfile --policy .npm-scan.yml || exit 1
563
+
564
+ # Scanner un paquet spécifique, échouer seulement sur critique
565
+ npm-scan scan lodash --policy .npm-scan.yml || exit 1
566
+
567
+ # Générer un SBOM comme artefact de build
568
+ npm-scan scan express --sbom spdx > express-sbom.spdx.json
569
+
570
+ # Générer un rapport de conformité HTML dans le CI
571
+ npm-scan report --html > report.html
572
+
573
+ # Télécharger le rapport comme artefact
574
+ # uses: actions/upload-artifact@v4
575
+ # with:
576
+ # name: npm-scan-report
577
+ # path: report.html
578
+ ```
579
+
580
+ ### Docker
581
+
582
+ Voir la [section Démarrage rapide Docker](#-exécutez-lateosnpm-scan-partout-avec-docker--zéro-installation) ci-dessus pour les commandes de tirage, le pipeline Compose et les images multi-arch.
583
+
584
+ ---
585
+
586
+ ## 🗺️ Feuille de route et fonctionnalités Enterprise
587
+
588
+ ### Niveau gratuit (livré)
589
+
590
+ - Les 11 détecteurs ATK + **MEGALODON** (D1-D6) + **HF_IMPERSONATION** + **MINI_SHAI_HULUD** (D1-D7, 3 vagues, avec **MSH_SUPPLEMENT** D1-D4) + **VSIX_SCAN** (6 détecteurs) + **CVE-2026-48710 (BadHost)** (3 couches) + **TRAPDOOR** (9 règles) + **NODE_IPC_COMPROMISE** (11 règles) + **TYPOSQUAT_VPMDHAJ** (3 règles) + **AXIOS_POISONING** (3 règles)
591
+ - Sortie SBOM (CycloneDX + SPDX)
592
+ - Rapports HTML, texte et conformité (NIST + EU CRA)
593
+ - Moteur de politique en tant que code (YAML)
594
+ - Historique de scan local SQLite
595
+ - GitHub Action
596
+ - Images Docker + pipeline Compose
597
+
598
+ ### Premium (🔐 clé de licence)
599
+
600
+ - Rapports de conformité PDF avec matrice de traçabilité NIST
601
+ - Export SIEM (Splunk CEF, Elastic ECS, Microsoft Sentinel, IBM QRadar)
602
+ - Sandbox dynamique (basé sur gVisor — ATK-008–010)
603
+ - Analyse d'atteignabilité (filtrage par graphe d'appels)
604
+
605
+ ### Enterprise (🏢 licence personnalisée)
606
+
607
+ - SAML 2.0 SSO (Okta, Azure AD, OneLogin, Keycloak)
608
+ - API REST + webhooks (FastAPI)
609
+ - RBAC d'équipe + journaux d'audit
610
+ - Chart Helm pour déploiement Kubernetes
611
+ - Backend PostgreSQL pour niveau hébergé/équipe
612
+ - Support prioritaire avec garantie SLA
613
+
614
+ ---
615
+
616
+ ## 🤝 Contribuer
617
+
618
+ 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é.
619
+
620
+ Consultez [`docs/attack-taxonomy.md`](docs/attack-taxonomy.md) pour le processus de gouvernance ATK. Chaque nouveau détecteur nécessite :
621
+
622
+ 1. Un échantillon de preuve de concept
623
+ 2. Une règle de détection avec tests
624
+ 3. Une analyse des faux positifs sur les 500 premiers paquets npm
625
+ 4. Un mappage de contrôle NIST 800-161
626
+
627
+ ### Tests
628
+
629
+ Le projet utilise **le moteur de test natif Node.js** (`node:test` + `assert/strict`).
630
+
631
+ ```bash
632
+ # Exécuter tous les tests
633
+ npm test
634
+
635
+ # Exécuter les tests avec couverture
636
+ npm run test:coverage
637
+
638
+ # Exécuter les tests avec sortie détaillée
639
+ npm run test:verbose
640
+
641
+ # Exécuter le corpus local malveillant/clean (aucun réseau requis)
642
+ node --test test/detectors-corpus.test.js
643
+ ```
644
+
645
+ **Structure des tests :**
646
+ - `test/fixtures/mock-data.js` — simulations partagées, paquets et extraits de code
647
+ - `test/db.test.js` — CRUD de base de données (sauvegarde, requête, persistance)
648
+ - `test/detectors-edge-cases.test.js` — tests limites par détecteur (no-ops, nettoyages, sévérité)
649
+ - `test/detectors-corpus.test.js` — 33 tarballs malveillants + 50 propres (hors ligne)
650
+ - `test/fetch.test.js` — extraction de tarball, nettoyage de répertoire temporaire
651
+ - `test/policy-edge-cases.test.js` — cas limites dans la suppression, la surcharge, la validation de chargement
652
+ - `test/report-snapshots.test.js` — assertions de format HTML/texte/CRA/PDF
653
+ - `test/cve-2026-48710-badhost/manifest.test.js` — 13 tests d'analyse de manifeste Python (requirements.txt, pyproject.toml, poetry.lock, cas limites de version)
654
+ - `test/cve-2026-48710-badhost/transitive.test.js` — 7 tests de dépendances transitives (Tier 1/2, contrôle de version fastapi, suppression par épinglage)
655
+ - `test/cve-2026-48710-badhost/codePattern.test.js` — 6 tests de motifs de code statiques (contexte auth, passage INFO, suppression scope)
656
+ - `test/cve-2026-48710-badhost/integration.test.js` — 4 tests d'intégration (résultats composites de bout en bout, projet propre, pas de fichiers Python)
657
+ - `test/trapdoor.test.js` — 40 tests de détection de la campagne TrapDoor (D1–D9 : marqueur de campagne, empreinte de charge utile, liste noire d'éditeur, exfiltration Gist, empoisonnement IA, nom leurre, primitives cryptographiques, clé XOR, validation d'identifiants)
658
+ - `test/node-ipc.test.js` — 37 tests de détection de compromission node-ipc (D1–D11 : liste noire de versions, hachage tarball, injection CJS, hachage de charge utile, motif DNS C2, résolveur d'amorçage, exfiltration DNS TXT, déclencheur d'exécution, artefacts temporaires, éditeur non autorisé, rayon d'impact)
659
+ - `test/msh-supplement.test.js` — 17 tests MSH supplement (obfuscation ctf-scramble-v2, démonisation, killswitch géographique, C2 dead-drop)
660
+ - `test/typosquat-vpmdhaj.test.js` — 16 tests campagne typosquattage (blocage mainteneur, détection préfixe, Levenshtein, stagers pré-installation, exfiltration identifiants AWS/ECS/Vault/GitHub)
661
+ - `test/axios-poisoning.test.js` — 13 tests empoisonnement Axios (liste noire versions, dépendance leurre, heuristique crypto, RAT multiplateforme, rappel C2)
662
+ - `test/cli.test.js` — tests d'intégration commander (aide, version, scan, rapport, gestion d'erreurs)
663
+
664
+ ### Besoin d'aide ?
665
+
666
+ - 🔒 Voir la [politique de sécurité](SECURITY.md) pour la divulgation des vulnérabilités
667
+ - 📖 Lire le [plan du projet](docs/project-plan.md)
668
+ - 🧬 Consulter la [taxonomie des attaques](docs/attack-taxonomy.md)
669
+ - 🐛 Ouvrir une issue ou une PR
670
+
671
+ ---
672
+
673
+ ## 📄 Licence
674
+
675
+ Apache-2.0 core + Commons Clause.
676
+ Voir [`LICENSING.md`](LICENSING.md) pour la limite exacte entre les fonctionnalités gratuites et premium.
677
+
678
+ ---
679
+
680
+ ## 👤 À propos du mainteneur
681
+
682
+ **Roongrunchai Chongolnee** — créateur et mainteneur de `@lateos/npm-scan`. Professionnel de la sécurité certifié (CISSP, CEH, Cisco Security, AWS Cloud Practitioner) avec une décennie d'expérience en sécurité des infrastructures et des applications chez Philips. J'ai construit cet outil pour offrir à la communauté open-source une défense pratique et pilotée par des détecteurs contre les logiciels malveillants de la chaîne d'approvisionnement — et je m'engage à le maintenir transparent, détenu par la communauté et en amélioration continue.
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
+ Les issues, idées et pull requests sont toujours les bienvenus — la sécurité est plus forte quand nous collaborons.
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
+ **Scannez votre premier paquet dès maintenant :**
706
+
707
+ ```bash
708
+ npx @lateos/npm-scan scan lodash
709
709
  ```