Какие уязвимости показывает npm audit?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
npm audit: типы уязвимостей и их анализ
npm audit — встроенный инструмент Node.js для проверки безопасности зависимостей. Вот подробный анализ типов уязвимостей, которые он выявляет.
Как работает npm audit
npm audit
npm audit --json # JSON формат для парсинга
npm audit fix # Автоматическое исправление
npm audit fix --force # Принудительное обновление
npm audit --audit-level=high # Только high/critical уязвимости
Типы уязвимостей
1. Уязвимости безопасности (Security Vulnerabilities)
Наиболее критичные, связаны с взломом:
# Пример вывода npm audit
┌─────────────────────────────────────────────────────────┐
│ Critical │ Expression injection in lodash │
│ Package │ lodash │
│ Severity │ critical │
│ CVE │ CVE-2021-23337 │
│ GHSA │ GHSA-35jh-r3h4-6jhm │
│ More info │ https://nvd.nist.gov/vuln/detail/CVE-... │
└─────────────────────────────────────────────────────────┘
Типичные примеры:
- Injection attacks — SQL injection, command injection
- Authentication bypass — обход авторизации
- Crypto flaws — слабые криптографические алгоритмы
- Denial of Service — crash через специальный input
2. Уровни серьезности (Severity Levels)
CRITICAL (критична) — немедленное обновление
HIGH (высокая) — обновить в ближайшее время
MODERATE (средняя) — обновить в нормальном режиме
LOW (низкая) — обновить при возможности
3. Уязвимости в зависимостях (Transitive Dependencies)
npm audit находит проблемы не только прямых зависимостей:
{
"name": "my-app",
"dependencies": {
"express": "4.18.0" // прямая зависимость
}
}
// npm audit найдет уязвимости:
// express → body-parser → qs (уязвимость в qs!)
4. Специфические типы уязвимостей
Deserialization attacks:
// Опасно: может выполнить код при десериализации
const pickle = require('pickle');
pickle.loads(userInput); // УЯЗВИМО!
Command injection:
// Опасно: пользовательский ввод в shell команду
exec(`ffmpeg -i ${filename}`); // УЯЗВИМО!
Path traversal:
// Опасно: доступ к файлам вне каталога
fs.readFile(`./uploads/${userPath}`); // УЯЗВИМО!
Regular expression DoS (ReDoS):
// Опасно: регулярное выражение может зависнуть
/^(a+)+$/.test(longString); // УЯЗВИМО!
Prototype pollution:
// Опасно: загрязнение Object.prototype
Object.assign({}, userInput); // может быть опасно
Практический пример npm audit
$ npm audit
added 150 packages in 5s
78 vulnerabilities found
0 critical, 6 high, 25 moderate, 47 low
Run "npm audit fix" to fix 23 of them.
24 vulnerabilities require manual review. Run "npm audit fix --force" to address them.
┌─────────────────────────────────────────────────────────┐
│ High │ Regular Expression Denial of Service │
│ Package │ minimatch │
│ Severity │ high │
│ Fix in │ 3.1.0 │
│ More │ https://nvd.nist.gov/vuln/detail/CVE-... │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ Moderate │ Uncontrolled Resource Consumption │
│ Package │ lodash │
│ Severity │ moderate │
│ Fix in │ 4.17.21 │
│ More │ https://nvd.nist.gov/vuln/detail/CVE-... │
└─────────────────────────────────────────────────────────┘
Исправление уязвимостей
Автоматическое исправление:
npm audit fix # Обновляет до совместимой версии
Принудительное исправление:
npm audit fix --force # Может сломать совместимость!
Ручное исправление:
# 1. Проверь, какая версия нужна
npm show lodash versions
# 2. Обнови в package.json
npm install lodash@4.17.21
# 3. Проверь, что тесты прошли
npm test
Игнорирование уязвимостей (не рекомендуется):
{
"npm": {
"audit": {
"auditConfig": {
"ignoredAdvisories": [1088996, 1088997]
}
}
}
}
Интеграция с CI/CD
В GitHub Actions для автоматической проверки:
name: Security Audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm ci
- run: npm audit --audit-level=moderate
CVE и GHSA
npm audit использует две базы данных уязвимостей:
- CVE (Common Vulnerabilities and Exposures) — официальная база
- GHSA (GitHub Security Advisory) — от GitHub Security Lab
# Найти информацию о конкретной уязвимости
curl https://api.github.com/advisories/GHSA-35jh-r3h4-6jhm
Реальные примеры из production
1. lodash ReDoS (2021)
Severity: high
Package: lodash < 4.17.21
Issue: Regular expression denial of service
2. Minimatch ReDoS (2021)
Severity: high
Package: minimatch < 3.0.5
Issue: Regular expression backtracking
3. axios SSRF (2020)
Severity: high
Package: axios < 0.21.2
Issue: Server-Side Request Forgery
Лучшие практики
-
Регулярно запускай npm audit
npm audit # После каждого npm install -
Устанавливай критичные уязвимости немедленно
npm audit fix # В production готовиться к этому -
Обновляй зависимости регулярно
npm update # Раз в неделю/месяц npm outdated # Посмотри какие версии устарели -
Используй dependabot или Snyk
- Автоматические PR для обновлений
- Сканирование каждого commit
- Уведомления о новых уязвимостях
-
Минимизируй зависимости
- Удаляй неиспользуемые пакеты
- Выбирай пакеты с меньшим deque дерево
- Регулярно аудитируй node_modules
-
Тестируй после обновлений
npm audit fix npm test npm run build
На практике
На production приходилось:
- Откладывать релизы из-за конфликтов обновлений
- Форсировать обновления для критичных уязвимостей
- Боротся с зависимостями, которые не обновлялись давно
- Использовать Snyk для более детального анализа
Главный вывод: npm audit — это начало, но нужна комплексная стратегия безопасности.