Специалисты по исследованию угроз компании Socket выявили опасную кампанию по компрометации цепочки поставок программного обеспечения в экосистеме PHP. Злоумышленник под псевдонимом "nhattuanbl" распространял троян удалённого доступа через несколько пакетов на платформе Packagist, популярном репозитории для менеджера зависимостей Composer. Эта атака демонстрирует изощрённую тактику, когда вредоносный код маскируется под легитимные библиотеки и внедряется через транзитивные зависимости, что значительно усложняет его обнаружение при ручном аудите.
Описание
В центре инцидента - два пакета: "nhattuanbl/lara-helper" и "nhattuanbl/simple-queue". Оба содержат идентичный вредоносный код в файле "src/helper.php". Третий пакет, "nhattuanbl/lara-swagger", сам по себе не содержит зловредных инструкций, однако в его конфигурационном файле "composer.json" жёстко прописана зависимость от "nhattuanbl/lara-helper". Это означает, что установка внешне безобидного "lara-swagger" автоматически и незаметно для разработчика втягивает в проект троянец. Такой подход, когда чистая на вид утилита служит проводником для вредоносной зависимости, является эффективным способом обхода проверок, сфокусированных только на непосредственно устанавливаемом пакете.
Исследователи обнаружили, что аккаунт злоумышленника на Packagist был создан ещё в 2015 году, однако все шесть его пакетов были опубликованы в сжатый шестимесячный период между июнем и декабрём 2024 года. Примечательно, что сначала были выпущены три чистых пакета, которые, судя по всему, должны были создать репутацию легитимного разработчика и набрать некоторое количество установок. Вредоносные "lara-helper" и "simple-queue" появились последними, уже на фоне этой искусственно созданной доверенной истории. Анализ исходного кода чистых пакетов выявил «висячие» ссылки на классы из "lara-helper", что позволяет предположить: троянец присутствовал в среде разработки злоумышленника даже во время работы над невредоносными проектами.
Структура и механизм активации скрытой угрозы
Полезная нагрузка троянца представляет собой один PHP-файл размером около 27 КБ, подвергнутый многослойной обфускации для противодействия статическому анализу. Контроль выполнения разбит на сотни бессмысленных переходов "goto" с рандомизированными метками, все строковые литералы (включая доменные имена и пути к файлам) закодированы в шестнадцатеричном или восьмеричном формате, а идентификаторы переменных и функций сгенерированы случайным образом. Подобные техники делают код практически нечитаемым при беглом просмотре.
Механизм активации варьируется в зависимости от пакета-носителя. В "lara-helper" троянец регистрируется как поставщик услуг Laravel через механизм автоматического обнаружения Composer. Его метод "register()" выполняет загрузку вредоносного файла при каждой загрузке приложения. В "simple-queue" инклюд вредоносного кода находится на уровне файла, что приводит к его выполнению в момент, когда автозагрузчик PHP впервые обращается к классу из этого пакета - для этого даже не требуется создание экземпляра класса, достаточно простой проверки "class_exists()".
После загрузки код проверяет, запущен ли он с аргументами командной строки. Если нет, он немедленно порождает фоновый процесс, который и становится основным агентом троянца, в то время как родительский процесс завершается, не оставляя явных следов в работе основного приложения. Для предотвращения запуска множественных экземпляров используется lock-файл в системной временной директории с периодом жизни 15 минут.
Функционал бэкдора и управление через C2
Основная задача троянца - установить зашифрованное соединение с командным сервером (Command and Control, C2) по адресу "helper[.]leuleu[.]net:2096". При неудаче агент бесконечно повторяет попытки подключения с интервалом в 15 секунд. Весь трафик шифруется с использованием алгоритма AES-128-CTR, однако ключ шифрования жёстко прописан в коде, что позволяет любому, кто извлёк его, расшифровать перехваченные коммуникации.
При первом успешном подключении троянец отправляет на сервер подробный профиль системы, включая тип и версию операционной системы, имя хоста, уникальный идентификатор машины, права текущего пользователя и путь к своему исполняемому файлу. После этого он переходит в режим ожидания команд, поддерживая связь с помощью автоматических ping-запросов раз в минуту. Оператор бэкдора получает в своё распоряжение обширный набор возможностей для удалённого управления скомпрометированным хостом. Он может выполнять произвольные shell- и PowerShell-команды, загружать и скачивать файлы, делать скриншоты экрана. Для выполнения команд троянец интеллектуально обходит стандартные меры защиты PHP, проверяя, какие функции ("popen", "proc_open", "exec" и другие) не заблокированы директивой "disable_functions", и используя первую доступную.
Масштаб угрозы и рекомендации по реагированию
Любое веб-приложение на Laravel, установившее пакеты "lara-helper" или "simple-queue" (в том числе транзитивно, через "lara-swagger"), содержит на диске персистентного троянца с полным доступом к оболочке операционной системы. Поскольку активация происходит в контексте веб-приложения, вредоносный код работает с теми же правами и имеет доступ ко всем переменным окружения, включая конфиденциальные данные: пароли к базам данных, API-ключи и содержимое файла ".env". На момент публикации отчёта C2-сервер не отвечает, однако это не означает безопасность. Агент продолжит попытки подключения, а оператор может в любой момент перенаправить его на новый адрес, не модифицируя сам код пакета.
Если ваши проекты использовали эти пакеты, необходимо действовать исходя из предположения о полной компрометации соответствующих хостов. В первую очередь следует повернуть все секреты, доступные из среды приложения. Затем нужно удалить вредоносные пакеты и файл "helper.php", проверить файловую систему на наличие загруженных файлов с правами "0777" и удалить lock-файл троянца. Также крайне важно провести аудит исходящего сетевого трафика на предмет подключений к указанному домену и порту. Для команд безопасности этот инцидент служит важным напоминанием. Необходимо уделять повышенное внимание транзитивным зависимостям, поскольку непосредственно устанавливаемый пакет может быть чистым, в то время как его зависимость - вредоносной. Особого контроля требуют зависимости с ограничением "dev-master", которые обходят фиксацию версий и всегда загружают последний коммит, что позволяет злоумышленнику обновлять полезную нагрузку удалённо. Пакеты, которые безусловно загружают PHP-файлы при запуске или автозагрузке, должны рассматриваться как потенциально опасные векторы доставки.
Система Socket, согласно отчёту исследовательской группы компании, идентифицирует "nhattuanbl/lara-helper" как известное вредоносное ПО, описывая его как полнофункциональный бэкдор с шифрованным каналом управления. Подобные инструменты, способные анализировать полный граф зависимостей, включая транзитивные, и блокировать подозрительные пакеты до их попадания в продуктовую среду, становятся критически важным элементом защиты современного цикла разработки программного обеспечения.
Индикаторы компрометации
Malicious Packages
- nhattuanbl/lara-helper
- nhattuanbl/simple-queue
- nhattuanbl/lara-swagger
Threat Actor Profile
- Registered name - nhattuanbl
- Registered email address - nhattuanbl@gmail.com
- Gitlab Profile - https://gitlab.com/nhattuanbl
- Github Profile - https://github.com/nhattuanbl
Network Indicators
- helper.leuleu.net:2096
Files Hashes
- src/helper.php - a493ce9509c5180e997a04cab2006a48202afbb8edfa15149a4521067191ead7