OceanLotus атакует через PyPI: новый зловред ZiChatBot использует чат-сервис Zulip для управления жертвами

information security

В середине июля 2025 года, в ходе ежедневного мониторинга угроз, специалисты по информационной безопасности зафиксировали необычную активность в репозитории PyPI - центральном хранилище пакетов для языка Python. Злоумышленники, предположительно связанные с группировкой OceanLotus, начали масштабную атаку на цепочку поставок программного обеспечения. Их целью были разработчики и системные администраторы по всему миру, которые используют открытые библиотеки Python. Суть атаки заключалась в публикации вредоносных колесных пакетов, маскирующихся под популярные и безобидные утилиты.

Описание

Вредоносные пакеты были разработаны таким образом, чтобы имитировать функциональность легитимных библиотек. Пользователи, устанавливающие их через команду pip, получали именно те возможности, которые были заявлены в описании на странице PyPI. Однако истинное предназначение этих пакетов было скрыто. Они действовали как дропперы - программы, которые незаметно загружают и устанавливают на устройство жертвы основное вредоносное ПО. Таким скрытым зловредом стала ранее неизвестная программа, которой эксперты присвоили имя ZiChatBot.

Уникальность атаки заключалась не только в методе распространения, но и в архитектуре самого зловреда. Вместо традиционного сервера управления и связи, который обычно размещают на арендованных или скомпрометированных серверах, ZiChatBot использует публичное облачное решение - чат-приложение Zulip. Эта программа использует серию REST-интерфейсов приложения Zulip для получения команд и отправки отчетов о состоянии системы. Такой подход делает инфраструктуру атаки практически невидимой для стандартных средств обнаружения, которые ищут подозрительные IP-адреса или домены.

В ходе расследования эксперты установили, что атакующие создали три проекта на PyPI. Два из них - uuid32-utils и colorinal - содержали вредоносный код напрямую. Третий пакет, termncolor, был уловкой для сокрытия. Он выглядел абсолютно безобидным, но в качестве обязательной зависимости подключал пакет colorinal. Такая техника глубокого сокрытия позволяет обмануть автоматизированные системы анализа, которые проверяют только поверхностный код, но не анализируют дерево зависимостей.

Процесс заражения на платформе Windows выглядит следующим образом. После установки пакета colorinal, в системе появляется файл terminate.dll. Когда разработчик импортирует библиотеку в свой проект, выполняется специальный скрипт unicode.py. Этот скрипт загружает terminate.dll в память процесса Python и вызывает его экспортируемую функцию envir. В этот момент дроппер активируется: он расшифровывает встроенные данные с использованием алгоритма AES в режиме CBC, ключом для которого служит строка xterminalunicod, переданная из скрипта. Далее следует декомпрессия с помощью алгоритма LZMA, в результате чего извлекаются два файла: vcpktsvr.exe и libcef.dll, которые и составляют тело основного зловреда ZiChatBot. Эти файлы помещаются в папку vcpacket внутри каталога локальных данных пользователя.

Для закрепления в системе дроппер создает запись в реестре в разделе автозагрузки, которая гарантирует запуск ZiChatBot при каждом старте Windows. Затем вредоносная программа запускает шелл-код, который выполняет самоочистку: удаляет файл terminate.dll и сам скрипт unicode.py, заметая следы. Версия для Linux работает по схожему принципу, но использует файл terminate.so и создает задание в планировщике crontab для запуска исполняемого файла, помещенного в каталог /tmp/obsHub.

Сами зловреды ZiChatBot на Windows представляет собой библиотеку libcef.dll, которая загружается легитимным процессом vcpktsvr.exe. После активации программы она устанавливает связь с серверами Zulip. Для аутентификации используется токен, который после декодирования представляет собой строку с данными учетной записи бота. Зловред использует два канала в чате: один предназначен для отправки информации о текущем состоянии системы, второй - для приема сообщений, содержащих полезную нагрузку. Единственная команда, которую поддерживает ZiChatBot, - выполнение полученного шелл-кода. Это делает зловред идеальным инструментом для разведки и последующего выполнения более сложных атакующих действий, например, кражи данных или перемещения по сети.

Эксперты при атрибуции атаки использовали систему анализа угроз, которая показала, что дроппер ZiChatBot на 64 процента схож с вредоносной программой, ранее описанной в отчетах, связываемых с группировкой OceanLotus. Обратная разработка подтвердила, что оба образца используют практически идентичные алгоритмы для расшифровки и загрузки полезной нагрузки. Это позволяет с высокой долей уверенности утверждать, что за атакой стоит именно эта APT-группировка, известная своей активностью против целей в Азиатско-Тихоокеанском регионе и на Ближнем Востоке.

К счастью, благодаря оперативным действиям специалистов по безопасности, вредоносные пакеты были удалены из репозитория PyPI вскоре после обнаружения. Кроме того, организация helper, зарегистрированная атакующими в сервисе Zulip, была официально деактивирована администрацией сервиса. По данным телеметрии, на момент публикации отчета не было обнаружено ни одной успешной инфекции. Тем не менее, специалисты рекомендуют добавить полный URL helper.zulipchat.com в списки блокировки для выявления потенциально зараженных устройств. Эта атака является ярким напоминанием о том, что даже открытые и проверенные репозитории не гарантируют полной безопасности, а методы APT-группировок становятся все более изощренными, используя легитимные облачные сервисы для прикрытия своей деятельности.

Индикаторы компрометации

MD5

  • 02f4701559fc40067e69bb426776a54f
  • 0a5a06fa2e74a57fd5ed8e85f04a483a
  • 1995682d600e329b7833003a01609252
  • 22538214a3c917ff3b13a9e2035ca521
  • 38b75af6cbdb60127decd59140d10640
  • 454b85dc32dc8023cd2be04e4501f16a
  • 5152410aeef667ffaf42d40746af4d84
  • 5598baa59c716590d8841c6312d8349e
  • 652f4da6c467838957de19eed40d39da
  • 968782b4feb4236858e3253f77ecf4b0
  • a26019b68ef060e593b8651262cbd0f6
  • b55b6e364be44f27e3fecdce5ad69eca
  • ba2f1868f2af9e191ebf47a5fab5cbab
  • c33782c94c29dd268a42cbe03542bca5
  • e200f2f6a2120286f9056743bc94a49d
  • e4a0ad38fd18a0e11199d1c52751908b
  • fce65c540d8186d9506e2f84c38a57c4

Комментарии: 0