muaddib-scanner 2.2.24 → 2.2.26
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 +4 -4
- package/README.md +4 -4
- package/package.json +1 -1
- package/src/ioc/scraper.js +6 -0
package/README.fr.md
CHANGED
|
@@ -285,7 +285,7 @@ Ajoutez à `.pre-commit-config.yaml` :
|
|
|
285
285
|
```yaml
|
|
286
286
|
repos:
|
|
287
287
|
- repo: https://github.com/DNSZLSK/muad-dib
|
|
288
|
-
rev: v2.2.
|
|
288
|
+
rev: v2.2.24
|
|
289
289
|
hooks:
|
|
290
290
|
- id: muaddib-scan # Scanner toutes les menaces
|
|
291
291
|
# - id: muaddib-diff # Ou: seulement les nouvelles
|
|
@@ -640,7 +640,7 @@ Les alertes apparaissent dans Security > Code scanning alerts.
|
|
|
640
640
|
## Architecture
|
|
641
641
|
|
|
642
642
|
```
|
|
643
|
-
MUAD'DIB 2.2.
|
|
643
|
+
MUAD'DIB 2.2.24 Scanner
|
|
644
644
|
|
|
|
645
645
|
+-- IOC Match (225 000+ packages, JSON DB)
|
|
646
646
|
| +-- OSV.dev npm dump (200K+ entrées MAL-*)
|
|
@@ -748,7 +748,7 @@ Output (CLI, JSON, HTML, SARIF, Webhook, Threat Feed)
|
|
|
748
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
749
|
- **Holdout** (pre-tuning) : taux de detection sur 10 samples jamais vus avec regles gelees (mesure de generalisation)
|
|
750
750
|
|
|
751
|
-
Datasets : 529 npm + 132 PyPI packages benins, 78 samples adversariaux/holdout, 51 attaques ground-truth (65 packages malveillants documentes).
|
|
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
752
|
|
|
753
753
|
Voir [Evaluation Methodology](docs/EVALUATION_METHODOLOGY.md) pour le protocole experimental complet.
|
|
754
754
|
|
|
@@ -784,7 +784,7 @@ npm test
|
|
|
784
784
|
|
|
785
785
|
### Tests
|
|
786
786
|
|
|
787
|
-
- **
|
|
787
|
+
- **1317 tests unitaires/integration** sur 20 fichiers modulaires - 86% coverage via [Codecov](https://codecov.io/gh/DNSZLSK/muad-dib)
|
|
788
788
|
- **56 tests de fuzzing** - YAML malforme, JSON invalide, fichiers binaires, ReDoS, unicode, inputs 10MB
|
|
789
789
|
- **78 samples adversariaux/holdout** - 38 adversariaux + 40 holdouts, 78/78 taux de detection (100% ADR)
|
|
790
790
|
- **Validation ground truth** - 51 attaques reelles (45/49 detectees = 91.8% TPR). 4 hors scope : browser-only (3) + risque FP (1)
|
package/README.md
CHANGED
|
@@ -285,7 +285,7 @@ Add to `.pre-commit-config.yaml`:
|
|
|
285
285
|
```yaml
|
|
286
286
|
repos:
|
|
287
287
|
- repo: https://github.com/DNSZLSK/muad-dib
|
|
288
|
-
rev: v2.2.
|
|
288
|
+
rev: v2.2.24
|
|
289
289
|
hooks:
|
|
290
290
|
- id: muaddib-scan # Scan all threats
|
|
291
291
|
# - id: muaddib-diff # Or: only new threats
|
|
@@ -641,7 +641,7 @@ Alerts appear in Security > Code scanning alerts.
|
|
|
641
641
|
## Architecture
|
|
642
642
|
|
|
643
643
|
```
|
|
644
|
-
MUAD'DIB 2.2.
|
|
644
|
+
MUAD'DIB 2.2.24 Scanner
|
|
645
645
|
|
|
|
646
646
|
+-- IOC Match (225,000+ packages, JSON DB)
|
|
647
647
|
| +-- OSV.dev npm dump (200K+ MAL-* entries)
|
|
@@ -751,7 +751,7 @@ Output (CLI, JSON, HTML, SARIF, Webhook, Threat Feed)
|
|
|
751
751
|
- **ADR** (Adversarial Detection Rate): detection rate on 75 evasive malicious samples — 35 adversarial (4 red-team waves) + 40 holdout (5 batches of 10, testing obfuscation, inter-module dataflow, etc.)
|
|
752
752
|
- **Holdout** (pre-tuning): detection rate on 10 unseen samples with rules frozen (measures generalization)
|
|
753
753
|
|
|
754
|
-
Datasets: 529 npm + 132 PyPI benign packages, 78 adversarial/holdout samples, 51 ground-truth attacks (65 documented malware packages).
|
|
754
|
+
Datasets: 529 npm + 132 PyPI benign packages, 78 adversarial/holdout samples, 51 ground-truth attacks (65 documented malware packages). **1317 tests**, 86% code coverage.
|
|
755
755
|
|
|
756
756
|
See [Evaluation Methodology](docs/EVALUATION_METHODOLOGY.md) for the full experimental protocol.
|
|
757
757
|
|
|
@@ -787,7 +787,7 @@ npm test
|
|
|
787
787
|
|
|
788
788
|
### Testing
|
|
789
789
|
|
|
790
|
-
- **
|
|
790
|
+
- **1317 unit/integration tests** across 20 modular test files - 86% code coverage via [Codecov](https://codecov.io/gh/DNSZLSK/muad-dib)
|
|
791
791
|
- **56 fuzz tests** - Malformed YAML, invalid JSON, binary files, ReDoS, unicode, 10MB inputs
|
|
792
792
|
- **78 adversarial/holdout samples** - 38 adversarial + 40 holdout, 78/78 detection rate (100% ADR)
|
|
793
793
|
- **Ground truth validation** - 51 real-world attacks (45/49 detected = 91.8% TPR). 4 out-of-scope: browser-only (3) + FP-risky (1)
|
package/package.json
CHANGED
package/src/ioc/scraper.js
CHANGED
|
@@ -753,6 +753,7 @@ async function scrapeOSVDataDump() {
|
|
|
753
753
|
|
|
754
754
|
if ((i + 1) % 1000 === 0 || i === entries.length - 1) {
|
|
755
755
|
spinner.update('Parsing npm entries... ' + (i + 1) + '/' + total);
|
|
756
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
756
757
|
}
|
|
757
758
|
}
|
|
758
759
|
|
|
@@ -811,6 +812,7 @@ async function scrapeOSVPyPIDataDump() {
|
|
|
811
812
|
|
|
812
813
|
if ((i + 1) % 1000 === 0 || i === entries.length - 1) {
|
|
813
814
|
spinner.update('Parsing PyPI entries... ' + (i + 1) + '/' + total);
|
|
815
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
814
816
|
}
|
|
815
817
|
}
|
|
816
818
|
|
|
@@ -1089,6 +1091,8 @@ async function runScraper() {
|
|
|
1089
1091
|
|
|
1090
1092
|
// Smart deduplication: build map of best entry per key
|
|
1091
1093
|
// For duplicates, keep the one with highest confidence, then most recent date
|
|
1094
|
+
const dedupSpinner = new Spinner();
|
|
1095
|
+
dedupSpinner.start('Deduplicating ' + allPackages.length + ' npm + ' + pypiPackages.length + ' PyPI entries...');
|
|
1092
1096
|
const dedupMap = new Map();
|
|
1093
1097
|
|
|
1094
1098
|
// Seed with existing IOCs
|
|
@@ -1182,6 +1186,8 @@ async function runScraper() {
|
|
|
1182
1186
|
];
|
|
1183
1187
|
}
|
|
1184
1188
|
|
|
1189
|
+
dedupSpinner.succeed('Deduplicated: ' + existingIOCs.packages.length + ' npm + ' + existingIOCs.pypi_packages.length + ' PyPI packages (' + addedPackages + ' new, ' + upgradedPackages + ' upgraded)');
|
|
1190
|
+
|
|
1185
1191
|
// Update metadata
|
|
1186
1192
|
existingIOCs.updated = new Date().toISOString();
|
|
1187
1193
|
existingIOCs.sources = [
|