Безопасность зависимостей npm
Вопрос
Как защитить Node-проект от атак через зависимости (захваченный пакет, тайпсквоттинг, вредоносный postinstall)?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Lock-файл в репозитории и `npm ci` в CI: ставится ровно то, что проверено
Сканирование уязвимостей: `npm audit`, Dependabot/Renovate с ревью обновлений, не автомерж мажорных
Отключение скриптов установки там, где возможно (`--ignore-scripts`), осторожно с пакетами с postinstall
Минимум зависимостей, проверка популярности, мейнтейнеров и названия (тайпсквоттинг) перед добавлением
Происхождение пакетов: npm provenance, приватный реестр или прокси с кешем, задержка перед взятием свежих версий
Принцип наименьших прав в рантайме: без секретов в окружении сборки, контейнер не от root, сеть по белым спискам
Что могут спросить следом
- Что делать, если в зависимости нашли критическую уязвимость, а фикса нет?
- Зачем задерживать обновление на свежие версии?
- Как работает npm provenance?
Разбор
Атаки на цепочку поставок в npm происходят регулярно: захват аккаунта мейнтейнера и вредоносный патч-релиз, пакеты с похожими именами, код в postinstall, который крадёт токены из окружения CI. Защищаюсь слоями. Lock-файл в репозитории и npm ci, чтобы ставилось ровно проверенное дерево. Обновления через Renovate или Dependabot с ревью, причём свежие версии беру с задержкой в несколько дней: большинство вредоносных релизов успевают найти и снять. npm audit в CI. Скрипты установки по возможности отключаю, пакеты с postinstall проверяю особо. Перед добавлением зависимости смотрю на популярность, мейнтейнеров, точность названия, и вообще стараюсь не тянуть пакет ради одной функции. Проверяю происхождение через npm provenance, в компании ставлю прокси-реестр. И ограничиваю ущерб: в CI-шаге установки нет секретов деплоя, контейнер не от root, исходящая сеть по белому списку.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API