Кибербезопасность
Подробности криптомайнинговой кампании Load/Mine на Hugging Face от Pluto Security

29 октября 2026 года исследовательская команда Pluto Security опубликовала свой отчет Load/Mine, в котором раскрыла сведения о кампании по криптомайнингу и установке бэкдора, распространявшейся через вредоносные репозитории моделей на Hugging Face. Согласно отчету, кампания охватила 31 вредоносный репозиторий в семи аккаунтах Hugging Face, а также зеркало на ModelScope: зафиксировано 29 818 загрузок в рамках кампании, а с учетом 13 связанных репозиториев — 32 376. Pluto уточняет, что это число отражает количество загрузок, а не подтвержденных заражений или уникальных жертв.
В отчете, авторами которого стали Шакед Чен, Эйтан Хассид и Йотам Перкал, говорится, что кампания возобновилась через несколько дней после первоначального удаления: 19 репозиториев второй волны набрали более 29 000 загрузок и оставались доступными спустя восемь дней после того, как Pluto сообщила о них. Согласно отчету, на кошелек для выплат первой волны поступило около 2 276 PRL — примерно 5 000 долларов США — в виде доходов от майнинга в блокчейне.
Как работает вредоносный код
В кампании используется задокументированная особенность загрузки в Transformers, а не отравленные веса. Загрузка репозитория с trust_remote_code=True импортирует код Python из репозитория с правами вызывающего процесса еще до загрузки любых весов. В репозитории config.json используется auto_map для указания модуля Python и класса, которые нужно загрузить; Transformers скачивает указанный файл в кэш модулей, а вызов exec_module() выполняет код верхнего уровня из файла, прежде чем вернуть запрошенный класс модели. В отчете отмечается, что такое поведение задокументировано, но не является поведением по умолчанию; политика безопасности Transformers предписывает пользователям проверять содержимое файлов моделирования при использовании этого аргумента. В отчете также упоминается CVE-2026-22807: в версиях vLLM начиная с 0.10.1 и до выхода исправления в версии 0.14.0 загружались auto_map модули без проверки настройки trust_remote_code что позволяло вредоносному репозиторию выполнять код при запуске сервера.
Обнаружение и связь между аккаунтами
Pluto создала сканер, проверяющий каждый .py файл, указанный в auto_map в config.json, а также файлы Python, расположенные рядом с весами моделей, и выявляющий такие признаки, как subprocess, socket, ctypes, memfd_create и декодирование Base64. Первой находкой стал dsxk4mr8tq/qwen2-tiny-gpt2, в котором находился файл длиной 305 строк под названием modeling_evil.py; в аккаунте было шесть репозиториев, созданных в течение 2,5 часа 12 октября 2026 года.
Разгадку связи между аккаунтами обнаружили в резервных файлах. В репозитории qwen2-tiny-lite содержались modeling_evil.py.bak-src и modeling_evil.py.bak-sync, более ранние версии той же вредоносной программы, URL-адреса для загрузки которой вели не на одноразовый аккаунт, а на hhzz667 на Hugging Face и wssb123e на ModelScope. В отчете говорится, что оператор скопировал рабочий код в тестовый аккаунт, обновил URL-адреса в основном файле, но забыл о резервных копиях. В первую волну вошли 12 репозиториев в трех аккаунтах на двух платформах; до их удаления было зафиксировано более 700 загрузок, а система безопасности не выставила ни одного предупреждения.
Анатомия вредоносной нагрузки
Взяв MENXIANGYU/qwen2-tiny за типичный вариант, в отчете описывают вредоносную нагрузку, которая сначала создает /tmp/.cch/svc.py, сторожевой процесс, перезапускающий отсутствующий майнер каждые 120 секунд, и хуки запуска, добавленные в /root/.bashrc, /root/.profile и файл пользователя .bashrc. В трех вариантах добавлена обратная оболочка, которая подключается к адресу 212.32.253.3 через порт 443 или 9443 и повторяет попытку после каждого разрыва соединения.
Бинарный файл майнера, syscore.bin, запускается через memfd_create и fexecve маскируется под поток ядра kworker/u20:1, поэтому при первом запуске исполняемый файл не сохраняется на диске; резервная копия при этом остается в /tmp/.cch/sync. Бинарный файл размером 40,6 МБ упакован с помощью UPX; у двух UPX! маркеров заменены значения на PEK! , из-за чего стандартная утилита распаковки его отвергает. Pluto восстановила маркеры и распаковала майнер под названием peakminer, который запускается с указанием адресов пула и логина krxXJ2PKQW.worker. Подтверждения выполнения записываются в локальный реестр моделей Xinference в виде qwen2-tiny- с последующими кодами состояния в Base32; вредоносная нагрузка также удаляет регистрации конкурирующих майнеров и завершает соответствующие процессы.
Две волны и адаптация после удаления
Согласно отчету, первая волна исходила от аккаунта hhzz667, созданного 29 апреля 2026 года и бездействовавшего пять месяцев. 21 сентября 2026 года в нем был опубликован qwen2-shell, бэкдор для SSH из 37 строк, который добавлял ключ ed25519 в authorized_keys и отправлял сигнал на сервер Alibaba Cloud; файл README скопировали с официальной карточки модели Qwen2.5-0.5B. К 22 сентября оператор выпустил qwen2-final, безфайловый майнер из 305 строк, замаскированный под поток ядра, с механизмом удаления конкурирующих майнеров и передачей статуса Xinference под безобидными названиями, такими как Qwen2Config. Комментарии в коде были написаны на упрощенном китайском.
Pluto сообщила о первой волне Hugging Face и ModelScope, после чего эти аккаунты удалили. Через несколько дней последовала вторая волна: 19 репозиториев в пяти аккаунтах, включая MENXIANGYU с 13 репозиториями, а также wjsbg, soumikmahato, r1r13 и htt0118; последний был создан 25 октября 2026 года. Один из репозиториев, MENXIANGYU/qa-whl-1021, опубликованный через 8,5 часа после письма Pluto с сообщением об обнаружении кампании, содержит скрипт для выхода из контейнера на хост, который подключает диски хоста, нацелен на каталог GPUStack и предоставляет вход в систему хоста с правами root. Более поздний загрузчик ограничивает доступ ко второй стадии по исходному IP-адресу, отвечая другим запрашивающим кодом 403 и текстом «static ip». Флагманский репозиторий /var/lib/gpustack каталог и предоставляет вход в систему хоста с правами root. Более поздний загрузчик ограничивает доступ ко второй стадии по исходному IP-адресу, отвечая другим запрашивающим кодом 403 и текстом «static ip». Флагманский репозиторий MENXIANGYU/qwen2-tiny вырос с 7 354 загрузок 20 октября до 28 412 загрузок 28 октября, на него пришлось 97,7% загрузок во второй волне.
Доходы от майнинга и выявленные жертвы
Кошелёк первой волны получил около 2 276 PRL в рамках 716 транзакций и перевёл далее около 2 241 PRL. Он оставался активным на общедоступных панелях пулов 21 октября, уже после удаления репозиториев. На Kryptex у кошелька отображались два работающих воркера, сообщавших peakminer/2.16.5 около 1 008 PRL; на момент сбора данных вознаграждение за 30 дней составляло примерно 2 237 долларов. Во время анализа девять воркеров с именами в стиле названий ноутбуков подключились с разницей не более 90 секунд, а примерно через шесть минут перестали отправлять доли. Как отмечается в отчёте, такое поведение соответствует работе общей GPU-кластера. У отдельной отслеживаемой hl семьи вредоносных программ, использующей аналогичный запуск при импорте, на кошельке MoneroOcean числилось 13 воркеров; за примерно месяц было выплачено около 26 долларов.
Пробелы в охвате сканеров
Ни один из 12 репозиториев первой волны не был помечен как вредоносный, а полезная нагрузка флагманского репозитория второй волны modeling_evil2.py по результатам проверок Pluto получила статус «безопасно» во всех запущенных сканерах; JFrog также сообщил, что это не модель машинного обучения. В документации Hugging Face по сканированию на вредоносное ПО говорится, что при каждом коммите каждый файл репозитория размером менее 2 ГБ проверяется сканером на вредоносное ПО. В документации по сканированию pickle-файлов сказано, что сканер запускает антивирусную проверку ClamAV и проверку импорта pickle-файлов; при этом ClamAV не защищает от эксплойтов в pickle-файлах, а сканирование «не даёт 100-процентной гарантии», поэтому ответственность за проверку безопасности лежит на пользователе. Pluto отмечает, что проверка .py файлов, на которые указывает auto_map до установки флага, выявила бы все полезные нагрузки этой кампании, а статическая проверка при загрузке на наличие subprocess, socket, ctypes или прямых обращений к IP-адресам в auto_mapфайлах, на которые ссылаются, выявила бы их раньше.
Оценка причастности и рекомендуемые меры
По оценке Pluto, за кампанией стоит мотивированный финансовой выгодой оператор или небольшая группа, говорящие по-китайски. На это указывают комментарии на упрощённом китайском языке, сервер управления на Alibaba Cloud, зеркала на ModelScope и hf-mirror.com, выбор целей, предполагающий использование Xinference и Tencent Cloud, а также группировка активности в период с 18:38 до 21:19 UTC. Сборка «parasit» от soumikmahato содержит комментарии на индонезийском языке; как говорится в отчёте, это может указывать как на второго оператора в той же нише, так и на одного оператора, намеренно использующего заметно отличающийся вариант.
В отчёте рекомендуется всем, кто загружал одну из перечисленных моделей с включённым пользовательским кодом, проверить хосты на наличие /tmp/.cch/, неожиданных svc.py процессов, kworker/u20:1 процесса с аргументами для майнинга, закодированных qwen2-tiny- или ezv- регистраций в Xinference, а также подключений к указанным серверам и пулам. Pluto рекомендует изолировать затронутые машины, сохранить доказательства, удалить все механизмы закрепления в системе, сменить раскрытые учётные данные с чистой машины, переустановить систему из доверенного образа, если целостность хоста невозможно подтвердить, включить аутентификацию для API Xinference и закрепить проверенные версии моделей. Pluto ожидает новых кампаний такого рода и продолжает следить за ними.












