Угроза в цепочке поставок Python: вредоносные пакеты termncolor и colorinal выявлены экспертами

information security

Специалисты Zscaler ThreatLabz обнаружили опасную тактику поставки вредоносного ПО через экосистему Python. В ходе мониторинга базы данных сканирования пакетов PyPI был выявлен подозрительный пакет "termncolor", маскирующийся под легитимную библиотеку для работы с цветами терминала. Анализ показал, что угроза реализуется через зависимость пакета - модуль "colorinal", выполняющий роль начального вектора атаки.

Описание

Технические эксперты установили, что "termncolor" сам по себе не проявляет вредоносной активности, однако при установке автоматически загружает "colorinal". Ключевым элементом атаки стал файл "unicode.py" в составе colorinal. Внешне - это обычный скрипт проверки поддержки цветов терминала, но его метод "is_color_supported()" содержит скрытую функциональность: он загружает DLL-библиотеку "terminate.dll" (или "terminate.so" в Linux-среде) через интерфейс "ctypes.CDLL".

Первая стадия атаки начинается с выполнения "terminate.dll". Библиотека использует ключ "xterminalunicode" для дешифровки встроенной полезной нагрузки алгоритмом AES в режиме CBC. Расшифрованные данные содержат два файла, которые размещаются в каталоге "%LOCALAPPDATA%\vcpacket":

  1. Подписанный легитимный исполняемый файл "vcpktsvr.exe", используемый для техники DLL sideloading.
  2. Вредоносную библиотеку "libcef.dll", являющуюся основным операционным компонентом.

Для обеспечения постоянного присутствия в системе создается запись в реестре Windows "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" с именем "pkt-update", указывающая на "vcpktsvr.exe". После выполнения скрипт "unicode.py" и "terminate.dll" удаляются для сокрытия следов.

Вторая стадия активируется при запуске "libcef.dll". Этот компонент собирает системную информацию: имя компьютера, имя пользователя и версию ОС. Данные передаются на управляемый злоумышленниками командный сервер (C2) через зашифрованные HTTPS-соединения. Для маскировки трафика под легитимную активность используется протокол платформы командного обмена Zulip, что затрудняет обнаружение сетевыми системами защиты.

После передачи данных "libcef.dll" использует кастомный алгоритм хеширования API для разрешения системных вызовов. Алгоритм основан на операциях с ASCII-значениями символов, умножении и битовых сдвигах, обеспечивая простоту и скорость, но потенциально уязвим к коллизиям. Полученный от C2 shell-код исполняется в новом потоке, что может привести к удаленному выполнению кода (RCE).

Профиль угрозы, восстановленный по данным Zulip, указывает на активность злоумышленника с почтовым адресом "[email protected]" (ID пользователя: 937950). Аккаунт был создан 15 июля 2025 года. В организации зафиксировано 3 активных пользователя, обменявшихся 90 692 сообщениями. Пик активности пришелся на конец июля 2025 года. Примечательно использование Python API (3.2% трафика) для отправки сообщений, что коррелирует с методами работы вредоноса. C2-инфраструктура в настоящее время неактивна.

Оба пакета, "termncolor" и "colorinal", были оперативно удалены с PyPI после обнаружения угрозы. Этот инцидент подчеркивает растущие риски цепочек поставок в open-source экосистемах. Злоумышленники активно используют технику "зависимостного" внедрения вредоноса, маскировку под легитимные сервисы и кросс-платформенные компоненты (Windows/Linux).

Zscaler ThreatLabz продолжает мониторинг репозиториев программного обеспечения и призывает разработчиков тщательнее проверять зависимости, а компании - внедрять решения для анализа поведения кода и сетевого трафика. Хотя непосредственная угроза нейтрализована, подобные тактики остаются актуальным инструментом в арсенале киберпреступников.

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

Domains

  • helper.zulpichat.com

MD5

  • 1995682d600e329b7833003a01609252
  • 381022e5fd0cede7146f9922e1ed30a3
  • 38b75af6cbdb60127decd59140d10640
  • 5152410aeef667ffaf42d40746af4d84
  • 7857238199018edc0ad7cd4d851c5a9b
  • 9267d9a72207df3217014f206ba18560
  • c5f0425dabd01d7ba80dfc3d5ca19841
  • db69c6bfbf6575e0d887351265165e6e
Комментарии: 0