Безопасность 29 июня 2026 · 10 мин чтения 17 0

Supply chain атаки и защита: SLSA, Sigstore, SBOM

Когда современное приложение запускается в продакшене, оно несёт в себе тысячи зависимостей: внешние библиотеки, базовые образы Docker, инструменты сборки, плагины CI/CD, скрипты установки. Каждая из этих зависимостей — потенциальная точка компрометации. Атакующий, внедрившийся в популярную npm-библиотеку или базовый образ, автоматически получает доступ к тысячам проектов, использующих эту зависимость.

За последние пять лет supply chain атаки превратились из теоретической угрозы в массовую практику. Случаи вроде компрометации SolarWinds, Log4Shell, регулярных инцидентов с npm-пакетами показали: безопасность продакшена больше не сводится к защите своего кода — она охватывает всю цепочку поставки софта. Разбираем устройство современных supply chain атак, фреймворки защиты SLSA и Sigstore, концепцию SBOM и практическое внедрение в команде разработки.

Что такое software supply chain

Software supply chain — полная цепочка артефактов, кода и процессов, через которые проходит софт от написания до запуска в продакшене. Она включает: исходный код приложения и зависимостей; инструменты сборки (компиляторы, упаковщики); CI/CD-пайплайны; registry-системы (npm, PyPI, Maven Central, Docker Hub); инфраструктуру развёртывания.

На каждом из этих этапов есть возможность для атаки. Компрометированный maintainer npm-пакета может опубликовать вредоносную версию. Скомпрометированный CI/CD-сервер может встроить вредоносный код в сборку. Перехваченное соединение с registry — подсунуть подменённый артефакт. Сам исходный код может содержать backdoor от инсайдера или взломанного контрибутора.

Этап supply chain Возможные атаки
Исходный код Backdoor от инсайдера, компрометация репозитория
Зависимости Typosquatting, подмена пакета, dependency confusion
Инструменты сборки Trojanized compiler, скомпрометированные плагины
CI/CD Компрометация runner, подмена секретов
Registry Подмена артефактов, man-in-the-middle
Развёртывание Подмена образов, перехват runtime-окружения

Известные supply chain инциденты

За последние несколько лет произошло несколько крупных инцидентов, изменивших отношение индустрии к supply chain security.

SolarWinds (2020) — атакующие внедрили вредоносный код в Orion — продукт мониторинга, используемый тысячами организаций включая правительственные. Заражённое обновление распространилось через стандартный канал доставки. Десятки компаний и государственных агентств были скомпрометированы.

event-stream (2018) — популярная npm-библиотека с миллионами загрузок в неделю. Сопровождающий передал управление неизвестному волонтёру, который через несколько месяцев внедрил вредоносный код для кражи криптовалюты. Инцидент показал хрупкость доверия в open-source экосистеме.

Log4Shell (2021) — критическая уязвимость в библиотеке логирования Log4j2, используемой повсеместно в Java-экосистеме. Не атака на сам процесс поставки, но демонстрация масштаба зависимости индустрии от одной библиотеки.

colors.js / faker.js (2022) — автор популярных npm-пакетов в знак протеста выпустил версии с бесконечным циклом, ломающие приложения. Несколько тысяч пакетов, зависящих от них, начали падать в продакшене.

XZ Utils (2024) — обнаружен backdoor в популярной библиотеке сжатия данных, внедрённый через долгосрочную социальную инженерию: атакующий несколько лет был активным контрибутором, постепенно набирая доверие, и в итоге получил коммит-доступ. Backdoor мог обеспечить удалённое выполнение кода через SSH на серверах, использующих скомпрометированную версию.

Типичные техники атак

Несколько распространённых техник в современных supply chain атаках.

Typosquatting — публикация пакетов с именами, похожими на популярные библиотеки, в надежде на опечатки разработчиков. expres вместо express, requets вместо requests. Когда разработчик случайно ставит вариант с опечаткой, вредоносный код попадает в его окружение.

Dependency confusion — атака на компании, использующие внутренние пакеты с private registry. Атакующий публикует в публичный registry пакет с тем же именем и более высокой версией. При неправильной настройке CI/CD приоритет получает публичная (вредоносная) версия.

Компрометация maintainer-а. Получение доступа к учётной записи сопровождающего популярного пакета через фишинг, утечку паролей, social engineering. Дальше — публикация версии с backdoor под видом обычного обновления.

Trojanized dependencies. Создание полезного на первый взгляд пакета с вредоносным функционалом внутри. Пакет может корректно выполнять заявленную функциональность, но дополнительно красть данные, открывать обратные соединения, майнить криптовалюту.

Build pipeline compromise. Атака на CI/CD-системы для встраивания вредоносного кода в сборку без изменения исходников. Особенно опасна, потому что код в репозитории остаётся чистым, а атака происходит на этапе компиляции.

SBOM: Software Bill of Materials

Первый шаг защиты — знать, что именно входит в твой софт. SBOM (Software Bill of Materials) — формальный документ, перечисляющий все компоненты программы: библиотеки, версии, лицензии, происхождение, контрольные суммы. Аналог «состава» на упаковке продукта в супермаркете.

Без SBOM команда часто не знает точно, что использует. Транзитивные зависимости (зависимости зависимостей) могут добавлять сотни пакетов, о которых разработчик никогда не слышал. Когда выходит уязвимость в какой-то библиотеке, без SBOM невозможно быстро понять, затронут ли её продукт.

Два основных формата SBOM: SPDX (стандарт Linux Foundation) и CycloneDX (от OWASP). Оба покрывают одинаковые задачи с разными подходами к структуре. Современные инструменты сборки могут генерировать SBOM автоматически: Syft, sbom-tool от Microsoft, специализированные плагины для Maven, Gradle, npm, Cargo.

Поле SBOM Содержание
Component name Имя пакета
Version Точная версия используемой библиотеки
Supplier Кто опубликовал (организация, индивидуальный разработчик)
License Лицензия пакета (MIT, Apache, GPL, и так далее)
Hash Криптографическая сумма файлов для проверки целостности
Dependencies Зависимости этого компонента
Vulnerabilities Известные уязвимости (CVE)

SLSA: фреймворк безопасности supply chain

SLSA (Supply-chain Levels for Software Artifacts) — фреймворк от Google, описывающий требования к безопасности процесса сборки софта. Состоит из уровней зрелости, постепенно усиливающих защиту от различных атак.

SLSA Level 1 — базовый: процесс сборки документирован, артефакты имеют метаданные о том, как были созданы. Это минимальный уровень доверия — известно, что собрано, как и кем.

SLSA Level 2 — добавляется требование контролируемой среды сборки: сборка идёт в защищённом CI/CD, не на локальной машине разработчика. Метаданные сборки криптографически подписаны.

SLSA Level 3 — требуется изоляция сборок друг от друга, защита от компрометации одной сборки через другую. Источник кода (репозиторий) и среда сборки управляются как security-критические системы.

SLSA Level 4 — высший уровень: два-человеческое ревью изменений в коде и в инфраструктуре сборки, формальная верификация процесса. Подходит для критически важного софта (финансовый сектор, государственные системы).

SLSA — не сертификация, а roadmap зрелости. Команды постепенно повышают уровень: сначала добиться SLSA 1 (документация), потом 2 (контролируемая сборка), потом 3 (изоляция). SLSA 4 — для немногих критически важных проектов.

Sigstore: подписи и прозрачность

Sigstore — open-source проект для cryptographically signing и verification артефактов разработки. Основная идея: каждый артефакт (Docker-образ, npm-пакет, бинарник) подписан, и любой может проверить подпись через публичный transparency log.

Sigstore состоит из нескольких компонентов: Cosign (инструмент подписания и проверки), Fulcio (certificate authority), Rekor (transparency log). Особенность подхода — keyless signing: разработчик подписывает артефакт через свою OIDC-идентичность (Google, GitHub, Microsoft), без необходимости управлять долгоживущими ключами.

Keyless signing решает проблему ключевого менеджмента — главную сложность классических PKI-систем. Не нужно безопасно хранить приватный ключ годами; не нужно обращаться с ним при каждой сборке; не нужно отзывать ключи при увольнении инженера. Подпись привязана к моменту и идентичности, а не к ключу.

Transparency log Rekor — публичная append-only база подписей. Любой может проверить, что артефакт был подписан в определённое время определённой identity. Это создаёт audit trail: если оказывается, что вредоносный артефакт был подписан, можно точно определить, чья identity использовалась.

Provenance: откуда пришёл артефакт

Provenance — формальный документ о происхождении артефакта: каким процессом он создан, из каких исходников, в какой среде, какими действиями. SLSA включает provenance как ключевой элемент: метаданные сборки, описывающие весь путь от исходного кода до финального бинарника.

В provenance-документе фиксируется: коммит исходного кода, версия билд-инструмента, переменные окружения, использованные зависимости, результирующие артефакты с хешами. Этот документ криптографически подписывается и идёт вместе с самим артефактом.

При развёртывании provenance проверяется: подпись действительна, происхождение совпадает с ожидаемым (правильный репозиторий, правильная ветка, правильный CI/CD), все зависимости из доверенных источников. Только при успешной проверке артефакт допускается в продакшен.

Vulnerability scanning и SCA

SCA (Software Composition Analysis) — анализ компонентов программы на наличие известных уязвимостей. Инструменты SCA берут SBOM проекта, сверяют с базами уязвимостей (NVD, OSV, GitHub Advisory Database), и сигнализируют о найденных проблемах.

Популярные SCA-инструменты: Dependabot (встроен в GitHub), Snyk, JFrog Xray, Trivy, Grype. Большинство интегрируются с CI/CD, проверяя каждый PR на новые уязвимости и блокируя слияние при критических находках.

Важно различать наличие уязвимой версии и реальную эксплуатируемость. Уязвимая функция в библиотеке может не использоваться в данном проекте, тогда уязвимость теоретическая. EPSS (Exploit Prediction Scoring System) и Reachability Analysis помогают приоритизировать уязвимости — какие из них реально нужно срочно фиксить, какие можно отложить.

Container image signing

Docker-образы — критическая часть современной supply chain. Подмена образа в registry или подделка образа в момент развёртывания может скомпрометировать всю систему. Подписание образов — стандартная практика для production-окружений.

Cosign sign image <registry>/<repo>:<tag> — типичная команда подписания. Verify-команда на стороне Kubernetes-кластера или admission controller проверяет подпись перед запуском контейнера. Образы без валидной подписи не допускаются.

В Kubernetes интеграция выполняется через admission controllers вроде Connaisseur, Cosigned, Kyverno. Они перехватывают запросы на создание подов и проверяют подписи образов через Sigstore. Если подпись недействительна или отсутствует, под не создаётся.

Защита CI/CD pipelines

CI/CD — критическая точка supply chain. Компрометация runner-а позволяет атакующему модифицировать любой код, проходящий через пайплайн. Несколько практик защиты CI/CD.

  • Эфемерные runners: каждая сборка идёт в чистой среде, после завершения уничтожается. Атакующий не может оставить backdoor для использования в следующей сборке.
  • Минимальные права: каждый job имеет только те доступы, которые реально нужны. Деплой-job не должен иметь доступа к исходникам других проектов.
  • Защищённые секреты: production-секреты не доступны на этапе сборки, только при развёртывании. Используются специализированные решения вроде HashiCorp Vault.
  • Pinned actions / dependencies: CI/CD-зависимости (GitHub Actions, плагины Jenkins) фиксируются по точным версиям с хешами, не по тегам, которые могут быть перезаписаны.
  • Reproducible builds: возможность пересобрать тот же артефакт независимо и убедиться в идентичности.

Внутренние registry и proxy

Корпоративная практика — использование внутренних registry для зависимостей. Все npm, Maven, PyPI, Docker-зависимости качаются через корпоративный proxy: JFrog Artifactory, Nexus, GitHub Packages, Sonatype Nexus.

Преимущества подхода: контроль над тем, какие версии используются (можно блокировать уязвимые); кэширование (защита от исчезновения внешних пакетов); скорость (внутренняя сеть быстрее, чем внешние registry); audit (известно, кто и когда использовал какие зависимости).

Внутренний registry дополнительно может проводить автоматическое сканирование загружаемых пакетов: проверка хэшей, scan уязвимостей, проверка лицензий. Зависимость с найденной проблемой блокируется до ручного review.

Часто задаваемые вопросы

Откуда начинать улучшение supply chain security?

С генерации и хранения SBOM для каждого продакшен-артефакта. Без понимания, что именно используется, остальные меры малоэффективны. После SBOM — внедрение SCA-инструмента в CI/CD для автоматической проверки уязвимостей. Далее — подписание артефактов и проверка подписи при развёртывании.

Стоит ли всем переходить на keyless signing через Sigstore?

Для большинства команд — да. Keyless signing значительно проще классических PKI-систем и достаточно для целей supply chain security. Исключения — компании со строгими compliance-требованиями, где может требоваться сертифицированное PKI с долгосрочными ключами (например, finance, government).

Что делать с уязвимостью в зависимости, для которой нет патча?

Несколько стратегий. Использовать форк с исправлением (если кто-то уже исправил). Сделать собственный патч и форкнуть библиотеку. Заменить уязвимую библиотеку на альтернативу. Изолировать уязвимую функциональность (если она используется ограниченно) через дополнительные защитные меры. Самое плохое — игнорировать, надеясь, что не атакуют.

Достаточно ли использовать только Dependabot?

Dependabot хорошо ловит уязвимости в зависимостях, но это лишь часть supply chain security. Не покрывает: подмену артефактов, компрометацию CI/CD, dependency confusion, проблемы в исходном коде. Полная защита требует комплексного подхода: SBOM, SCA, signing, secure CI/CD, audit-процессы.

Что такое pinning и зачем оно нужно?

Pinning — фиксация зависимостей на конкретных версиях или хешах вместо использования диапазонов вроде ^1.2.0. Защищает от автоматического обновления на скомпрометированную версию. Минус — нужно сознательно обновлять зависимости, нет автоматического получения security patches. Подход — pinning + автоматизированный процесс контролируемого обновления через PR с ревью.

Как обеспечить SLSA-compliance в существующем проекте?

Поэтапно. Начать с SLSA 1: документировать процесс сборки, сохранять метаданные. Перейти на SLSA 2: вынести сборки в защищённый CI/CD, добавить подписание. SLSA 3 требует серьёзных инвестиций в инфраструктуру: изоляция, security-критическое управление репозиториями и CI/CD. SLSA 4 — обычно проекты с особо высокими требованиями.

Заключение

Supply chain security перестал быть нишевой темой для специалистов по информационной безопасности. За последние пять лет это стало мейнстрим-практикой для любой команды разработки, серьёзно относящейся к безопасности своих продуктов. Регуляторы (включая исполнительные приказы в США и директивы в ЕС) делают supply chain security обязательным элементом, а не опциональным улучшением.

Технологический стек защиты сформировался за последние годы. SBOM как фундамент знания о составе софта. SLSA как roadmap зрелости процессов. Sigstore как инструмент подписания и верификации. SCA-инструменты для непрерывного отслеживания уязвимостей. Защищённые CI/CD-процессы как основа доверия к artifact pipeline. Каждый из этих компонентов решает свою задачу; вместе они образуют интегрированную систему защиты.

Команды, серьёзно инвестирующие в supply chain security, получают не только лучшую защиту от атак, но и операционные преимущества: ясное понимание зависимостей, возможность быстро отреагировать на новые уязвимости, доверие со стороны клиентов и партнёров. В мире, где громкие инциденты типа SolarWinds и XZ становятся регулярными, supply chain security превращается из «приятного дополнения» в обязательную часть профессионального инженерного процесса.