Большая часть кода в приложении написана не вами: библиотеки, базовые образы, действия 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.