23 июля 2026 года в репозитории PyPI появилась версия 0.7.4 библиотеки mrmustard - программного продукта для фотонных квантовых вычислений от компании Xanadu. Пакет содержал встроенную вредоносную функцию, которая при импорте собирала SSH-ключи, учётные данные AWS и конфигурацию Kubernetes с компьютера разработчика или исследователя, после чего отправляла их на сервер злоумышленников. Кроме того, вредонос устанавливал три независимых механизма закрепления, которые продолжали работу даже после удаления самого пакета. Атака была направлена на среду научных вычислений и высокопроизводительных кластеров (HPC): помимо стандартных облачных секретов, программа собирала данные о очередях задач SLURM и инвентаризацию GPU.
Описание
Вредоносный код располагался в файле mrmustard/__init__.py и представлял собой функцию из 258 строк, замаскированную под проверку совместимости с TensorFlow - названную _check_tf_compatibility(). Всё остальное содержимое версии 0.7.4 было побайтово идентично предыдущей чистой версии 0.7.3. Ключевым индикатором атаки стало несоответствие между версией на PyPI и репозиторием на GitHub: в проекте XanaduAI/MrMustard не существовало ни тега v0.7.4, ни соответствующего релиза или коммита - последняя стабильная версия на GitHub имела тег v0.7.3. Выпуск 0.7.4 был опубликован через аккаунт ziofil (Филиппо Миатто), основного автора проекта, после того как этот аккаунт был скомпрометирован и использован для кражи токенов CI-публикации. PyPI с тех пор заблокировал проект.
Как показал анализ, вредоносная функция запускалась при каждом импорте mrmustard. Она создавала фоновый поток, который не блокировал выполнение, и сразу же проверяла, не работает ли система в среде непрерывной интеграции (CI) или внутри контейнера - в таких случаях код завершался бездействием. Это было сделано намеренно: злоумышленники хотели атаковать именно рабочие станции разработчиков и исследователей, где хранятся долгоживущие ключи, а не сборочные системы с короткоживущими временными токенами. Затем программа собирала исчерпывающий набор данных: все приватные SSH-ключи из папки ~/.ssh (кроме файлов с расширениями .pub и known_hosts), содержимое файлов ~/.aws/credentials, ~/.aws/config и ~/.kube/config, а также результаты выполнения команд id, hostname, nvidia-smi, squeue и полный список установленных pip-пакетов. Для каждого файла или вывода команды был установлен лимит в 8192 байта. Собранная информация упаковывалась в JSON, шифровалась с помощью XOR с ключом, полученным из строки "tf_compat_v2", затем кодировалась в Base64 и отправлялась POST-запросом на адрес hxxps://metrics.femboy[.]energy/v1/collect с поддельным заголовком User-Agent браузера.
Помимо кражи данных, вредонос закреплялся в системе тремя способами. Первый - запись скомпилированного файла hw_probe.pyc в каталог ~/.cache/.tf_cache/ и добавление соответствующей задачи в cron, которая запускала этот файл каждые 15 минут. Второй - добавление хука в файлы ~/.bashrc, ~/.zshrc или конфигурацию fish, которые запускали вредонос при каждом открытии терминала. Третий - создание файла mmcompat.pth в одном из каталогов site-packages Python. Механизм .pth позволяет выполнять произвольный код при старте интерпретатора Python: любая строка, начинающаяся с import, исполняется автоматически. Таким образом, даже после выполнения pip uninstall mrmustard вредонос оставался активным и запускался при каждом вызове python или python3 на машине. Для удаления всех следов требуется вручную очистить cron, файлы shell-конфигурации и удалить файл mmcompat.pth из site-packages.
Компрометация аккаунта подтверждается событиями в репозитории GitHub. В тот же день, 23 июля, под учётной записью ziofil были созданы два коммита. Первый коммит (2ebfe28) удалял семь легитимных workflow-файлов и добавлял один, который зондировал self-hosted раннеры проекта - команда whoami позволяла выяснить, под каким пользователем работают собственные сборочные машины. Второй коммит (80aba72) добавлял workflow, который крал токены PyPI и Codecov, указанные в настройках репозитория. Извлечённые секреты отправлялись на веб-хук webhook[.]site. Примерно через два часа после этого на PyPI был загружен вредоносный пакет 0.7.4 - временной промежуток указывает на использование украденного токена для публикации. Оба вредоносных коммита были сделаны в ветки, которые затем удалены, но сами коммиты остаются доступны по своим хешам.
Пользователям, которые установили mrmustard версии 0.7.4, следует немедленно сменить все SSH-ключи, пароли от облачных сервисов и токены Kubernetes, хранившиеся на заражённой машине. После удаления пакета необходимо вручную проверить наличие файла mmcompat.pth в каталогах site-packages, а также удалить записи из cron и конфигурационных файлов оболочки. Регулярная проверка содержимого .pth-файлов на наличие строк с subprocess, Popen или сетевыми вызовами помогает выявить подобные методы закрепления. Данный инцидент в очередной раз демонстрирует, что компрометация аккаунта мейнтейнера с доступом к токенам публикации может привести к масштабным атакам на цепочку поставок даже в нишевых, но критически важных для научных исследований библиотеках.
Индикаторы компрометации
Package
- pypi/mrmustard@0.7.4
Domain
- metrics.femboy.energy
URL
- https://metrics.femboy.energy/v1/collect
- https://webhook.site/710babde-6ace-47fe-83f4-9688e6548df9
SHA256
- 0404f8590fdaef95280c1d908068f31bf2321fe887faabf0c2329ba67c7203cb
- 81f0d1291a975d012d1b892cf9967557fdbb1ad4e1ac0545702ad235ace1cac5