В Python Package Index обнаружили вредоносный пакет parsimonius, который маскировался под легитимную библиотеку parsimonious. Разница — одна буква. Для разработчика, который быстро ставит зависимость из консоли или копирует название из чужого README, этого достаточно.
Пакет уже удалён из PyPI. До удаления он успел набрать 2 474 загрузки. Это не рекорд для атак на цепочку поставки, но показатель неприятный: вредоносная зависимость успела попасть в реальные окружения, CI/CD, тестовые стенды или локальные машины разработчиков.
Легитимный parsimonious — библиотека для разбора текстов через PEG-грамматики. Её используют в Python-проектах, где нужно описывать правила парсинга и превращать входные данные в дерево разбора. Вредоносный parsimonius играл на узнаваемом названии и выглядел как очередной пакет с похожим назначением.
Вредоносный parsimonius копировал функциональность настоящей библиотеки, поэтому код мог работать нормально. Разработчик ставит пакет, импортирует его, запускает проект — явной ошибки нет.
В базе OSSF Malicious Packages пакет проходит как MAL-2026-5151. Это клон легитимного пакета с добавленным RAT, который работал через Telegram-бота. RAT — это удалённый инструмент доступа. В таком сценарии атакующий получает канал управления заражённой машиной или окружением и может выполнять команды.
Отдельно отмечены кража переменных окружения и возможность удалённого выполнения команд. Для Python-проектов это почти прямое попадание в больное место. В переменных окружения часто живут токены API, пароли к базам, ключи облачных сервисов, секреты веб-фреймворков, настройки доступа к очередям, хранилищам и платёжным сервисам.
Атака — классический typosquatting. Атакующий регистрирует пакет с названием, похожим на популярный проект: меняет одну букву, добавляет дефис, переставляет символы или использует похожее написание. Человек видит знакомое слово и не всегда замечает разницу.
Вредоносный пакет публиковался с версиями, похожими на развитие настоящего проекта. В списке затронутых версий указаны 0.10.0, 0.11.0, 0.11.1, 0.11.2, 0.11.3, 0.11.4, 0.11.5, 0.11.6 и 0.12.0.
Отдельная деталь — использование Telegram-бота. Для вредоносных пакетов это удобный способ связи с оператором: не нужно поднимать сложную инфраструктуру, трафик к популярному сервису реже выглядит необычно, а команды и украденные данные можно гонять через уже существующую платформу.
В корпоративной сети такой трафик может потеряться среди обычных подключений, особенно если Telegram не блокируется и не контролируется. Для атакующего это дешёвый C2-канал — командный канал управления.
Файлы .env и переменные окружения — удобная мишень. Разработчики хранят там секреты, потому что так проще не держать пароли прямо в коде. Это нормальная практика, но она не делает секреты неуязвимыми. Если вредоносный пакет запускается в том же окружении, он может прочитать доступные переменные и отправить их наружу.
В типичном .env могут лежать:
— токены Telegram-, Discord- или Slack-ботов;
— ключи AWS, Google Cloud, Azure или других облаков;
— пароли к PostgreSQL, MySQL, Redis, MongoDB;
— ключи JWT и секреты Django, Flask, FastAPI;
— токены GitHub, GitLab, Sentry, Stripe, SendGrid;
— параметры доступа к внутренним API.
После такой утечки простое удаление пакета уже не решает проблему. Секреты нужно менять. Логи — проверять. Доступы — ограничивать. Иначе украденный токен может жить дольше самой вредоносной зависимости.
В описании кампании указана ещё одна деталь: вредоносная часть не запускалась, если геолокация или часовой пояс указывали на российский регион. Такая проверка часто используется для снижения шума, обхода части исследовательских сред или ограничения круга жертв.
Есть новость? Станьте автором.
Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.
Читайте также
Фейковые Ghidra и dnSpy добрались до верхних строк поиска: как поддельные сайты для ИБ-специалистов вели к стилерам и криптоклипперу
VECT 2.0 оказался вымогателем, который может повредить файлы без шанса на восстановление