Специалисты по информационной безопасности обнаружили новую атаку на цепочку поставок, нацеленную на разработчиков PHP. Злоумышленники, связанные с северокорейской хакерской группой Famous Chollima, внедрили вредоносный код в легитимный пакет, опубликованный на репозитории Packagist. Эта атака в очередной раз демонстрирует, насколько изощрёнными стали методы компрометации разработчиков и их инфраструктуры.
Описание
Факты указывают на то, что атака была спланирована с прицелом на конкретных жертв. Вредоносная нагрузка не была внесена в стабильную версию пакета, что сделало бы заражение массовым. Вместо этого код оказался спрятан в одной из экспериментальных веток разработки. Такой подход характерен для так называемых атак типа "Contagious Interview", когда хакеры выдают себя за работодателей или заказчиков и просят кандидатов выполнить тестовое задание, которое на деле оказывается вредоносным.
Инцидент затронул пакет под названием roberts/leads, который является частью экосистемы Laravel. Злоумышленники скомпрометировали одну из веток репозитория на GitHub, а именно drewroberts/feature/test-case. После этого они опубликовали эту ветку на Packagist как устанавливаемую dev-версию. Примечательно, что автором пакета является реальный разработчик Дрю Робертс, и его учётная запись, вероятно, была взломана.
Файл tailwind.js, предназначенный для конфигурации фронтенд-сборщика, выглядел абсолютно нормально. Он содержал стандартные настройки, и только при внимательном просмотре с горизонтальной прокруткой можно было заметить, что после закрывающей скобки добавлен огромный блок пробелов, после которого начинается обфусцированный JavaScript-код. Исследователи сообщили, что вредоносная логика начиналась с записи global['!']='9-0264-2', которая служила маркером кампании и позднее превращалась в более длинную строку.
После деобфускации выяснилось, что скрытый код представляет собой загрузчик полезной нагрузки. Вместо того чтобы обращаться к традиционному командному серверу (C2), загрузчик использует публичную блокчейн-инфраструктуру. Это делает сетевое взаимодействие менее подозрительным для систем мониторинга. Вредоносная программа обращается к API блокчейнов TRON, Aptos и BNB Smart Chain, получает из транзакций зашифрованные данные, расшифровывает их с помощью жёстко заданных XOR-ключей и выполняет полученный код через eval().
Такая архитектура позволяет злоумышленникам менять конечную полезную нагрузку в любой момент, не изменяя сам пакет. Более того, они предусмотрели два канала получения данных. Если запрос к TRON не удаётся, срабатывает запасной вариант через Aptos. После выполнения первого этапа загрузчик порождает скрытый дочерний процесс Node.js с флагом windowsHide: true, который выполняет второй этап атаки уже в фоновом режиме.
Непосредственно в обнаруженном загрузчике не было кода для кражи данных. Но важно понимать, что это лишь входная точка. Удалённая полезная нагрузка, которая загружается в процессе выполнения, получает полный доступ к окружению Node.js. Она может считывать переменные окружения, включая секреты CI/CD и облачные учётные данные, читать локальные файлы, включая .env, SSH-ключи и токены, а также получать доступ к Git-метаданным. Ранее исследователи уже связывали аналогичную инфраструктуру с доставкой вредоносных программ DEV#POPPER RAT, OmniStealer и BeaverTail, которые активно используются северокорейскими хакерами.
Характер атаки позволяет предположить, что она была нацелена на конкретных разработчиков. Пакет не был заражён в стабильном релизе, что снижало вероятность случайного заражения. Команда composer require roberts/leads:dev-drewroberts/feature/test-case могла быть дана жертве в ходе фальшивого собеседования или выполнения тестового задания. Разработчик, следуя инструкции, клонировал бы репозиторий, переключился на указанную ветку и, скорее всего, не заметил бы вредоносного кода, скрытого за длинными пробелами.
На момент публикации исследования не было обнаружено публичных сообщений, которые бы подтверждали массовую рассылку таких заданий. Однако специалисты отмечают, что подобные инструкции, скорее всего, передаются в личных сообщениях, письмах или в чатах, что делает их обнаружение крайне сложным.
Компания, занимавшаяся анализом, оперативно сообщила об инциденте команде безопасности Packagist, которая удалила вредоносную версию пакета. Также были уведомлены администрация GitHub и сам Дрю Робертс. Тем не менее, эта атака - лишь одно из звеньев в цепочке. Разработчикам настоятельно рекомендуется перепроверять любые тестовые задания, особенно если они требуют установки пакетов из ненадёжных веток или выполнения незнакомых команд сборки.
Для компаний, использующих PHP и Node.js, важно настроить мониторинг на предмет подозрительных процессов, которые обращаются к блокчейн-нодам или выполняют код через node -e с флагами detached и windowsHide. Также стоит ограничить доступ CI-секретов к сборкам из сторонних веток и регулярно менять учётные данные после подозрительных инцидентов.
Индикаторы компрометации
Package and Repository
- Affected Packagist version: dev-drewroberts/feature/test-case
- Mapped GitHub branch: drewroberts/feature/test-case
- Affected file: tailwind.js
- Observed branch commit: 6c5c3c7655ce76399af11126b7e9a9058eb2e45d
- Package URL: https://packagist.org/packages/roberts/leads
- Repository URL: https://github.com/roberts/leads
- Affected file URL: https://github.com/roberts/leads/blob/drewroberts/feature/test-case/tailwind.js
SHA-256 Hashes
- Archive: 522b28a2f78771715497ba53729d4ab9a50e982322c391379f3bddf7c8cb363f
- tailwind.js: 96afdba882046385242cbed46871e41147c8055c5d9eff7460847b2c01a77dc3
TRON Wallets
- TMfKQEd7TJJa5xNZJZ2Lep838vrzrs7mAP
- TXfxHUet9pJVU1BgVkBAbrES4YUc1nGzcG
Aptos Fallback Identifiers
- 0xbe037400670fbf1c32364f762975908dc43eeb38759263e7dfcdabc76380811e
- 0x3f0e5781d0855fb460661ac63257376db1941b2bb522499e4757ecb3ebd5dce3
XOR Keys
- 2[gWfGj;<:-93Z^C
- m6:tTh^D)cBz?NM]