Атака на цепочку поставок ПО — это компрометация не вашей системы, а того, что вы в неё устанавливаете: открытых библиотек, сборочных скриптов, учётных записей разработчиков. Защита строится на трёх принципах: знать состав своих приложений (SBOM), не пускать подозрительные пакеты в сборку (политики и карантин на уровне репозитория) и беречь секреты разработчиков и CI/CD.
Что такое атака на цепочку поставок
Современное приложение на большую часть состоит из чужого кода. Разработчик добавляет одну зависимость и вместе с ней получает десятки транзитивных. Каждая из них — потенциальная точка входа: если злоумышленник заменит пакет или внедрит в него код, вредоносная часть попадёт к вам автоматически, при обычной установке зависимостей.
Основные сценарии:
- Вредоносный пакет с нуля. Атакующий публикует пакет с привлекательным названием, и его кто-то устанавливает.
- Тайпсквоттинг и подмена имён. Пакет называется почти как популярный, расчёт на опечатку или невнимательность. Родственный приём — подмена пространства имён (namespace confusion).
- Захват аккаунта мейнтейнера. Настоящий популярный пакет получает вредоносную версию от имени законного автора.
- Внедрение через доверие. Атакующий годами участвует в проекте, получает права мейнтейнера и добавляет закладку.
- Зависимость-червь. Вредонос крадёт токены разработчика и сам публикует заражённые версии других пакетов.
Масштаб проблемы
Согласно отчёту Sonatype «2026 State of the Software Supply Chain», в 2025 году было зафиксировано 454 648 новых вредоносных пакетов. За тот же год разработчики скачали компоненты 9,8 триллиона раз из Maven Central, PyPI, npm и NuGet. Sonatype отмечает, что угрозы сместились от спама к «устойчивым, индустриализированным кампаниям», среди которых есть и поддерживаемые государствами. Вредоносные пакеты часто служат первым шагом многоступенчатой атаки: кража секретов, загрузчики, бэкдоры.
Отчёт также фиксирует приёмы маскировки: тайпсквоттинг, путаница пространств имён, имитация инструментов сборки, а также размещение вредоносной нагрузки в моделях ИИ, образах контейнеров и вспомогательных бинарных файлах. Отдельный риск — ИИ-ассистенты: они могут предлагать установку пакетов, не проверяя их происхождение.
Реальные инциденты
ua-parser-js (октябрь 2021): захват аккаунта
22 октября 2021 года злоумышленники получили доступ к учётной записи разработчика популярной npm-библиотеки ua-parser-js, которая определяет браузер и ОС по строке user-agent, и опубликовали три вредоносные версии: 0.7.29, 0.8.0 и 1.0.0. По данным CERT-EU, скрипт preinstall проверял операционную систему. На Linux скачивался майнер XMRig, на Windows — майнер и DLL для кражи паролей из FTP-клиентов, почты, мессенджеров и браузеров. Любопытная деталь: на Linux вредонос не запускался в России, Украине, Белоруссии и Казахстане. Исправленные версии — 0.7.30, 0.8.1 и 1.0.1.
Урок: вредоносный код выполнился на этапе установки, ещё до запуска приложения, а пакет был легитимным и популярным.
XZ Utils (март 2024): закладка через доверие
В марте 2024 года разработчик Андрес Фройнд обнаружил бэкдор в библиотеке сжатия xz/liblzma, анализируя замедление SSH-подключений в тестовой версии Debian. Уязвимость получила идентификатор CVE-2024-3094 и максимальную оценку CVSS 10.0; затронуты версии 5.6.0 и 5.6.1. Публичное раскрытие — 29 марта 2024 года.
Особенность этого случая — долгая подготовка. По описанию в Wikipedia, пользователь под именем «Jia Tan» с 2021 года вёл кампанию более двух лет, а подставные аккаунты давили на исходного мейнтейнера, пока тот не выдал права. Вредоносная часть содержалась в архивах релизов, но не в самом репозитории Git, поэтому просмотр исходников на GitHub её не показывал. Кампанию заметили случайно.
Урок: код ревью и сканирование репозитория недостаточны; нужно проверять и то, что реально попадает в сборку, и сверять артефакты релиза с исходниками.
Shai-Hulud (сентябрь 2025): червь в npm
23 сентября 2025 года американское агентство CISA выпустило оповещение о масштабной компрометации экосистемы npm. Самовоспроизводящийся червь Shai-Hulud заразил более 500 пакетов. Попав в окружение разработчика, он искал учётные данные, в том числе токены GitHub и ключи API AWS, Google Cloud и Azure, отправлял их на сервер злоумышленников и выкладывал в публичный репозиторий. Затем червь аутентифицировался в npm от имени разработчика и публиковал заражённые версии других его пакетов. Так он распространялся дальше.
Рекомендации CISA: проверить файлы блокировки (package-lock.json, yarn.lock) на затронутые пакеты, в том числе вложенные; найти кешированные копии в репозиториях артефактов; закрепить версии, выпущенные до 16 сентября 2025 года; сменить все учётные данные разработчиков; включить MFA, устойчивую к фишингу, для GitHub и npm; ограничить исходящие соединения.
Урок: утёкший токен разработчика превращается в канал распространения. Здесь секреты и цепочка поставок — одна и та же проблема (см. управление секретами).
Почему это касается компаний в Центральной Азии
Банки и финансовые компании региона разрабатывают приложения на тех же npm, PyPI, Maven и NuGet, что и весь мир. Региональная география сама по себе не защищает: в описании CERT-EU по ua-parser-js Казахстан упомянут среди стран, где Linux-вариант майнера не запускался, а для Windows-ветки с кражей паролей такого исключения не указано. К тому же разработчики часто работают из закрытых контуров с прокси-доступом в интернет, где один неконтролируемый канал прямой установки пакетов обнуляет защиту.
Как защититься: практические меры
1. Знайте, что у вас есть
Без инвентаря нельзя быстро ответить на вопрос «затронуты ли мы?». Формируйте SBOM при каждой сборке и храните его вместе с релизом. Подробности — в статье «Что такое SBOM». SCA-инструменты вроде Sonatype Lifecycle находят уязвимые и вредоносные компоненты и показывают, в каких приложениях они используются.
2. Ставьте шлюз между интернетом и сборкой
Все зависимости должны идти через внутренний менеджер артефактов, а прямой доступ сборочных агентов к npmjs.com и PyPI нужно закрыть. Это даёт точку контроля. Sonatype Repository Firewall блокирует вредоносные и уязвимые пакеты в момент скачивания, помещает подозрительные компоненты в карантин и автоматически освобождает те, что признаны безопасными. Политики можно строить по возрасту пакета, уровню риска и лицензии. Продукт спроектирован для Nexus Repository, а для других репозиториев-менеджеров у Sonatype есть Firewall Pro. Подробнее о выборе — Nexus Repository vs Artifactory.
3. Закрепляйте версии и проверяйте обновления
- Используйте lock-файлы и фиксируйте версии, а не диапазоны.
- Вводите «карантин новизны»: не принимайте в сборку версию, опубликованную совсем недавно, пока она не проверена. Многие атаки обнаруживаются в первые часы или дни.
- Следите за подозрительными изменениями в скриптах установки (preinstall, postinstall).
4. Защитите учётные записи и секреты
- Включите MFA, устойчивую к фишингу, на GitHub, npm и PyPI.
- Не храните токены в открытом виде в переменных окружения разработчиков и в репозиториях. Используйте хранилище секретов и короткоживущие учётные данные.
- Подготовьте процедуру массовой ротации: после инцидента вроде Shai-Hulud менять придётся всё.
5. Проверяйте собственный код и сборку
Закладка может попасть и через вашего подрядчика, и через внутренний пакет. SAST и бинарный анализ помогают найти недекларированные возможности в собственном коде и в сторонних сборках. О классах инструментов — в статье SAST, DAST, SCA и MAST.
6. Подготовьте реагирование
Заранее определите: кто принимает решение о блокировке пакета, как быстро вы можете найти все приложения с компонентом, как заменить заражённую версию и как проверить, что вредонос не выполнялся на сборочных серверах и машинах разработчиков.
С чего начать
- Закройте прямой доступ сборки к внешним реестрам и направьте её через менеджер артефактов.
- Включите сканирование состава и формирование SBOM для критичных приложений.
- Настройте политики блокировки вредоносных пакетов и карантина новых версий.
- Проведите ревизию токенов и включите MFA для разработчиков.
- Отрепетируйте сценарий «найден вредоносный пакет».
Частые вопросы
Чем вредоносный пакет отличается от уязвимого?
Достаточно ли просто сканировать зависимости в CI?
Что делать, если мы установили заражённый пакет?
Помогает ли SBOM предотвратить атаку?
Хотите проверить, что попадает в ваши сборки, и закрыть вход вредоносным пакетам? AST Cyber Lab как дистрибьютор Sonatype в Казахстане и Центральной Азии проведёт пилот Repository Firewall и Lifecycle на ваших проектах.
Источники
- Infosecurity Magazine: обзор отчёта Sonatype 2026 State of the Software Supply Chain
- CERT-EU: Security Advisory 2021-057 (ua-parser-js)
- Wikipedia: XZ Utils backdoor
- CISA: Widespread Supply Chain Compromise Impacting npm Ecosystem
- Sonatype: Repository Firewall