Зависимости и 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Обновлять только раз в несколько лет
Поддержать проект