
Un scanner de paquets public pour la communauté
Analyseur de chaîne d'approvisionnement npm, ultra-simple et conçu pour Docker. Un seul fichier compose exécute :
Il s'agit de l'édition conteneur uniquement. Le projet peut être construit pour passer à l'échelle avec EC2, SQS et RDS. La plupart des éléments sont déjà configurés dans l'ensemble d'outils.
scan.yml (listes blanches, seuils, YARA)scan_runs) prêt à l'emploi~/.aws)docker-compose.yml – services : db, enumerateur, téléchargeur, analyseur, tableau de bord, init-dbenumerator/ – Worker Node qui construit la file d'attente NDJSONfetcher/ – Worker Node qui télécharge les archives (+ envoi vers S3 si activé)analyzer/ – Analyseur Python statique (+ YARA intégré en option)dashboard/ – Application Streamlit (port 8501)infra/migrations.sql – schéma de base de données principal (paquets, versions, résultats, scores, index)infra/20251106_scan_runs.sql – table d'historique des analysesscan.yml – configuration d'analyse (règles, notation, listes blanches, YARA)scripts/run_pipeline.sh – exécute l'enumeration → téléchargement → analysescripts/init_db.sh – amorçage du schéma de la base de donnéesscripts/test_setup.sh – validation automatisée de l'installationSCANNING_GUIDE.md – stratégies d'analyse détaillées et exemplesPrérequis : Docker Desktop (ou moteur) avec Compose v2.
curl -fsSL https://raw.githubusercontent.com/MHaggis/Package-Inferno/main/install.sh | bash
Clone le dépôt dans ~/package-inferno et vous donne les instructions pour commencer.
Tirez et exécutez les conteneurs pré-construits depuis le registre des conteneurs GitHub :
# Clonez le dépôt (pour les fichiers de configuration et les scripts)
git clone https://github.com/MHaggis/Package-Inferno.git
cd Package-Inferno
# Exécutez avec les images pré-construites
docker compose -f docker-compose.ghcr.yml up -d db
./scripts/init_db.sh
SEEDS="lodash,express" docker compose -f docker-compose.ghcr.yml run --rm enumerator
docker compose -f docker-compose.ghcr.yml run --rm fetcher
docker compose -f docker-compose.ghcr.yml run --rm analyzer
Images disponibles :
ghcr.io/mhaggis/package-inferno/enumerator:mainghcr.io/mhaggis/package-inferno/fetcher:mainghcr.io/mhaggis/package-inferno/analyzer:mainExécutez le script de test pour valider votre installation :
./scripts/test_setup.sh
Cela va :
docker compose up -d db
./scripts/init_db.sh
./scripts/run_pipeline.sh
docker compose up -d dashboard
# ouvrez http://localhost:8501
Les résultats se trouvent dans ./out/findings/*.findings.json et dans la table findings lorsque la base de données est activée.
PackageInferno prend en charge plusieurs stratégies d'analyse selon vos objectifs :
| Mode | Cas d'utilisation | Vitesse | Couverture | Commande |
|---|---|---|---|---|
| Graines spécifiques | Tester/analyser des paquets connus | La plus rapide | Ciblée | SEEDS="pkg1,pkg2" |
| Petit lot | Valider l'installation, analyse échantillon | Rapide | 10-100 paquets | MAX_CHUNKS=2 CHUNK_LIMIT=10 |
| Registre complet | Audit complet de la chaîne d'approvisionnement | Heures-Jours | 2M+ paquets | MAX_CHUNKS=0 CHUNK_LIMIT=100 |
| Flux de modifications | Surveiller les nouvelles versions (inclus automatiquement) | Temps réel | Mises à jour récentes | Intégré |
Ciblez des paquets spécifiques que vous souhaitez analyser :
# Commande unique avec des graines
export SEEDS="lodash,express,axios"
./scripts/run_pipeline.sh
# Ou depuis un fichier
echo -e "react\nvue\nangular" > packages.txt
export SEEDS_FILE=packages.txt
./scripts/run_pipeline.sh
Comment j'ai testé initialement : J'ai utilisé SEEDS="is-odd,is-even" pour une validation rapide.
Analysez des paquets paginés depuis le registre npm :
# Nettoyez les exécutions précédentes
rm -rf downloads/* out/*
# Analysez 2 pages de 10 paquets chacune (20 paquets)
export MAX_CHUNKS=2 # Nombre de pages
export CHUNK_LIMIT=10 # Paquets par page
unset SEEDS # Important : désactiver le mode graines
# Exécutez les étapes individuellement pour une meilleure visibilité
docker compose run --rm enumerator # Découvre et met en file d'attente
docker compose run --rm fetcher # Télécharge les archives
docker compose run --rm analyzer # Analyse les menaces
Exemple de sortie :
config: chunkLimit=10, maxChunks=2
checking recent changes feed...
changes feed: enqueued 2 new versions
enumerating via _all_docs (fresh scan)
page 1/2 count: 10
page 2/2 count: 10
done, enqueued 22 (22 new versions)
Analysez l'ensemble du registre npm :
export MAX_CHUNKS=0 # 0 = illimité
export CHUNK_LIMIT=100 # Lots plus grands pour l'efficacité
./scripts/run_pipeline.sh
Attention : Cela va s'exécuter pendant des heures/jours et analyser des centaines de milliers de paquets. Surveillez l'espace disque et la taille de la base de données.
L'enumerateur sauvegarde l'état dans ./out/enumerator_state.json avec la position du curseur :
{
"last_seq": "0",
"last_startkey": "package-name",
"last_run": "2025-11-23T19:24:49.123Z",
"last_processed": 22,
"last_new": 22
}
Réexécutez simplement le pipeline et il reprendra à partir du dernier curseur :
./scripts/run_pipeline.sh # Reprend automatiquement
Pour forcer une nouvelle analyse :
rm -f out/enumerator_state.json
./scripts/run_pipeline.sh
D'après une analyse de 2 pages de 22 paquets, voici ce que PackageInferno a détecté :
-- Paquets les plus suspects par score
SELECT p.name, s.score, s.label, COUNT(f.id) as findings
FROM packages p
JOIN versions v ON p.id = v.package_id
JOIN scores s ON v.id = s.version_id
LEFT JOIN findings f ON v.id = f.version_id
GROUP BY p.name, s.score, s.label
ORDER BY s.score DESC;
-- Résultats :
name | score | label | findings
-----------------------+-------+------------+----------
rendition | 606 | malveillant | 153
vs-deploy | 454 | malveillant | 119
--123hoodmane-pyodide | 213 | malveillant | 46