В PyPI нашли пакеты, которые открывают доступ к серверу и крадут токены

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, посмотреть на автора и репозиторий и не запускать такие инструменты с правами администратора без необходимости.

Источники и ссылки


Комментарии загружаются…