Злоумышленник опубликовал вредоносные версии двух npm-пакетов
Злоумышленник перехватил учётную запись npm, связанную с пакетами react-native-international-phone-number и react-native-country-select, которые загружают примерно 92 000 и 42 000 раз в месяц соответственно. За три дня в ходе трёх волн атаки он опубликовал 11 скомпрометированных версий. На момент подготовки отчёта установка любого из пакетов могла привести к запуску ВПО, но пакеты не были помечены как устаревшие.
По имеющимся данным, владелец учётной записи потерял к ней доступ после того, как злоумышленник изменил зарегистрированный адрес электронной почты. Первые вредоносные версии, react-native-international-phone-number@0.11.8 и react-native-country-select@0.3.91, использовали хук preinstall для автоматического запуска обфусцированной полезной нагрузки из файла install.js во время установки.
В более поздних версиях явный вредоносный код удалили из родительских пакетов и добавили цепочку транзитных зависимостей. В итоге ВПО размещалось на глубине двух уровней зависимостей, в том числе в пакете s-format@2.0.2 и связанных вредоносных пакетах со скоупом. Некоторые версии использовали неэффективные или отсутствующие хуки установки. В более поздних версиях активировалась цепочка зависимостей. Из-за этого пакеты могли выглядеть безвредными для сканеров, которые не разрешали и не проверяли транзитные зависимости.
ВПО приписывают злоумышленнику GlassWorm на основании общей инфраструктуры, методов обфускации и техник управления. Программа откладывает выполнение на 10 секунд и с помощью 12 встроенных проверок избегает систем с русской локалью или часовыми поясами. Она отмечает факт запуска, создавая файл ~/init.json, и не запускается повторно на том же компьютере в течение 48 часов.
ВПО использует Solana как децентрализованный канал управления. Оно запрашивает данные о заранее заданном кошельке 6YGcuyFRJKZtcaYCCFba9fScNUvPkGXodXE1mJiSzqDJ у нескольких легитимных провайдеров RPC Solana с помощью метода getSignaturesForAddress. В заметках к транзакциям находятся закодированные в base64 URL для загрузки полезной нагрузки.
Полезная нагрузка второго этапа загружается с IP-адреса 45.32.150.251. ВПО отправляет тип операционной системы в заголовке HTTP, расшифровывает ответ с помощью AES-256, получая ключ и значение IV из заголовков ответа, и выполняет его в памяти через eval() или vm.Script. Полезная нагрузка во всех образцах побайтово идентична. Её SHA-256: 59221aa9623d86c930357dba7e3f54138c7ccbd0daa9c483d766cd8ce1b6ad26.
Отчет получен из сервиса CTT Report Hub. Права на отчет принадлежат его владельцу.
Ознакомиться подробнее с отчетом можно по ссылке.



