muaddib-scanner 2.3.2 → 2.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.fr.md DELETED
@@ -1,819 +0,0 @@
1
- <p align="center">
2
- <img src="assets/muaddibLogo.png" alt="MUAD'DIB Logo" width="700">
3
- </p>
4
-
5
- <p align="center">
6
- <a href="https://www.npmjs.com/package/muaddib-scanner"><img src="https://img.shields.io/npm/v/muaddib-scanner" alt="npm version"></a>
7
- <a href="https://github.com/DNSZLSK/muad-dib/actions/workflows/scan.yml"><img src="https://github.com/DNSZLSK/muad-dib/actions/workflows/scan.yml/badge.svg" alt="CI"></a>
8
- <a href="https://codecov.io/gh/DNSZLSK/muad-dib"><img src="https://codecov.io/gh/DNSZLSK/muad-dib/branch/master/graph/badge.svg" alt="Coverage"></a>
9
- <a href="https://scorecard.dev/viewer/?uri=github.com/DNSZLSK/muad-dib"><img src="https://api.scorecard.dev/projects/github.com/DNSZLSK/muad-dib/badge" alt="OpenSSF Scorecard"></a>
10
- <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
11
- <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node">
12
- <img src="https://img.shields.io/badge/IOCs-225%2C000%2B-red" alt="IOCs">
13
- </p>
14
-
15
- <p align="center">
16
- <a href="#installation">Installation</a> |
17
- <a href="#utilisation">Utilisation</a> |
18
- <a href="#fonctionnalités">Fonctionnalités</a> |
19
- <a href="#vs-code">VS Code</a> |
20
- <a href="#ci-cd">CI/CD</a>
21
- </p>
22
-
23
- <p align="center">
24
- <a href="README.md">English version</a>
25
- </p>
26
-
27
- ---
28
-
29
- ## Pourquoi MUAD'DIB ?
30
-
31
- Les attaques supply-chain npm et PyPI explosent. Shai-Hulud a compromis 25K+ repos en 2025. Les outils existants détectent, mais n'aident pas à répondre.
32
-
33
- MUAD'DIB combine analyse statique + **moteur de désobfuscation** (v2.2.5) + **dataflow inter-module** (v2.2.6) + **scoring per-file max** (v2.2.11) + analyse dynamique (sandbox Docker) + **détection comportementale d'anomalies** (v2.0) + **validation ground truth** (v2.1) pour détecter les menaces ET guider votre réponse — même avant leur apparition dans une base d'IOC.
34
-
35
- ---
36
-
37
- ## Positionnement
38
-
39
- MUAD'DIB est un outil éducatif et une première ligne de défense gratuite. Il détecte les menaces npm et PyPI **connues** (225 000+ IOCs) et les patterns suspects basiques.
40
-
41
- **Pour une protection enterprise**, utilisez :
42
- - [Socket.dev](https://socket.dev) - Analyse comportementale ML, sandboxing cloud
43
- - [Snyk](https://snyk.io) - Base de vulnérabilités massive, intégrations CI/CD
44
- - [Opengrep](https://opengrep.dev) - Analyse dataflow avancée, règles Semgrep
45
-
46
- MUAD'DIB ne remplace pas ces outils. Il les complète pour les devs qui veulent une vérification rapide et gratuite avant d'installer un package inconnu.
47
-
48
- ---
49
-
50
- ## Installation
51
-
52
- ### npm (recommandé)
53
-
54
- ```bash
55
- npm install -g muaddib-scanner
56
- ```
57
-
58
- ### Depuis les sources
59
-
60
- ```bash
61
- git clone https://github.com/DNSZLSK/muad-dib
62
- cd muad-dib
63
- npm install
64
- npm link
65
- ```
66
-
67
- ---
68
-
69
- ## Utilisation
70
-
71
- ### Scan basique
72
-
73
- ```bash
74
- muaddib scan .
75
- muaddib scan /chemin/vers/projet
76
- ```
77
-
78
- Scanne les dépendances npm (package.json, node_modules) et Python (requirements.txt, setup.py, pyproject.toml).
79
-
80
- ### Mode interactif
81
-
82
- ```bash
83
- muaddib
84
- ```
85
-
86
- Lance un menu interactif pour vous guider à travers toutes les fonctionnalités.
87
-
88
- ### Installation sécurisée
89
-
90
- ```bash
91
- muaddib install <package>
92
- muaddib install lodash axios --save-dev
93
- muaddib i express -g
94
- muaddib install suspicious-pkg --force # Forcer l'installation malgré les menaces
95
- ```
96
-
97
- Scanne les packages AVANT installation. Bloque les packages malveillants connus.
98
-
99
- ### Score de risque
100
-
101
- Chaque scan affiche un score de risque 0-100 :
102
-
103
- ```
104
- [SCORE] 58/100 [***********---------] HIGH
105
- ```
106
-
107
- ### Mode explain (détails complets)
108
-
109
- ```bash
110
- muaddib scan . --explain
111
- ```
112
-
113
- Affiche pour chaque détection :
114
- - Rule ID
115
- - Technique MITRE ATT&CK
116
- - Références (articles, CVEs)
117
- - Playbook de réponse
118
-
119
- ### Export
120
-
121
- ```bash
122
- muaddib scan . --json > results.json # JSON
123
- muaddib scan . --html report.html # HTML
124
- muaddib scan . --sarif results.sarif # SARIF (GitHub Security)
125
- ```
126
-
127
- ### Seuil de sévérité
128
-
129
- ```bash
130
- muaddib scan . --fail-on critical # Fail seulement sur CRITICAL
131
- muaddib scan . --fail-on high # Fail sur HIGH et CRITICAL (défaut)
132
- muaddib scan . --fail-on medium # Fail sur MEDIUM, HIGH, CRITICAL
133
- ```
134
-
135
- ### Mode paranoid
136
-
137
- ```bash
138
- muaddib scan . --paranoid
139
- ```
140
-
141
- Détection ultra-stricte avec moins de tolérance. Utile pour les projets critiques. Détecte tout accès réseau, exécution de sous-processus, évaluation de code dynamique et accès aux fichiers sensibles.
142
-
143
- ### Webhook Discord/Slack
144
-
145
- ```bash
146
- muaddib scan . --webhook "https://discord.com/api/webhooks/..."
147
- ```
148
-
149
- Envoie une alerte avec le score et les menaces sur Discord ou Slack. Filtrage strict (v2.1.2) : les alertes ne sont envoyées que pour les correspondances IOC, les menaces confirmées par sandbox, ou l'exfiltration de canary tokens — réduisant le bruit des détections heuristiques seules.
150
-
151
- ### Surveillance temps réel
152
-
153
- ```bash
154
- muaddib watch .
155
- ```
156
-
157
- ### Mode daemon
158
-
159
- ```bash
160
- muaddib daemon
161
- muaddib daemon --webhook "https://discord.com/api/webhooks/..."
162
- ```
163
-
164
- Surveille automatiquement tous les `npm install` et scanne les nouveaux packages.
165
-
166
- ### Mise à jour IOCs (rapide, ~5 secondes)
167
-
168
- ```bash
169
- muaddib update
170
- ```
171
-
172
- Charge les 225 000+ IOCs inclus dans le package, fusionne les IOCs YAML et les sources GitHub additionnelles (GenSecAI, DataDog). Lancez cette commande après `npm install` pour un rafraîchissement instantané des IOCs.
173
-
174
- ### Scrape IOCs (complet, ~5 minutes)
175
-
176
- ```bash
177
- muaddib scrape
178
- ```
179
-
180
- Rafraîchissement complet depuis toutes les sources primaires. Télécharge les dumps OSV pour npm et PyPI (~100-200 Mo), OSSF, et toutes les autres sources. Lancez cette commande quand vous voulez les données les plus récentes.
181
-
182
- Sources :
183
- - **OSV.dev npm dump** - Téléchargement en masse de toutes les entrées MAL-*
184
- - **OSV.dev PyPI dump** - Téléchargement en masse de toutes les entrées PyPI MAL-*
185
- - **GenSecAI Shai-Hulud 2.0 Detector** - Liste consolidée de 700+ packages Shai-Hulud
186
- - **DataDog Security Labs** - IOCs consolidés de plusieurs vendors
187
- - **OSSF Malicious Packages** - Base OpenSSF (8000+ rapports via OSV.dev)
188
- - **GitHub Advisory Database** - Advisories tagués malware
189
- - **Snyk Known Malware** - Packages malveillants historiques
190
- - **IOCs Statiques** - Socket.dev, Phylum, packages supprimés de npm
191
-
192
- ### Sandbox Docker
193
-
194
- ```bash
195
- muaddib sandbox <nom-package>
196
- muaddib sandbox <nom-package> --strict
197
- ```
198
-
199
- Analyse dynamique : installe le package dans un container Docker isolé et surveille le comportement à l'exécution via strace, tcpdump et diff filesystem.
200
-
201
- Monitoring multi-couches :
202
- - **Traçage système** (strace) : accès fichiers, spawn de processus, monitoring syscalls
203
- - **Capture réseau** (tcpdump) : résolutions DNS avec IPs résolues, requêtes HTTP (méthode, host, path, body), détection TLS SNI
204
- - **Diff filesystem** : snapshot avant/après install, détecte les fichiers créés dans des emplacements suspects
205
- - **Détection exfiltration de données** : 16 patterns sensibles (tokens, credentials, clés SSH, clés privées, .env)
206
- - **Environnement CI simulé** (v2.1.2) : simule un environnement CI (GITHUB_ACTIONS, GITLAB_CI, TRAVIS, CIRCLECI, JENKINS) pour déclencher les malwares CI-aware qui resteraient autrement dormants
207
- - **Canary tokens enrichis** (v2.1.2) : 6 honeypots injectés comme variables d'environnement (GITHUB_TOKEN, NPM_TOKEN, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, SLACK_WEBHOOK_URL, DISCORD_WEBHOOK_URL). Si exfiltrés via réseau, DNS ou filesystem, déclenche une alerte CRITICAL avec score +50
208
- - **Moteur de scoring** : score de risque 0-100 basé sur la sévérité des comportements
209
-
210
- Utilisez `--strict` pour bloquer tout trafic réseau sortant non essentiel via iptables.
211
-
212
- Nécessite Docker Desktop installé.
213
-
214
- ```bash
215
- muaddib sandbox lodash # Package safe
216
- muaddib sandbox suspicious-pkg # Analyser un package inconnu
217
- ```
218
-
219
- ### Rapport réseau sandbox
220
-
221
- ```bash
222
- muaddib sandbox-report <nom-package>
223
- muaddib sandbox-report <nom-package> --strict
224
- ```
225
-
226
- Identique à `sandbox` mais affiche un rapport réseau détaillé : résolutions DNS, requêtes HTTP, connexions TLS, connexions bloquées (mode strict), et alertes d'exfiltration de données.
227
-
228
- ### Diff (comparer les versions)
229
-
230
- ```bash
231
- muaddib diff <ref> [path]
232
- ```
233
-
234
- Compare les menaces entre la version actuelle et un commit/tag précédent. Affiche uniquement les **NOUVELLES** menaces introduites depuis la référence.
235
-
236
- ```bash
237
- muaddib diff HEAD~1 # Comparer avec le commit précédent
238
- muaddib diff v1.2.0 # Comparer avec un tag
239
- muaddib diff main # Comparer avec une branche
240
- muaddib diff abc1234 # Comparer avec un commit spécifique
241
- ```
242
-
243
- Exemple de sortie :
244
- ```
245
- [MUADDIB DIFF] Comparing abc1234 -> def5678
246
-
247
- Risk Score: 25 -> 45 (+20 worse)
248
- Threats: 3 -> 5
249
-
250
- NEW threats: 2
251
- REMOVED threats: 0
252
- Unchanged: 3
253
-
254
- NEW THREATS (introduced since v1.2.0)
255
- ------------------------------------
256
- 1. [HIGH] suspicious_dependency
257
- Known malicious package detected
258
- File: package.json
259
- ```
260
-
261
- Utilisez en CI pour ne bloquer que sur les **nouvelles** menaces, pas la dette technique existante :
262
- ```yaml
263
- - run: muaddib diff ${{ github.event.pull_request.base.sha }} --fail-on high
264
- ```
265
-
266
- ### Hooks pre-commit
267
-
268
- ```bash
269
- muaddib init-hooks [options]
270
- ```
271
-
272
- Scanner automatiquement avant chaque commit. Supporte plusieurs systèmes de hooks :
273
-
274
- ```bash
275
- muaddib init-hooks # Auto-detect (husky/pre-commit/git)
276
- muaddib init-hooks --type husky # Forcer husky
277
- muaddib init-hooks --type pre-commit # Forcer pre-commit framework
278
- muaddib init-hooks --type git # Forcer git hooks natifs
279
- muaddib init-hooks --mode diff # Ne bloquer que les NOUVELLES menaces
280
- ```
281
-
282
- #### Avec pre-commit framework
283
-
284
- Ajoutez à `.pre-commit-config.yaml` :
285
- ```yaml
286
- repos:
287
- - repo: https://github.com/DNSZLSK/muad-dib
288
- rev: v2.2.24
289
- hooks:
290
- - id: muaddib-scan # Scanner toutes les menaces
291
- # - id: muaddib-diff # Ou: seulement les nouvelles
292
- # - id: muaddib-paranoid # Ou: mode ultra-strict
293
- ```
294
-
295
- #### Avec husky
296
-
297
- ```bash
298
- npx husky add .husky/pre-commit "npx muaddib scan . --fail-on high"
299
- # Ou pour le mode diff :
300
- npx husky add .husky/pre-commit "npx muaddib diff HEAD --fail-on high"
301
- ```
302
-
303
- #### Supprimer les hooks
304
-
305
- ```bash
306
- muaddib remove-hooks [path]
307
- ```
308
-
309
- Supprime tous les hooks MUAD'DIB (husky et git natif).
310
-
311
- #### Git hooks natifs
312
-
313
- ```bash
314
- muaddib init-hooks --type git
315
- # Crée .git/hooks/pre-commit
316
- ```
317
-
318
- ### Moniteur Zero-Day
319
-
320
- MUAD'DIB surveille en continu les registres npm et PyPI pour détecter les nouveaux packages en temps réel, en les scannant automatiquement avec analyse sandbox Docker et alertes webhook. Ce monitoring tourne en interne sur notre infrastructure — les menaces détectées alimentent la base IOC et l'API threat feed.
321
-
322
- ### Décomposition du score
323
-
324
- ```bash
325
- muaddib scan . --breakdown
326
- ```
327
-
328
- Affiche la décomposition explicable du score : contribution de chaque finding au score final, avec les poids par règle et multiplicateurs de sévérité.
329
-
330
- ### Replay ground truth
331
-
332
- ```bash
333
- muaddib replay
334
- muaddib ground-truth
335
- ```
336
-
337
- Rejoue des attaques supply-chain réelles contre le scanner pour valider la couverture de détection. Résultat actuel : **45/49 détectées (91.8% TPR)** sur 51 samples (49 actifs).
338
-
339
- 4 misses hors scope : lottie-player, polyfill-io, trojanized-jquery (attaques browser-only DOM), websocket-rat (pattern risque FP).
340
-
341
- ### Version check
342
-
343
- MUAD'DIB vérifie automatiquement les nouvelles versions au démarrage et vous notifie si une mise à jour est disponible.
344
-
345
- ---
346
-
347
- ## Fonctionnalités
348
-
349
- ### Support Python / PyPI
350
-
351
- MUAD'DIB détecte et scanne automatiquement les projets Python :
352
-
353
- - **requirements.txt** - Tous les formats incluant `-r` récursif, extras, marqueurs d'environnement
354
- - **setup.py** - Extraction de `install_requires` et `setup_requires`
355
- - **pyproject.toml** - Dépendances PEP 621 et dépendances Poetry
356
-
357
- Les packages Python sont vérifiés contre 14 000+ packages PyPI malveillants connus (depuis OSV.dev) et testés pour le typosquatting contre les packages PyPI populaires (requests, numpy, flask, django, pandas, etc.) via la normalisation PEP 503.
358
-
359
- ```
360
- [PYTHON] Detected Python project (3 dependency files)
361
- requirements.txt: 12 packages
362
- setup.py: 3 packages
363
- pyproject.toml: 8 packages
364
-
365
- [CRITICAL] PyPI IOC match: malicious-pkg (all versions)
366
- [HIGH] PyPI typosquat: "reqeusts" looks like "requests"
367
- ```
368
-
369
- ### Détection typosquatting
370
-
371
- MUAD'DIB détecte les packages dont le nom ressemble à un package populaire (npm et PyPI) :
372
-
373
- ```
374
- [HIGH] Package "lodahs" ressemble à "lodash" (swapped_chars). Possible typosquatting.
375
- ```
376
-
377
- ### Analyse dataflow
378
-
379
- Détecte quand du code lit des credentials ET les envoie sur le réseau :
380
-
381
- ```
382
- [CRITICAL] Flux suspect: lecture credentials (readFileSync, GITHUB_TOKEN) + envoi réseau (fetch)
383
- ```
384
-
385
- ### Scanner GitHub Actions
386
-
387
- Détecte les patterns malveillants dans les fichiers YAML `.github/workflows/`, incluant les indicateurs de backdoor Shai-Hulud 2.0.
388
-
389
- ### Attaques détectées
390
-
391
- | Campagne | Packages | Status |
392
- |----------|----------|--------|
393
- | Shai-Hulud v1 (Sept 2025) | @ctrl/tinycolor, ng2-file-upload | Détecté |
394
- | Shai-Hulud v2 (Nov 2025) | @asyncapi/specs, posthog-node, kill-port | Détecté |
395
- | Shai-Hulud v3 (Dec 2025) | @vietmoney/react-big-calendar | Détecté |
396
- | event-stream (2018) | flatmap-stream, event-stream | Détecté |
397
- | eslint-scope (2018) | eslint-scope | Détecté |
398
- | Protestware | node-ipc, colors, faker | Détecté |
399
- | Typosquats | crossenv, mongose, babelcli | Détecté |
400
-
401
- ### Techniques détectées
402
-
403
- | Technique | MITRE | Détection |
404
- |-----------|-------|-----------|
405
- | Vol credentials (.npmrc, .ssh) | T1552.001 | AST |
406
- | Exfiltration env vars | T1552.001 | AST |
407
- | Exécution code distant | T1105 | Pattern |
408
- | Reverse shell | T1059.004 | Pattern |
409
- | Dead man's switch | T1485 | Pattern |
410
- | Code obfusqué | T1027 | Heuristiques |
411
- | Analyse entropie Shannon | T1027 | Calcul d'entropie |
412
- | Typosquatting (npm + PyPI) | T1195.002 | Levenshtein |
413
- | Supply chain compromise | T1195.002 | IOC matching |
414
- | Package PyPI malveillant | T1195.002 | IOC matching |
415
- | Sandbox analyse dynamique | Multiple | Docker + strace + tcpdump |
416
- | Ajout soudain de script lifecycle | T1195.002 | Analyse temporelle |
417
- | Injection d'API dangereuse entre versions | T1195.002 | Diff AST temporel |
418
- | Anomalie de fréquence de publication | T1195.002 | Métadonnées registre |
419
- | Changement de maintainer/publisher | T1195.002 | Métadonnées registre |
420
- | Exfiltration de canary tokens | T1552.001 | Honey tokens sandbox |
421
- | Weaponisation agent IA | T1059.004 | AST (flags s1ngularity/Nx) |
422
- | Injection prompt config IA | T1059.004 | Scan fichiers (.cursorrules, CLAUDE.md) |
423
- | Vol credentials CLI (gh, gcloud, aws) | T1552.001 | AST |
424
- | Dropper binaire (chmod + exec /tmp) | T1105 | AST |
425
- | Hooking prototype (fetch, XMLHttpRequest) | T1557 | AST |
426
- | Injection workflow (.github/workflows) | T1195.002 | AST |
427
- | Harvest crypto wallets | T1005 | Dataflow |
428
- | Require cache poisoning | T1574.001 | AST |
429
- | Staged eval decode (eval+atob/Buffer) | T1140 | AST |
430
- | Désobfuscation (string concat, charcode, base64, hex) | T1140 | Pré-traitement AST |
431
- | Dataflow cross-fichiers (exfiltration inter-module) | T1041 | Module graph |
432
-
433
- ---
434
-
435
- ## Détection d'anomalies supply chain (v2.0)
436
-
437
- MUAD'DIB 2.0 introduit un changement de paradigme : de la **détection par IOC** (réactive, nécessite des menaces connues) à la **détection comportementale d'anomalies** (proactive, détecte les menaces inconnues en repérant les changements suspects).
438
-
439
- Les scanners supply-chain traditionnels reposent sur des listes de packages malveillants connus. Le problème : ils ne détectent les menaces qu'APRÈS leur identification et signalement. Des attaques comme **ua-parser-js** (2021), **event-stream** (2018) et **Shai-Hulud** (2025) sont passées inaperçues pendant des heures ou des jours car aucun IOC n'existait encore.
440
-
441
- MUAD'DIB 2.0 ajoute 5 features de détection comportementale capables d'attraper ces attaques **avant** leur apparition dans une base d'IOC, en analysant ce qui a changé entre les versions d'un package.
442
-
443
- ### Nouvelles features
444
-
445
- #### 1. Détection soudaine de scripts lifecycle (`--temporal`)
446
-
447
- Détecte quand des scripts `preinstall`, `install` ou `postinstall` apparaissent soudainement dans une nouvelle version d'un package qui n'en avait jamais. C'est le vecteur d'attaque #1 des attaques supply-chain.
448
-
449
- ```bash
450
- muaddib scan . --temporal
451
- ```
452
-
453
- #### 2. Diff AST temporel (`--temporal-ast`)
454
-
455
- Télécharge les deux dernières versions de chaque dépendance et compare leur AST (Abstract Syntax Tree) pour détecter les APIs dangereuses nouvellement ajoutées : `child_process`, `eval`, `Function`, `net.connect`, `process.env`, `fetch`, etc.
456
-
457
- ```bash
458
- muaddib scan . --temporal-ast
459
- ```
460
-
461
- #### 3. Anomalie de fréquence de publication (`--temporal-publish`)
462
-
463
- Détecte les patterns de publication anormaux : rafale de versions en 24h, package dormant soudainement mis à jour après 6+ mois, succession rapide de versions (plusieurs releases en moins d'1h).
464
-
465
- ```bash
466
- muaddib scan . --temporal-publish
467
- ```
468
-
469
- #### 4. Détection de changement de maintainer (`--temporal-maintainer`)
470
-
471
- Détecte les changements de maintainers entre versions : nouveau maintainer ajouté, seul maintainer remplacé (pattern event-stream), noms de maintainers suspects, nouveau publisher.
472
-
473
- ```bash
474
- muaddib scan . --temporal-maintainer
475
- ```
476
-
477
- #### 5. Canary Tokens / Honey Tokens (sandbox)
478
-
479
- Injecte de faux credentials dans l'environnement sandbox avant d'installer un package. Si le package tente d'exfiltrer ces honey tokens via HTTP, DNS, filesystem ou stdout, il est signalé comme malveillant confirmé.
480
-
481
- 6 honeypots sont injectés :
482
- - `GITHUB_TOKEN` / `NPM_TOKEN` — Tokens de registre
483
- - `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` — Credentials cloud
484
- - `SLACK_WEBHOOK_URL` / `DISCORD_WEBHOOK_URL` — Webhooks de messagerie
485
-
486
- Les tokens dynamiques (aléatoires par session, depuis `canary-tokens.js`) et les tokens statiques de fallback (dans `sandbox-runner.sh`) sont utilisés pour une défense en profondeur.
487
-
488
- ```bash
489
- muaddib sandbox suspicious-package
490
- ```
491
-
492
- ### Scan temporel complet
493
-
494
- Activer toutes les features d'analyse temporelle en une commande :
495
-
496
- ```bash
497
- muaddib scan . --temporal-full
498
- ```
499
-
500
- ### Exemples d'utilisation
501
-
502
- ```bash
503
- # Scan comportemental complet (5 features)
504
- muaddib scan . --temporal-full
505
-
506
- # Détection lifecycle scripts uniquement
507
- muaddib scan . --temporal
508
-
509
- # Diff AST + changement maintainer
510
- muaddib scan . --temporal-ast --temporal-maintainer
511
-
512
- # Sandbox avec canary tokens (activé par défaut)
513
- muaddib sandbox suspicious-package
514
-
515
- # Sandbox sans canary tokens
516
- muaddib sandbox suspicious-package --no-canary
517
- ```
518
-
519
- ### Nouvelles règles de détection (v2.0)
520
-
521
- | Rule ID | Nom | Sévérité | Feature |
522
- |---------|-----|----------|---------|
523
- | MUADDIB-TEMPORAL-001 | Ajout soudain de script lifecycle (Critique) | CRITICAL | `--temporal` |
524
- | MUADDIB-TEMPORAL-002 | Ajout soudain de script lifecycle | HIGH | `--temporal` |
525
- | MUADDIB-TEMPORAL-003 | Script lifecycle modifié | MEDIUM | `--temporal` |
526
- | MUADDIB-TEMPORAL-AST-001 | API dangereuse ajoutée (Critique) | CRITICAL | `--temporal-ast` |
527
- | MUADDIB-TEMPORAL-AST-002 | API dangereuse ajoutée (High) | HIGH | `--temporal-ast` |
528
- | MUADDIB-TEMPORAL-AST-003 | API dangereuse ajoutée (Medium) | MEDIUM | `--temporal-ast` |
529
- | MUADDIB-PUBLISH-001 | Rafale de publications détectée | HIGH | `--temporal-publish` |
530
- | MUADDIB-PUBLISH-002 | Pic de package dormant | HIGH | `--temporal-publish` |
531
- | MUADDIB-PUBLISH-003 | Succession rapide de versions | MEDIUM | `--temporal-publish` |
532
- | MUADDIB-MAINTAINER-001 | Nouveau maintainer ajouté | HIGH | `--temporal-maintainer` |
533
- | MUADDIB-MAINTAINER-002 | Maintainer suspect détecté | CRITICAL | `--temporal-maintainer` |
534
- | MUADDIB-MAINTAINER-003 | Seul maintainer changé | HIGH | `--temporal-maintainer` |
535
- | MUADDIB-MAINTAINER-004 | Nouveau publisher détecté | MEDIUM | `--temporal-maintainer` |
536
- | MUADDIB-CANARY-001 | Exfiltration de canary token | CRITICAL | sandbox |
537
-
538
- ### Pourquoi c'est important
539
-
540
- Ces features détectent des attaques comme :
541
- - **Shai-Hulud** (2025) : Détecté par temporal lifecycle + AST diff (ajout soudain de `postinstall` + `child_process`)
542
- - **ua-parser-js** (2021) : Détecté par changement maintainer + détection lifecycle
543
- - **event-stream** (2018) : Détecté par changement de seul maintainer + AST diff (nouvelle dépendance `flatmap-stream` avec `eval`)
544
- - **coa/rc** (2021) : Détecté par rafale de publications + détection lifecycle
545
-
546
- Le tout sans avoir besoin d'un seul IOC.
547
-
548
- ---
549
-
550
- ## Sources IOC
551
-
552
- MUAD'DIB agrège la threat intelligence de sources vérifiées uniquement :
553
-
554
- | Source | Type | Couverture |
555
- |--------|------|------------|
556
- | [OSV.dev npm dump](https://osv.dev) | Bulk zip | 200 000+ entrées npm MAL-* |
557
- | [OSV.dev PyPI dump](https://osv.dev) | Bulk zip | 14 000+ entrées PyPI MAL-* |
558
- | [GenSecAI Shai-Hulud Detector](https://github.com/gensecaihq/Shai-Hulud-2.0-Detector) | GitHub | 700+ packages Shai-Hulud |
559
- | [DataDog Security Labs](https://github.com/DataDog/indicators-of-compromise) | GitHub | IOCs consolidés de 7 vendors |
560
- | [OSSF Malicious Packages](https://github.com/ossf/malicious-packages) | API OSV | 8000+ rapports malware |
561
- | [GitHub Advisory](https://github.com/advisories?query=type%3Amalware) | API OSV | Advisories tagués malware |
562
- | Snyk Known Malware | Statique | Attaques historiques |
563
- | Socket.dev / Phylum | Statique | Ajouts manuels |
564
-
565
- ---
566
-
567
- ## VS Code
568
-
569
- L'extension VS Code scanne automatiquement vos projets npm.
570
-
571
- ### Installation
572
-
573
- Cherchez "MUAD'DIB" dans les Extensions VS Code, ou :
574
-
575
- ```bash
576
- code --install-extension dnszlsk.muaddib-vscode
577
- ```
578
-
579
- ### Commandes
580
-
581
- - `MUAD'DIB: Scan Project` - Scanner tout le projet
582
- - `MUAD'DIB: Scan Current File` - Scanner le fichier actuel
583
-
584
- ### Configuration
585
-
586
- - `muaddib.autoScan` - Scanner automatiquement à l'ouverture (défaut: true)
587
- - `muaddib.webhookUrl` - URL webhook Discord/Slack
588
- - `muaddib.failLevel` - Niveau d'alerte (critical/high/medium/low)
589
-
590
- ---
591
-
592
- ## CI/CD
593
-
594
- ### GitHub Actions (Marketplace)
595
-
596
- Utilisez l'action officielle MUAD'DIB depuis le GitHub Marketplace :
597
-
598
- ```yaml
599
- name: Security Scan
600
-
601
- on: [push, pull_request]
602
-
603
- jobs:
604
- scan:
605
- runs-on: ubuntu-latest
606
- permissions:
607
- security-events: write
608
- contents: read
609
- steps:
610
- - uses: actions/checkout@v4
611
- - uses: DNSZLSK/muad-dib@v1
612
- with:
613
- path: '.'
614
- fail-on: 'high'
615
- sarif: 'results.sarif'
616
- ```
617
-
618
- #### Inputs de l'action
619
-
620
- | Input | Description | Défaut |
621
- |-------|-------------|--------|
622
- | `path` | Chemin à scanner | `.` |
623
- | `fail-on` | Sévérité minimum pour échec (critical/high/medium/low) | `high` |
624
- | `sarif` | Chemin du fichier SARIF | `` |
625
- | `paranoid` | Activer détection ultra-stricte | `false` |
626
-
627
- #### Outputs de l'action
628
-
629
- | Output | Description |
630
- |--------|-------------|
631
- | `sarif-file` | Chemin du fichier SARIF généré |
632
- | `risk-score` | Score de risque (0-100) |
633
- | `threats-count` | Nombre de menaces détectées |
634
- | `exit-code` | Code de sortie (0 = clean) |
635
-
636
- Les alertes apparaissent dans Security > Code scanning alerts.
637
-
638
- ---
639
-
640
- ## Architecture
641
-
642
- ```
643
- MUAD'DIB 2.2.24 Scanner
644
- |
645
- +-- IOC Match (225 000+ packages, JSON DB)
646
- | +-- OSV.dev npm dump (200K+ entrées MAL-*)
647
- | +-- OSV.dev PyPI dump (14K+ entrées MAL-*)
648
- | +-- GenSecAI Shai-Hulud Detector
649
- | +-- DataDog Consolidated IOCs
650
- | +-- OSSF Malicious Packages (via OSV)
651
- | +-- GitHub Advisory (malware)
652
- | +-- Snyk Known Malware
653
- | +-- Static IOCs (Socket, Phylum)
654
- |
655
- +-- Pré-traitement Désobfuscation (v2.2.5, --no-deobfuscate pour désactiver)
656
- | +-- String concat folding, reconstruction CharCode
657
- | +-- Décodage Base64, résolution Hex array
658
- | +-- Propagation de constantes (Phase 2)
659
- |
660
- +-- Dataflow Inter-module (v2.2.6, --no-module-graph pour désactiver)
661
- | +-- Graphe de dépendances, annotation exports teintés
662
- | +-- Chaînes re-export 3 hops, analyse méthodes de classe
663
- | +-- Détection credential read → network sink cross-fichiers
664
- |
665
- +-- 14 Scanners Parallèles (94 règles)
666
- | +-- AST Parse (acorn) — eval/Function, credential CLI theft, binary droppers, prototype hooks
667
- | +-- Pattern Matching (shell, scripts)
668
- | +-- Typosquat Detection (npm + PyPI, Levenshtein)
669
- | +-- Python Scanner (requirements.txt, setup.py, pyproject.toml)
670
- | +-- Analyse Entropie Shannon
671
- | +-- GitHub Actions Scanner
672
- | +-- AI Config Scanner (.cursorrules, CLAUDE.md, copilot-instructions.md)
673
- | +-- Package, Dependencies, Hash, npm-registry, Dataflow scanners
674
- |
675
- +-- Détection d'Anomalies Supply Chain (v2.0)
676
- | +-- Détection Lifecycle Script Temporelle (--temporal)
677
- | +-- Diff AST Temporel (--temporal-ast)
678
- | +-- Anomalie Fréquence de Publication (--temporal-publish)
679
- | +-- Détection Changement Maintainer (--temporal-maintainer)
680
- | +-- Canary Tokens / Honey Tokens (sandbox)
681
- |
682
- +-- Validation & Observabilité (v2.1)
683
- | +-- Ground Truth Dataset (51 attaques réelles, 91.8% TPR)
684
- | +-- Logging Temps de Détection (first_seen, métriques lead time)
685
- | +-- Suivi Taux FP (stats quotidiennes, taux faux positifs)
686
- | +-- Décomposition Score (scoring explicable par règle)
687
- | +-- API Threat Feed (serveur HTTP, flux JSON pour SIEM)
688
- |
689
- +-- Réduction FP Post-traitement (v2.2.8-v2.2.9)
690
- | +-- Downgrade sévérité par comptage (dynamic_require, dataflow, etc.)
691
- | +-- Cap scoring prototype_hook MEDIUM
692
- | +-- Obfuscation dans dist/build → LOW
693
- | +-- Filtrage env vars safe + préfixes
694
- |
695
- +-- Scoring Per-File Max (v2.2.11)
696
- | +-- Score = max(scores_par_fichier) + score_package_level
697
- | +-- Élimine l'accumulation de score sur de nombreux fichiers
698
- | +-- Menaces package-level (lifecycle, typosquat, IOC) scorées séparément
699
- |
700
- +-- Paranoid Mode (ultra-strict)
701
- +-- Docker Sandbox (analyse comportementale, capture réseau, canary tokens, CI-aware)
702
- +-- Moniteur Zero-Day (interne : polling RSS npm + PyPI, alertes Discord, rapport quotidien)
703
- |
704
- v
705
- Dataflow Analysis (credential read -> network send)
706
- |
707
- v
708
- Threat Enrichment (rules, MITRE ATT&CK, playbooks)
709
- |
710
- v
711
- Output (CLI, JSON, HTML, SARIF, Webhook, Threat Feed)
712
- ```
713
-
714
- ---
715
-
716
- ## Metriques d'evaluation
717
-
718
- | Metrique | Resultat | Details |
719
- |----------|----------|---------|
720
- | **TPR** (Ground Truth) | **91.8%** (45/49) | 51 attaques reelles (49 actives). 4 hors scope : browser-only (3) + risque FP (1) |
721
- | **FPR** (Packages standard) | **6.2%** (18/290) | Packages avec <10 fichiers JS — librairies et outils typiques |
722
- | **FPR** (Benign, global) | **~13%** (69/527) | 529 packages npm, vrai code source via `npm pack`, seuil > 20 |
723
- | **ADR** (Adversarial + Holdout) | **100%** (78/78) | 38 adversariaux + 40 holdouts evasifs sur 5 vagues red team |
724
-
725
- **FPR par taille de package** — Le FPR correle lineairement avec la taille du package. Le scoring per-file max (v2.2.11) reduit significativement les FP sur les packages moyens/gros :
726
-
727
- | Categorie | Packages | FP | FPR |
728
- |-----------|----------|-----|-----|
729
- | Petits (<10 fichiers JS) | 290 | 18 | **6.2%** |
730
- | Moyens (10-50 fichiers JS) | 135 | 16 | 11.9% |
731
- | Gros (50-100 fichiers JS) | 40 | 10 | 25.0% |
732
- | Tres gros (100+ fichiers JS) | 62 | 25 | 40.3% |
733
-
734
- **Progression FPR** : 0% (invalide, dirs vides, v2.2.0-v2.2.6) → 38% (premiere vraie mesure, v2.2.7) → 19.4% (v2.2.8) → 17.5% (v2.2.9) → **~13%** (v2.2.11, scoring per-file max)
735
-
736
- **Progression holdout** (scores pre-tuning, regles gelees) :
737
-
738
- | Holdout | Score | Focus |
739
- |---------|-------|-------|
740
- | v1 | 30% (3/10) | Patterns generaux |
741
- | v2 | 40% (4/10) | Env charcode, lifecycle, prototype |
742
- | v3 | 60% (6/10) | Require cache, DNS TXT, reverse shell |
743
- | v4 | **80%** (8/10) | Efficacite desobfuscation |
744
- | v5 | 50% (5/10) | Dataflow inter-module (nouveau scanner) |
745
-
746
- - **TPR** (True Positive Rate) : taux de detection sur 49 attaques supply-chain reelles (event-stream, ua-parser-js, coa, flatmap-stream, eslint-scope, solana-web3js, et 43 autres). 4 misses : browser-only (lottie-player, polyfill-io, trojanized-jquery) ou risque FP (websocket-rat) — voir [Threat Model](docs/threat-model.md).
747
- - **FPR** (False Positive Rate) : packages avec score > 20 sur 529 packages npm reels (code source scanne, pas des dirs vides). Le 6.2% sur les packages standard (<10 fichiers JS, 290 packages) est la metrique la plus representative pour un usage typique — la plupart des packages npm sont petits.
748
- - **ADR** (Adversarial Detection Rate) : taux de detection sur 78 samples malveillants evasifs — 38 adversariaux (4 vagues red team + 3 bypasses) + 40 holdouts (5 batches de 10, testant obfuscation, dataflow inter-module, etc.)
749
- - **Holdout** (pre-tuning) : taux de detection sur 10 samples jamais vus avec regles gelees (mesure de generalisation)
750
-
751
- Datasets : 529 npm + 132 PyPI packages benins, 78 samples adversariaux/holdout, 51 attaques ground-truth (65 packages malveillants documentes). **1317 tests**, 86% coverage.
752
-
753
- Voir [Evaluation Methodology](docs/EVALUATION_METHODOLOGY.md) pour le protocole experimental complet.
754
-
755
- ---
756
-
757
- ## Contribuer
758
-
759
- ### Ajouter des IOCs
760
-
761
- Editez les fichiers YAML dans `iocs/` :
762
-
763
- ```yaml
764
- - id: NEW-MALWARE-001
765
- name: "malicious-package"
766
- version: "*"
767
- severity: critical
768
- confidence: high
769
- source: community
770
- description: "Description de la menace"
771
- references:
772
- - https://example.com/article
773
- mitre: T1195.002
774
- ```
775
-
776
- ### Développer
777
-
778
- ```bash
779
- git clone https://github.com/DNSZLSK/muad-dib
780
- cd muad-dib
781
- npm install
782
- npm test
783
- ```
784
-
785
- ### Tests
786
-
787
- - **1317 tests unitaires/integration** sur 20 fichiers modulaires - 86% coverage via [Codecov](https://codecov.io/gh/DNSZLSK/muad-dib)
788
- - **56 tests de fuzzing** - YAML malforme, JSON invalide, fichiers binaires, ReDoS, unicode, inputs 10MB
789
- - **78 samples adversariaux/holdout** - 38 adversariaux + 40 holdouts, 78/78 taux de detection (100% ADR)
790
- - **Validation ground truth** - 51 attaques reelles (45/49 detectees = 91.8% TPR). 4 hors scope : browser-only (3) + risque FP (1)
791
- - **Validation faux positifs** - 6.2% FPR sur packages standard (18/290), ~13% global (69/527) sur vrai code source npm via `npm pack`
792
- - **Audit ESLint securite** - `eslint-plugin-security` avec 14 regles activees
793
-
794
- ---
795
-
796
- ## Communauté
797
-
798
- - Discord: https://discord.gg/y8zxSmue
799
-
800
- ---
801
-
802
- ## Documentation
803
-
804
- - [Evaluation Methodology](docs/EVALUATION_METHODOLOGY.md) - Protocole expérimental, scores holdout bruts, sources d'attaques
805
- - [Threat Model](docs/threat-model.md) - Ce que MUAD'DIB détecte et ne détecte pas
806
- - [Rapport d'audit sécurité v1.4.1](docs/MUADDIB_Security_Audit_Report_v1.4.1.pdf) - Audit complet (58 issues corrigées)
807
- - [IOCs YAML](iocs/) - Base de données des menaces
808
-
809
- ---
810
-
811
- ## Licence
812
-
813
- MIT
814
-
815
- ---
816
-
817
- <p align="center">
818
- <strong>The spice must flow. The worms must die.</strong>
819
- </p>