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.md +1 -1
- package/bin/muaddib.js +2 -1
- package/package.json +1 -1
- package/README.fr.md +0 -819
- package/assets/muaddibLogo.png +0 -0
- package/src/commands/evaluate.js +0 -484
- package/src/daemon.js +0 -178
- package/src/monitor.js +0 -1880
- package/src/serve.js +0 -58
- package/src/threat-feed.js +0 -95
- package/src/webhook.js +0 -413
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>
|