np-audit: защита от malicious npm lifecycle scripts без зависимостей

#npm#security#supply-chain#static-analysis

TL;DR

np-audit — это zero-dependency инструмент для статического анализа lifecycle-скриптов npm-пакетов перед их выполнением. Он детектит obfuscation, dynamic code execution и другие паттерны атак, не требуя дополнительных зависимостей.

Введение: контекст проблемы

После серии supply-chain атак (event-stream, ua-parser-js и другие) проблема безопасности npm-пакетов стала critical для всех senior-разработчиков. Основной вектор атак — malicious scripts в package.json:

{
  "scripts": {
    "preinstall": "echo 'malicious payload' | sh"
  }
}

Такие скрипты выполняются автоматически при npm install с полным доступом к системе. np-audit решает эту проблему через static analysis без actual execution.

Основные возможности np-audit

Архитектура детекции

np-audit использует 14+ detection modules, работающих на pure Node.js:

// Пример детектора hex-экранирования
function detectHexEscapes(script) {
  return /\\x[0-9a-f]{2}/i.test(script);
}

Ключевые фичи:

  1. Tarball analysis — скачивает и анализирует пакеты без установки
  2. AST-based inspection — парсит скрипты через acorn для выявления:
    // Динамический код
    eval('malicious' + 'payload');
    
  3. Dependency graph traversal — отслеживает require/import цепочки
  4. CVE scanning — интеграция с OSV.dev API

Практическое применение

Замена стандартного npm install:

npx np-audit install lodash

Interactive mode для manual review:

npx np-audit install --review suspicious-package

Детали реализации

Ядро np-audit построено на Node.js built-in модулях:

const { readFileSync } = require('fs');
const { spawnSync } = require('child_process');

// Анализ package.json без eval
function parsePackage(pkgPath) {
  return JSON.parse(readFileSync(pkgPath));
}

Detection patterns

  1. High-entropy strings — детектит base64/hex encoded payloads
  2. Obfuscation techniques:
    // Детектит цепочки конкатенации
    'mal' + 'ware'.split('').reverse().join('');
    
  3. Suspicious API calls:
    require('child_process').exec('rm -rf /');
    

Интеграция в CI/CD

Пример конфига для GitHub Actions:

- name: Audit npm packages
  run: |
    npm install -g np-audit
    npa install

Заключение

np-audit предлагает pragmatic solution для mitigation supply-chain risks в npm-экосистеме. Для senior-разработчиков это must-have инструмент в security toolchain, особенно при работе с sensitive projects.

Что можно улучшить:

Инструмент активно развивается — welcome contributions и feature requests от комьюнити.


Источник: https://github.com/KoblerS/np-audit