Ответ вслух Senior Безопасность бэкенда обновлено

Безопасность зависимостей npm

Вопрос

Как защитить Node-проект от атак через зависимости (захваченный пакет, тайпсквоттинг, вредоносный postinstall)?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Атаки на цепочку поставок в npm происходят регулярно: захват аккаунта мейнтейнера и вредоносный патч-релиз, пакеты с похожими именами, код в postinstall, который крадёт токены из окружения CI. Защищаюсь слоями.

Что должно прозвучать в ответе

  • 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 ошибок.

Термины по теме