Зависимости и supply chain

Ваш код может быть безупречен, но вы тащите за собой сотни чужих библиотек — и их уязвимости становятся вашими.

Атака на цепочку поставок (supply chain) — компрометация через сторонний компонент: библиотеку, пакет или инструмент сборки, которым вы доверяете.

Масштаб проблемы

Современное приложение состоит из вашего кода лишь на малую часть. Остальное — зависимости: фреймворки, утилиты, а у них — свои зависимости (транзитивные). В сумме это сотни и тысячи чужих пакетов. Каждый из них — потенциальная уязвимость, которую вы не писали, но за которую отвечаете перед пользователями.

Откуда берётся риск

  • Известные уязвимости (CVE). В популярной библиотеке нашли дыру — все, кто её используют, уязвимы, пока не обновятся.
  • Вредоносный пакет. Злоумышленник публикует пакет с вредоносным кодом или захватывает заброшенный популярный пакет.
  • Typosquatting. Пакет с именем, похожим на популярный (с опечаткой), в расчёте на то, что кто-то ошибётся при установке.
  • Скомпрометированная сборка. Внедрение вредоносного кода на этапе сборки или в зависимость зависимости.

Как держать зависимости под контролем

ПрактикаЗачем
Фиксация версий (lock-файл)сборка воспроизводима, не подтянется неожиданная версия
Сканеры уязвимостейпредупреждают о зависимостях с известными CVE
Регулярное обновлениезакрывает дыры, но проверяйте изменения
Меньше зависимостейменьше поверхность атаки и чужого кода
Проверка пакета перед добавлениемпопулярность, поддержка, репутация автора

Команды-помощники

В большинстве экосистем есть встроенный аудит зависимостей — он сверяет ваш список пакетов с базой известных уязвимостей:

# Node.js — проверить зависимости на известные уязвимости
npm audit

# Python — проверить установленные пакеты (через сторонний инструмент)
pip-audit

# Обновить пакеты в рамках совместимых версий
npm update

Такой аудит стоит запускать регулярно и встраивать в процесс сборки (CI), чтобы новые уязвимости в зависимостях замечались автоматически.

Баланс «обновлять или не трогать»

Слишком редкие обновления накапливают уязвимости. Слишком поспешные — могут сами притащить проблему (как было с захваченными пакетами). Разумный баланс: следить за уведомлениями об уязвимостях, обновлять регулярно, но осознанно, читая, что изменилось, и прогоняя тесты после обновления.

Зачем нужен SBOM

Крупные команды ведут SBOM (Software Bill of Materials) — список всех компонентов и их версий в продукте, как состав на упаковке. Когда выходит новая критичная уязвимость, по SBOM мгновенно понятно, затронуты ли вы и где именно.

Итог

  • Большая часть приложения — чужой код, и его уязвимости становятся вашими.
  • Риски: известные CVE, вредоносные и подменённые пакеты, typosquatting.
  • Фиксируйте версии, сканируйте зависимости, обновляйте регулярно и осознанно, сокращайте их число.
  • SBOM помогает быстро понять, затронуты ли вы новой уязвимостью.
Проверьте себя
1. Что такое атака на цепочку поставок (supply chain)?
AАтака на физический склад
BПеребор паролей пользователей
CКомпрометация через сторонний компонент: библиотеку, пакет или инструмент сборки
DПерехват сетевого трафика
2. Что такое typosquatting в контексте зависимостей?
AСлишком длинное имя пакета
BУстаревшая версия библиотеки
CШифрование имён пакетов
DВредоносный пакет с именем, похожим на популярное, в расчёте на опечатку
3. Зачем фиксировать версии зависимостей (lock-файл)?
AЧтобы сборка была воспроизводимой и не подтянулась неожиданная версия
BЧтобы пакеты обновлялись сами
CЧтобы ускорить установку
DЭто не нужно
4. Какой баланс разумен при обновлении зависимостей?
AНикогда не обновлять
BОбновлять регулярно и осознанно, читая изменения и прогоняя тесты
CОбновлять всё мгновенно без проверки
DОбновлять только раз в несколько лет