Назад к блогу

Атаки на LLM-инфраструктуру: майнер на 3400 серверах, непропатченный RCE в LMCache и npm-пакеты с RAT

Атаки на LLM-инфраструктуру: майнер на 3400 серверах, непропатченный RCE в LMCache и npm-пакеты с RAT

Три разнородных инцидента показывают, что инфраструктура вокруг больших языковых моделей стала самостоятельной мишенью: майнер PoeLLM заразил тысячи серверов, в LMCache обнаружилась критическая уязвимость без патча, а через npm распространяли RAT и стилер. Материал разбирает механику каждой атаки — от переиспользования скомпрометированных хостов до отсутствия аутентификации в кэш-сервере — и объясняет, какие пробелы в защите остаются открытыми.

Три независимых инцидента объединяет одна цель — вычислительные ресурсы и данные, стоящие за LLM-серверами. Малварь PoeLLM заразила более 3400 серверов ради криптомайнинга, в LMCache нашли критическую уязвимость, позволяющую выполнить код на кэш-сервере без аутентификации, а восемь вредоносных npm-пакетов скачали 40 767 раз и доставили RAT и стилер. Ниже — что именно произошло, как это работает и что остаётся неизвестным.

Что случилось

PoeLLM — малварь кампании Canto Incognito, нацеленная на открытую AI/LLM-инфраструктуру. По данным Lumen Black Lotus Labs, она активна с апреля 2026 года и заразила более 3400 серверов-жертв. На пике операций в середине июня кампания затрагивала почти 2200 серверов, из которых около 800 были активны ежедневно. Цель — установка криптомайнеров XMRig и Iron и подключение жертв к Kryptex.

В LMCache — открытом ПО для ускорения LLM-серверов вроде vLLM — нашли критическую уязвимость CVE-2026-105192 с оценкой 9.8. Неаутентифицированный атакующий может выполнить код на кэш-сервере, и исправленной версии на момент публикации нет.

Восемь вредоносных npm-пакетов кампании MALFEX скачаны в совокупности 40 767 раз и доставляют Overlord RAT и стилер movinlike.

PoeLLM: как устроена атака

Первичное проникновение идёт через эксплуатацию известных уязвимостей в публично доступных сервисах. Целями названы LiteLLM, Gotenberg, Gitea и Ivanti Sentry. После компрометации хосты переиспользуются: их превращают в сканеры и эксплойт-серверы, которые ищут новые уязвимые системы и отправляют на их открытые порты HTTP POST-запрос, заставляющий скачать вредоносное ПО с C2.

Адрес C2 спрятан в стихотворении, размещённом в GitHub-репозитории. При смене C2 меняются несколько слов, и адрес выводится из ключа, связанного с этими словами. Заражённые хосты расширяют ботнет: инфицированные серверы становятся сканерами и эксплойт-серверами, что позволяет находить и компрометировать дополнительные системы.

Lumen Black Lotus Labs также указывает на недавний трафик к SSH и другим порталам входа как на признак экспериментов с распределёнными атаками методом перебора, отмечая, что зрелость этой возможности остаётся неясной.

LMCache: непропатченный RCE в кэш-сервере

Уязвимость находится в multiprocess-режиме LMCache, где кэш работает как отдельный сервер, доступный LLM-воркерам через ZeroMQ. Этот сокет не имеет аутентификации. Один из типов сообщений распаковывается через pickle. Сервер распаковывает сообщение ещё до проверки его типа, поэтому специально сформированное сообщение позволяет выполнить код отправителя. Код исполняется с привилегиями процесса LMCache, а в официальных контейнерах этот процесс работает как root.

Уязвимость затрагивает LMCache с версии 0.3.9, выпущенной в октябре 2025 года, по 0.5.5 — последний стабильный релиз, а также присутствует в релиз-кандидатах 0.5.6 и в ветке разработки. Исправленной версии не существует.

Удалённо эксплуатировать уязвимость можно только если оператор назначил серверу маршрутизируемый адрес: по умолчанию сервер слушает только локальную машину. Официальный пример развёртывания в Kubernetes запускает сервер именно так, слушая все сетевые интерфейсы.

Рядом стоит отдельная, уже исправленная уязвимость в vLLM — CVE-2026-105756. До версии 0.30.0, выпущенной 22 сентября, один запрос с некорректным значением cache_salt — параметром, который передаётся через multiprocess-коннектор LMCache, — мог обрушить движок в развёртываниях с этим коннектором. Это отказ в обслуживании с оценкой 6.5, не позволяющий выполнять код.

npm-пакеты: три пути заражения

Атака заражает Windows-системы через три отдельных пути: загрузчик Overlord RAT и цепочку установки стилера movinlike. Overlord — открытый RAT на Go, использующий транзакции Solana для извлечения адреса C2. Стилер movinlike — Node.js-стилер, нацеленный на Discord, браузеры, Telegram и криптовалютные кошельки.

Три пакета — tlxbnhd, tldriver и mxdriver — работают как загрузчики Overlord RAT: вредоносный код срабатывает через lifecycle-хуки и скачивает исполняемый файл Windows.

В пакете function-flag есть postinstall-хук, запускающий JavaScript-полезную нагрузку для скачивания с удалённого сервера; каждая версия пакета обслуживает нагрузку из другого места. В версии 1.7.3 postinstall-скрипт запускает example.js, который вызывает функцию ASCII-арта пакета со шрифтом Bloody. Это значение запускает скрытую процедуру: она скачивает node.exe с cdnzona.discloud.app, сохраняет его в %APPDATA%\node.exe и запускает со скрытым окном. Пакет function-color собственной нагрузки не несёт, но указывает function-flag как зависимость. Оба пакета всё ещё активны.

Из 40 767 загрузок 37 419 приходятся на function-flag — он крупнейший драйвер активности.

Почему это стало возможно

LLM-серверы привлекательны тем, что их вычислительную мощность можно использовать для скрытого майнинга. Атаки Canto Incognito в первую очередь нацелены на интернет-доступные корпоративные развёртывания — именно такие, как LiteLLM и Gotenberg.

Кэш-серверы добавляют к этому вторую проблему: их сетевые интерфейсы могут не иметь аутентификации. ZeroMQ-сокет multiprocess-сервера LMCache открыт без проверки, а данные из него попадают в pickle. Та же ошибка — передача данных из неаутентифицированного сетевого сокета в pickle — была найдена исследователями в других фреймворках AI-инференса в ноябре 2025 года под общим названием ShadowMQ. Имеет ли код LMCache общий источник с теми проектами, не установлено.

JFrog присвоил уязвимости LMCache оценку 9.8 из 10 — критический диапазон для сервера, привязанного к маршрутизируемому адресу.

Что делать операторам

До выпуска патча JFrog советует не назначать multiprocess-серверу LMCache маршрутизируемый адрес и держать его порт на локальной машине или в доверенной кластерной сети. Брандмауэр, ограничивающий доступ к порту, снижает риск, но не устраняет его: любой хост, способный открыть соединение, может выполнить код.

Для LLM-инфраструктуры в целом предлагается набор мер. Среду разработки выделяют в отдельный изолированный сегмент, в качестве усиления — физически изолированный, и запрещают задачи, не связанные с конкретной разработкой. Для фреймворков, библиотек и инструментов предписан анализ уязвимостей и обновления, включая SCA. Для обучающих данных — доверенные источники, антивирусная проверка, обособленное хранилище и контроль целостности через контрольные суммы и подпись. В эксплуатации — изоляция и микросегментация, квотирование запросов и токенов, детектор аномальных запросов, регистрация всех запросов и ответов модели вместе с логами фильтрации. Раз в год рекомендуется внешнее тестирование ИИ-системы на промпт-инъекции и состязательные атаки.

Ограничения и открытые вопросы

Атрибуция PoeLLM сделана с умеренной уверенностью: активность приписана италоязычному актору угроз на основе италоязычных артефактов и netflow.

По LMCache патча нет, и LMCache не опубликовал security advisory. Совет JFrog при этом не даёт операторам способа определить, был ли сервер уже атакован. Шесть дополнительных отчётов о безопасности LMCache открыл один пользователь GitHub 6 октября, за день до публикации CVE-2026-105192. В них утверждается о неаутентифицированном доступе к кэшированным данным разных арендаторов и к сетевым службам, выполняющим команды без входа. Отчёты исходят из одной учётной записи, опираются на заявления о proof-of-concept и не имеют ни CVE, ни подтверждения от сопровождающих, ни исправления. Один из них указывает на изменившееся поведение по умолчанию: административный HTTP-сервер, слушавший все сетевые интерфейсы в 0.5.5, в релиз-кандидатах 0.5.6 слушает только локальный хост.

По npm-кампании полнота списка не заявлена как исчерпывающая: с августа 2023 года опубликовано 12 пакетов, восемь из которых помечены как вредоносные, и приведён список из восьми. Связь между разными кампаниями не установлена.

Источники

Похожее