Кампания Miasma снова ударила по цепочке поставок JavaScript: злоумышленники отравили более 20 версий пакетов npm, связанных с экосистемами Leo Platform и RStreams. Для разработчиков и DevOps-команд это плохая новость не только из-за самих вредоносных npm-пакетов, но и потому, что атака умеет воровать секреты из рабочих станций и CI, а затем использовать их для дальнейшего распространения.
Атака началась поздно вечером 24 июня, когда злоумышленники скомпрометировали аккаунт npm-мейнтейнера с ником czirker, сообщает The Register со ссылкой на Microsoft Threat Intelligence. После этого через захваченный аккаунт были опубликованы зараженные обновления более чем для 20 пакетов. Microsoft отдельно подчеркнула, что операция была полностью автоматизированной и заняла менее трех секунд. Для обычной команды это звучит почти как баг в тайминге релиза, но в этом и проблема: такой темп оставляет мало шансов заметить атаку до того, как вредоносные npm-пакеты попадут в lockfile, кеш сборки или внутреннее зеркало зависимостей.
Новая версия Miasma работает не как грубый троян с лобовым выносом данных, а как вполне прагматичный supply chain-червь. После установки на машину разработчика или на CI-раннер она ищет учетные данные AWS, Azure и Google Cloud, GitHub personal access tokens, секреты Kubernetes, учетные данные HashiCorp Vault, данные 1Password и npm publishing credentials. Этим набор не ограничивается: Microsoft также указывает, что малварь вытаскивает информацию из памяти GitHub Actions runner. Украденные данные она не отправляет на классический командный сервер, а коммитит в GitHub-репозиторий, созданный через аккаунт жертвы. Подход неприятный по двум причинам. Во-первых, трафик выглядит менее подозрительно, чем соединение с неизвестным C2. Во-вторых, сама инфраструктура эксфильтрации прячется внутри легитимной экосистемы, которой разработчики и так доверяют.
На краже секретов история не заканчивается. Miasma пытается переопубликовывать пакеты, к которым у жертвы есть права сопровождения. Иными словами, если заражена машина человека, имеющего доступ к нескольким библиотекам, малварь использует этот доступ как трамплин для новых заражений. Особенно неприятно то, что она умеет обходить двухфакторную аутентификацию npm. Для индустрии это уже не просто компрометация одной учетной записи и не очередной typosquatting с левым пакетом на две недели. Речь идет о механике самораспространения, которая превращает доверенные аккаунты мейнтейнеров в средство доставки следующей волны вредоносных npm-пакетов.
Есть и техническая эволюция. По данным Sonatype, ранние варианты Miasma опирались на installation hooks в npm, но в нынешней кампании полезная нагрузка прячется в другом месте процесса установки. Это усложняет детектирование для тех защитных правил, которые были заточены под прежний паттерн. Еще одна деталь: вместо выполнения всего кода под Node.js вредонос загружает и запускает JavaScript runtime Bun. Похоже, расчет простой: часть защитных систем и поведенческих правил внимательнее смотрит именно на Node-сценарии, а Bun пока остается менее привычной точкой контроля. Для атакующих это почти идеальный компромисс между совместимостью и шансом проскочить мимо алертов.
Контекст у этой истории тоже неприятный. Кампания Miasma всплыла не вчера: ранее в июне были заражены версии npm-пакетов Red Hat. Затем на GitHub появился Mini Shai-Hulud toolkit, то есть набор инструментов, который фактически сделал подобную механику доступнее для более широкого круга злоумышленников. Когда вредоносная цепочка перестает быть эксклюзивной техникой одной группы и превращается в тиражируемый набор, рынок обычно получает не одну атаку, а серию вариаций. Именно поэтому новости про еще один зараженный пакет уже не стоит читать как частный инцидент отдельного мейнтейнера. Это уже класс атак с отработанным сценарием: компрометация аккаунта, тихая публикация обновлений, сбор секретов, попытка заразить новые пакеты, повтор.
Для русскоязычной IT-аудитории здесь есть вполне приземленный вывод. Если в компании используют Leo Platform, RStreams или любые транзитивные зависимости из npm без жесткого контроля версий и проверки происхождения релизов, инцидент касается не только open source-команды, но и бизнеса. Microsoft рекомендует организациям, которые установили затронутые версии, исходить из того, что рабочие станции разработчиков и CI-среды могли быть скомпрометированы. Sonatype советует проверять dependency lockfiles, внутренние зеркала пакетов, build cache, контейнерные образы и CI-раннеры на наличие зараженных релизов, и только потом переходить к ротации секретов. Логика тут жесткая, но верная: если сначала просто сменить ключи, есть шанс, что атакующие украдут уже их. Для команд, где один и тот же разработчик имеет доступ и к npm, и к GitHub, и к облачной инфраструктуре, цена такой спешки может оказаться заметно выше, чем один неудачный билд.
История с Miasma показывает, что атаки на npm все меньше похожи на разовые диверсии и все больше напоминают автоматизированную охоту за доверенными цепочками поставок. Если червь умеет жить в релизном процессе, красть секреты из CI и сам искать новых мейнтейнеров для заражения, то вопрос уже не в том, у кого включен 2FA, а в том, насколько быстро индустрия научится считать компрометацию зависимостей инцидентом уровня облачной инфраструктуры, а не проблемой команды, которая просто "подтянула пакет".