Урок по треку Безопасность приложений 8 мин

Зависимости и безопасность цепочки поставок

Уязвимые и вредоносные пакеты, lock-файлы, SBOM, подпись артефактов, SLSA и безопасность CI.

Большая часть кода в приложении написана не вами: библиотеки, базовые образы, действия CI, плагины. Атаки на цепочку поставок (supply chain) бьют именно туда: одна заражённая библиотека попадает в тысячи компаний сразу. В OWASP Top 10 версии 2025 года это отдельная категория.

Два вида риска

Уязвимые зависимости: библиотека с известной ошибкой. Пример: Log4Shell (CVE-2021-44228) в Log4j, удалённое выполнение кода через строку в логе. Решение: знать, что у вас стоит, и быстро обновлять.

Вредоносные зависимости: код написан, чтобы навредить:

  • Typosquatting: пакет с похожим именем (reqeusts вместо requests).
  • Dependency confusion: внутренний пакет acme-utils тянется из публичного реестра, где атакующий опубликовал пакет с тем же именем и большей версией.
  • Захват аккаунта мейнтейнера и публикация заражённой версии популярного пакета (как с event-stream в 2018 и рядом npm-пакетов в последующие годы).
  • Долгая игра: в 2024 году в xz-utils (CVE-2024-3094) обнаружили бэкдор, который участник проекта внедрял годами, завоёвывая доверие. Его заметили случайно по задержке SSH.
  • Скрипты установки: postinstall в npm выполняется при npm install с правами разработчика или CI.

Базовая гигиена

  • Lock-файлы (package-lock.json, poetry.lock, go.sum) в репозитории, установка строго по ним: npm ci, pip install --require-hashes.
  • Не тянуть «последнюю» версию в сборке (*, latest, диапазоны без lock).
  • Обновления маленькими порциями и регулярно: Dependabot или Renovate, автотесты. Тогда срочный патч это рутина, а не прыжок через три мажорные версии.
  • Меньше зависимостей: каждая библиотека расширяет поверхность атаки. Пакет на 10 строк проще написать самому.
  • Настроить реестры: внутренние пакеты только из внутреннего реестра (scope в npm, отдельный индекс без fallback в pip), прокси-реестр с кешем и политиками.
  • Отключать скрипты установки там, где они не нужны (npm ci --ignore-scripts) и запускать сборку без лишних прав и секретов.

SCA и приоритизация

SCA (Software Composition Analysis) строит список зависимостей, включая транзитивные, и сверяет его с базами уязвимостей (OSV, GitHub Advisory, NVD, БДУ ФСТЭК для российских требований). Инструменты: Dependabot, npm audit, pip-audit, govulncheck, Trivy, OWASP Dependency-Check, Snyk.

Находок всегда много, поэтому приоритизация:

  • Достижимость: вызывается ли уязвимая функция в вашем коде (так работает, например, govulncheck).
  • Эксплуатируемость: есть ли в каталоге реально эксплуатируемых (CISA KEV), вероятность по EPSS.
  • Экспозиция: внешний сервис или внутренний скрипт.
  • CVSS как отправная точка, а не приговор.

SBOM, подпись и SLSA

  • SBOM (Software Bill of Materials): машиночитаемый перечень компонентов сборки в форматах CycloneDX или SPDX. Когда выходит новая CVE, по SBOM за минуты видно, где затронуто.
  • Подпись артефактов: образы и пакеты подписываются (Sigstore cosign), а при деплое подпись проверяется политикой. Так в прод не попадёт образ, собранный не вашим CI.
  • SLSA (Supply-chain Levels for Software Artifacts): уровни требований к сборке: скриптовая сборка, provenance (подписанное описание, как и из чего собран артефакт), изолированная и защищённая платформа сборки.
  • Воспроизводимые сборки позволяют проверить, что бинарник собран из заявленного исходника.

Безопасность CI/CD

CI это ключи от прода, поэтому он главная цель:

  • Сторонние действия и образы закреплять по полному SHA, а не по тегу: тег можно перевесить.
  • Минимальные права токена CI (permissions: в GitHub Actions).
  • Не запускать код из форков с доступом к секретам.
  • Защищённые ветки, обязательное ревью, деплой только из CI.
  • OIDC-федерация вместо статических ключей.

Частые ошибки

  • npm install в CI вместо npm ci.
  • Внутренний пакет без scope, доступный по имени из публичного реестра.
  • Игнорировать сотни находок SCA, потому что «их слишком много».
  • curl https://... | bash в Dockerfile и CI.

Что спросят на собесе

  • Что такое dependency confusion и как защититься.
  • Как вы организуете работу с уязвимыми зависимостями: сотни находок, мало людей.
  • Зачем нужен SBOM.
  • Чем опасен pull_request_target и почему actions закрепляют по SHA.
  • Что такое SLSA и provenance.
  • Чему научил случай с xz-utils.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.