Обнаружена новая техника управления ботами: злоумышленники используют NATS-серверы для скрытой координации

information security

В начале мая 2026 года команда исследователей безопасности Sysdig Threat Research Team выявила необычный метод работы вредоносной инфраструктуры. Речь идет об использовании сервера NATS (системы обмена сообщениями для распределенных приложений) в качестве скрытого командного центра. Такой подход позволяет злоумышленникам управлять сетью зараженных машин гораздо эффективнее, чем через традиционные HTTP-панели или мессенджеры. Специалисты Sysdig назвали эту технику NATS-as-C2.

Описание

Инцидент начался с эксплуатации уязвимости CVE-2026-33017 в платформе Langflow, которая предназначена для создания визуальных цепочек с использованием больших языковых моделей. Эта уязвимость позволяет удаленно выполнять код без аутентификации, и она уже была включена в каталог эксплуатируемых уязвимостей CISA (американского агентства по кибербезопасности) еще в марте. Атакующий, работавший с IP-адреса 159.89.205[.]184 (арендованного у DigitalOcean), загрузил на скомпрометированный сервер Python-скрипт и бинарный файл на Go. Примерно за полчаса активных действий исследователи из Sysdig перехватили полезную нагрузку злоумышленника и обнаружили его координационный центр - сервер NATS, расположенный по адресу 45.192.109[.]25:14222. В своем отчете эксперты отметили, что на этом сервере была настроена аутентификация и списки контроля доступа (ACL) на уровне тем сообщений.

Особенность метода в том, что вредоносный код использует паттерн издатель-подписчик (pub/sub), характерный для современных микросервисных архитектур, вместо привычных REST-запросов, чат-ботов или облачных хранилищ. Вредоносная программа, названная KeyHunter, предназначалась для поиска и кражи ключей доступа к облачным сервисам и API искусственного интеллекта. Она получала задания из центральной очереди через NATS и подтверждала их выполнение. Самое интересное - как реализовано разграничение прав. Даже если один из зараженных узлов перехвачен защитниками, он не может подписаться на темы, доступные только оператору, или отправлять команды другим ботам. Это прямой аналог принципа минимальных привилегий, только в ботнете, что делает архитектуру очень устойчивой.

В течение нескольких часов после первоначального взлома атакующий провел полную разведку в облачной инфраструктуре AWS. Он сначала подтверждал работоспособность украденных ключей доступа (с помощью вызова sts:GetCallerIdentity), а затем проверял, к каким сервисам эти ключи дают доступ: Bedrock (для вызова моделей искусственного интеллекта), S3 (хранилище объектов), EC2 (виртуальные серверы), Lambda (функции), IAM (управление политиками доступа). Особое внимание уделялось попыткам использовать ключи для вызова платных моделей AWS Bedrock - это метод LLMjacking, при котором злоумышленник генерирует контент за чужой счет. По сути, одна и та же украденная пара логин-пароль давала две линии монетизации: прямой доступ к вычислительным ресурсам и продажа самих ключей.

Анализ бинарного файла на Go показал, что он специально разработан для кражи данных из онлайн-песочниц кода (CodePen, JSFiddle, StackBlitz, CodeSandbox). Разработчики часто вставляют API-ключи в тестовые сниппеты, но потом забывают их удалить. Вредоносная программа использует библиотеку uTLS для подделки цифрового отпечатка TLS-соединения под браузер Chrome или Firefox, чтобы обходить защиту от ботов (Cloudflare, Akamai). Кроме того, в нее встроен механизм запуска безголового браузера для рендеринга JavaScript-страниц, если прямые HTTP-запросы не срабатывают. В качестве запасного варианта используется Python-скрипт с набором из 12 регулярных выражений для поиска ключей AWS, GitHub, OpenAI, Anthropic и других сервисов. Python-агент дополнительно запускает утилиту gitleaks (с открытым исходным кодом) для углубленного сканирования.

При этом сам злоумышленник не заботился о сокрытии следов. Скрипт развертывания (deploy.sh) устанавливал вредоносный софт в системную папку /opt/keyhunter-worker/, регистрировал его как службу systemd с параметром Restart=always, чтобы узел перезапускался после перезагрузки системы, и повышал лимит открытых файлов до 65 тысяч (для большого числа одновременных соединений). Ни отключения журналирования, ни шифрования кода, ни попыток скрыть имя службы не было. Исследователи делают вывод, что оператор использует дешевые виртуальные серверы, приобретенные через подставные аккаунты, и рассматривает их как расходный материал.

Значение этой находки выходит за рамки конкретного инцидента. NATS как командный сервер дает злоумышленникам несколько преимуществ: встроенная авторизация на уровне тем, гарантированная доставка сообщений (даже если бот временно отключается от сети) и легкое масштабирование - новые рабочие узлы просто подключаются к той же очереди. Технический порог для такой архитектуры выше, чем для запуска простого Flask-приложения, но и возможности управления ботнетом становятся на порядок выше. Защитникам рекомендуется обновить Langflow до исправленной версии, заблокировать исходящий трафик к указанным IP-адресам и ограничить сетевую доступность для инструментов, работающих с большими языковыми моделями. Кроме того, все облачные ключи, которые могли быть скомпрометированы, необходимо немедленно отозвать.

Новый паттерн NATS-as-C2, вероятно, будет встречаться все чаще, поскольку он позволяет строить устойчивые и масштабируемые ботнеты без необходимости писать сложные сетевые протоколы с нуля. Задача для специалистов по информационной безопасности - адаптировать средства обнаружения к этому типу активности, особенно в части мониторинга необычных pub/sub-соединений из рабочих нагрузок. История с KeyHunter - яркий пример того, как легитимные технологии из мира DevOps перекочевывают в арсенал киберпреступников и меняют правила игры.

Индикаторы компрометации

IPv4 Port Combinations

  • 159.89.205.184:8888
  • 45.192.109.25:14222

SHA256

  • 16b279aa018c64294d58280636e538f86e3dd9bdcb5734c203373394b72d101a
  • 323bbf3064d4b83df7920d752636b1acb36f462e58609a815bd8084d1e6b004c
  • dbee863ad2a39f939be2c7ed76f7d5a8fe000aad2d2b2d32b3e8ec3ee42f1c25

Комментарии: 0