7 ноября компания Corgea опубликовала разбор вредоносных пакетов, которые нашли в PyPI с 4 по 7 ноября 2026 года. О них сообщили OpenSSF, база уязвимостей GitHub, Amazon Inspector, Bitbison и другие исследователи. Всего в списке 19 пакетов для Python, и часть из них до сих пор можно установить через pip.
Опаснее всего здесь не очевидные подделки с бессмысленными именами, а пакеты, которые выглядят как нормальные инструменты: сервер для разбора аварийных дампов Linux, клиент Google Earth Engine, библиотека с именем почти как у requests. Если такой пакет попал в виртуальное окружение на сервере или рабочей машине, он работает с правами того, кто его запустил.

dynamic-mcp открывает доступ к командной строке через туннель
Самый неприятный случай в списке это dynamic-mcp. Он выдаёт себя за MCP-сервер (сервер инструментов для ИИ-ассистентов), который помогает разбирать аварийные дампы ядра Linux и запускать скрипты bpftrace. В README советуют запускать его от root, чтобы он мог читать /var/crash.
На деле при каждом запуске, даже с ключом —help, пакет скачивает cloudflared и открывает публичный туннель Cloudflare к своему серверу на порту 8080. У этого сервера нет никакой авторизации. Адрес туннеля пакет отправляет на сервис автора на workers.dev и дальше раз в 20 секунд подтверждает, что машина на связи. Начиная с версии 1.0.4 от 25 июля 2026 года через этот сервер можно выполнить любую команду bash. Выходит, у того, кто знает адрес туннеля, есть командная строка на вашей машине с правами пользователя, который запустил пакет.
Туннель открывается во всех восьми версиях с 0.2.0 по 1.0.9, начиная с первой, вышедшей 28 декабря 2025 года. Выключить его можно только переменной окружения ENABLE_REVERSE_CONNECTION=false до запуска, а в README об этом ни слова. По данным Bitbison, за последние 180 дней пакет скачали 1172 раза. Заявку на внесение его в базу вредоносных пакетов OpenSSF открыли 6 ноября, а 10 ноября все версии всё ещё лежат на PyPI.

Поддельные клиенты Google Earth Engine отправляют токены на чужие серверы
Пакеты labelearthengine-api и labelearth-api-python-client это переименованные копии официальных earthengine-api и google-api-python-client. В описании у них даже указан автор Google LLC. Отличие в том, что запросы к API с вашим OAuth-токеном Google уходят не в Google, а на серверы автора в AWS. Тот, кто их получает, может пользоваться вашим доступом к Google Cloud, пока токен действует. За полгода эти пакеты скачали 887 и 973 раза, и оба на момент разбора оставались в PyPI.
Кража файлов Telegram и скрытые шеллы на машинах с ИИ-моделями
Пакеты reqnest и reqnests рассчитаны на опечатку в имени requests. По описанию в базе GitHub, сразу при импорте они собирают файлы Telegram Desktop и отправляют их на сторонний сервер. Corgea уточняет, что пакеты забирают данные сеанса Telegram Desktop. PyPI удалил оба пакета 6 ноября.

Ещё четыре пакета, с qzc690382 по qzc690385, целятся в серверы с Xinference, где запускают ИИ-модели. Прямо во время pip install их setup.py запускает в фоне маленький HTTP-сервер, который слушает все интерфейсы на портах 9998, 9999, 8089, 8099, 8777 или 8899 и выполняет присланные команды. Заодно пакет собирает сведения о машине и через локальный API Xinference на порту 9997 пытается выполнить свой код. Эти пакеты убрали из PyPI 7 ноября.
Остальные находки попроще. Поддельные MCP-серверы для TeamViewer и пакеты с именами внутренних библиотек вроде dbt-adapter и pulumi-doppler при установке отправляют имя машины, IP-адрес и имя пользователя. Пакеты pyuserfox, twitch-stream.py и shanks скачивают и запускают скрипт, прописывают себя в автозагрузку Windows или отправляют геолокацию в Discord, и на 10 ноября они тоже ещё доступны в PyPI. В том же разборе есть вредоносные пакеты npm и RubyGems.
Как проверить свои окружения
Проще всего поискать имена пакетов в файлах зависимостей проекта и в установленных пакетах. Команды ниже ничего не удаляют, они только показывают, есть ли что-то подозрительное. Запускать их стоит в каждом виртуальном окружении и в корне каждого проекта.
pip show dynamic-mcp labelearthengine-api labelearth-api-python-client \ qzc690382 qzc690383 qzc690384 qzc690385 reqnest reqnests \ mcp-teamviewer teamviewer-mcp-server strands-aidr dbt-adapter pulumi-doppler \ genblaze-fal genblaze-atlascloud pyuserfox twitch-stream.py shanks 2>/dev/null grep -RniE 'dynamic[-_]mcp|labelearth|qzc69038|reqnests?|teamviewer[-_]mcp|mcp[-_]teamviewer|pyuserfox|twitch[-_]stream|shanks' \ requirements*.txt pyproject.toml uv.lock poetry.lock Pipfile* .mcp.json 2>/dev/null
На сервере стоит заодно посмотреть, нет ли процессов туннеля и скрытых шеллов, и кто слушает подозрительные порты:
ps aux | grep -E 'cloudflared.*tunnel|dynamic-mcp|/tmp/\.(zqx|kxs)' | grep -v grep ls -la ~/.local/bin/cloudflared /tmp/.zqx /tmp/.kxs /tmp/.kxq /tmp/xmnp.sh 2>/dev/null ss -tlpn | grep -E ':(8080|8089|8099|8777|8899|9998|9999) '
Что делать, если пакет нашёлся
- Если запускался dynamic-mcp, остановите процессы dynamic-mcp и cloudflared, удалите пакет и скачанный cloudflared. Машину лучше считать взломанной: проверьте историю команд, задания cron, юниты systemd и authorized_keys, смените все пароли и ключи, к которым был доступ у этого пользователя.
- Если в проекте были labelearthengine-api или labelearth-api-python-client, удалите их, поставьте официальные earthengine-api и google-api-python-client, отзовите токены Google командой gcloud auth application-default revoke и удалите файл ~/.config/earthengine/credentials.
- Если стоял один из пакетов qzc69038*, завершите фоновые процессы из /tmp/.zqx и /tmp/.kxs, удалите эти файлы и посмотрите, нет ли в Xinference зарегистрированных моделей с именами на zqxp.
- Если импортировался reqnest или reqnests, завершите все остальные сеансы Telegram с другого устройства и включите двухэтапную проверку.
Ничего принципиально нового в этих атаках нет: опечатки в именах, копии известных библиотек и код в setup.py, который срабатывает прямо при установке. Новое здесь то, что вредоносный код всё чаще прячут в MCP-серверы для ИИ-ассистентов, которые люди охотно ставят на рабочие машины и серверы, причём часто от root. Перед установкой малознакомого пакета стоит хотя бы открыть его страницу на PyPI, посмотреть на автора и репозиторий и не запускать такие инструменты с правами администратора без необходимости.