Shai-Hulud бьет по доверию к мейнтейнерам

Sonatype описывает новую волну npm-компрометаций: атаковали не имена пакетов, а доверенный доступ мейнтейнеров.

2026-05-24 GIGATAP Team #tools
#npm#software supply chain#CI/CD security

Что, по данным Sonatype, произошло#

Sonatype сообщает о новой волне npm-компрометаций, связанных с Shai-Hulud. Под удар попала экосистема визуализации Ant Design, включая пакеты, связанные с AntV. Главная мысль простая: атакующим не понадобились поддельные имена пакетов или typo-squatting. Они использовали доверенный доступ мейнтейнеров и протолкнули вредоносный код через пакеты, которым разработчики уже привыкли доверять.

По данным Sonatype, скомпрометированные пакеты использовали хуки, срабатывающие при установке. Это важно: код может выполниться во время обычной установки пакета, еще до запуска самого приложения и до того, как разработчик заметит что-то странное. Описанный payload пытался украсть переменные окружения и секреты разработчиков, вывести наружу CI/CD-учетные данные и создать возможность удаленного выполнения команд, то есть RCE.

Sonatype описывает кампанию как цепочку распространения по supply chain, а не как один отдельный вредоносный пакет. Скомпрометировать аккаунт мейнтейнера. Опубликовать вредоносную версию доверенного пакета. Украсть новые учетные данные с машин разработчиков и из CI/CD-систем. Использовать эти данные, чтобы добраться до других пакетов или инфраструктуры. Повторить.

Именно этот цикл усложняет локализацию инцидента. Удалить вредоносный пакет — не то же самое, что нейтрализовать компрометацию. Если пакет хотя бы один раз успешно установили на машине разработчика или build runner, секреты уже могли утечь.

В публикации Sonatype также описан кросс-платформенный путь атаки с участием скомпрометированных npm-пакетов @antv и инфраструктуры, размещенной на GitHub. Сообщается, что вредоносные установки загружали дополнительные payload из мест, размещенных на GitHub, крали учетные данные разработчиков и пытались закрепиться на зараженных системах. Ключевой вывод не в том, что «сломался npm». Путь атаки может проходить через менеджеры пакетов, контроль исходного кода, CI/CD и инструменты разработчика, потому что современная доставка ПО связывает все эти элементы.

Почему доверенные пакеты стали мягкой целью#

Традиционная оценка риска пакетов часто начинается с имени. Это typo-squat? Пакет новый и неизвестный? Мейнтейнер выглядит подозрительно? Такие проверки все еще нужны, но эту проблему они не решают.

Здесь опасность шла от легитимных аккаунтов и легитимных имен пакетов. Пакет выглядел безопасным, потому что вчера он был безопасным. Обновление выглядело правдоподобно, потому что пришло через ожидаемый путь публикации. Именно такое унаследованное доверие и нужно атакующим.

Большинство команд внимательно проверяют зависимости при первом добавлении. Гораздо меньше команд с той же тщательностью смотрят каждое обновление. Такой разрыв был терпимее, когда главной проблемой считались известные уязвимости в старом коде. Он гораздо слабее против активных кампаний, где атакующие захватывают доверенных издателей и в реальном времени выпускают вредоносные версии.

Выполнение кода при установке делает ситуацию острее. В npm lifecycle scripts могут запускаться как часть установки пакета. Это бывает полезно для легитимной сборки или настройки. Но для атакующих это ранняя точка выполнения внутри сред разработки и CI runners. Обнаружение постфактум может лишь подтвердить, что код уже успел выполниться.

Sonatype цитирует Ilkka Turunen, Field CTO компании, который формулирует это прямо: вредоносный код может выполниться в момент установки пакета, поэтому подозрительные пакеты нужно помещать в карантин до того, как они попадут на машины разработчиков, build systems или CI pipelines.

Практический урок: происхождение пакета необходимо проверять, но этого недостаточно. То, что пакет пришел от «настоящего» аккаунта, еще не доказывает безопасность релиза. Личность мейнтейнера, publishing tokens, CI-учетные данные и автоматизация релизов теперь входят в поверхность атаки.

Главная цель — секреты CI/CD#

Исходный материал ясно указывает на вероятную цель: учетные данные. Современные supply-chain-атаки на npm часто больше похожи не на классические кампании вредоносов, а на операции по краже идентичности, где пакеты служат каналом доставки.

Атакующим нужны переменные окружения, npm-токены, GitHub-токены, cloud-ключи, ключи подписи, deployment secrets и другие данные, которые находятся рядом с процессом сборки. CI/CD-системы особенно ценны, потому что часто имеют права, которых нет у runtime-систем приложения. Они могут публиковать пакеты, разворачивать сервисы, читать приватные репозитории или обращаться к инфраструктуре рядом с production.

Так быстро растет blast radius. Скомпрометированный ноутбук разработчика может раскрыть токен. Украденный токен может привести к компрометации CI workflow. Скомпрометированный workflow может опубликовать вредоносный пакет. Вредоносный пакет может попасть к downstream-разработчикам и build systems. На каждом шаге обычная автоматизация превращается в механизм распространения.

Поэтому даже недолговечные вредоносные версии могут быть серьезной проблемой. Если атакующий опубликовал вредоносный пакет и его быстро удалили, публичный артефакт может исчезнуть. Но любая успешная установка в этом окне могла привести к утечке секретов. Эти секреты можно использовать позже, уже за пределами исходного инцидента с пакетом.

Для защитников важна временная шкала. Вопрос не только в том, удален ли вредоносный пакет. Вопрос еще и в том, устанавливала ли его какая-либо машина и какие учетные данные были доступны этому процессу в тот момент.

Где важно не преувеличивать#

Источник не доказывает все возможные downstream-последствия. В нем сказано, что кампания потенциально подвергла downstream-разработчиков риску кражи учетных данных и RCE через доверенные пакеты. Это важное различие.

Компрометация пакета не означает автоматически, что каждый потребитель был успешно атакован. Попытка вредоносного payload украсть учетные данные не доказывает, что все данные действительно украдены. Загрузка payload из места, размещенного на GitHub, не означает компрометацию самого GitHub. Риск в том, что доверенные процессы разработки дали вредоносному коду путь в среды, где часто лежат ценные секреты.

Самая безопасная трактовка такая: организациям, которые использовали затронутые пакеты в релевантное окно, стоит считать установку возможным событием раскрытия учетных данных, пока они не докажут обратное.

Что командам проверить сейчас#

Если организация использует npm-пакеты, особенно пакеты внутри или рядом с затронутой экосистемой AntV, реакция должна фокусироваться на следах установки и возможной утечке учетных данных, а не только на очистке зависимостей.

Практические проверки:

  • Проверьте package-lock, npm-логи, CI-логи и кэши артефактов на наличие имен и версий затронутых пакетов, упомянутых Sonatype или другими advisory по инциденту.
  • Определите машины разработчиков и CI runners, где эти пакеты устанавливались в предполагаемое окно компрометации.
  • Ротируйте учетные данные, доступные этим средам: npm-токены, GitHub-токены, cloud-ключи, deployment credentials и материалы для подписи.
  • Проверьте CI/CD workflows на неожиданные изменения, новый доступ к секретам, измененные шаги публикации или необычную исходящую сетевую активность во время установки.
  • Проверьте, выполнялись ли install scripts в build-средах с широкими правами.
  • Пересмотрите доступ npm publisher и по возможности потребуйте более сильную защиту аккаунтов мейнтейнеров.
  • Ограничьте долгоживущие токены в CI/CD. Где платформа позволяет, используйте scoped и короткоживущие учетные данные.
  • Рассмотрите меры, которые помещают подозрительное поведение пакетов в карантин или блокируют его до установки, а не только сканеры, которые предупреждают уже после загрузки.

Командам также стоит пересмотреть подход к одобрению зависимостей. Одобрения при первом добавлении недостаточно, если доверенных мейнтейнеров могут скомпрометировать позже. Постоянный контроль обновлений, происхождения релизов, доступа мейнтейнеров и поведения при установке теперь часть безопасности зависимостей.

Полезный вывод#

Шаблон Shai-Hulud работает потому, что атакует слой доверия в доставке ПО. Менеджер пакетов — лишь одна поверхность. Аккаунты мейнтейнеров, publishing tokens, CI/CD runners, GitHub workflows и ноутбуки разработчиков находятся на одном пути.

Для обычных инженерных команд это реальный риск. Не нужно устанавливать странный пакет, чтобы оказаться под ударом. Рутинное обновление доверенной зависимости может стать путем выполнения кода.

Защитная модель должна соответствовать этой реальности. Относитесь к мейнтейнерам и build-учетным данным как к production-активам. Снижайте объем того, к чему могут прикасаться install scripts. Держите CI-права узкими. Быстро ротируйте секреты, когда раскрытие правдоподобно. И не считайте удаление пакета закрытием инцидента.