Ad
Угрозы

Уязвимость Ruflo позволяла перехватывать управление ИИ-агентами

Маша Даровская
By Маша Даровская , IT-редактор и автор
Уязвимость Ruflo позволяла перехватывать управление ИИ-агентами
Обложка © Anonhaven

В открытой платформе Ruflo обнаружили критическую уязвимость CVE-2026-59726. Она позволяла без авторизации выполнять команды внутри контейнера, красть ключи от ИИ-сервисов, запускать группы агентов за счёт владельца системы и подменять записи в их долговременной памяти.

Для начала атаки хватало одного сетевого запроса к доступному MCP-мосту. Проблема затрагивала версии Ruflo ниже 3.16.3, развёрнутые через стандартную конфигурацию Docker Compose.

Исследователи Noma Labs назвали уязвимость RufRoot. Название может ввести в заблуждение: атакующий получал командную оболочку от имени пользователя node с идентификатором 1000 внутри контейнера, а не права root на основной системе. Дальнейший ущерб зависел от настроек контейнера, подключённых каталогов, сетевых разрешений и хранившихся в окружении секретов.

Ruflo, ранее известная как Claude Flow, представляет собой открытую среду для управления ИИ-агентами. Она дополняет Claude Code и Codex инструментами, памятью, изолированными средами и средствами распределения задач между несколькими исполнителями.

Сама модель отвечает за создание текста или кода, а Ruflo предоставляет ей доступ к внешним функциям. Агенты могут работать группой, обмениваться результатами, сохранять удачные способы решения задач и использовать их в следующих сеансах. Связь с инструментами организована через протокол контекста модели — Model Context Protocol, или MCP.

На момент публикации исследования репозиторий проекта собрал около 67 тысяч звёзд на GitHub. В описании Ruflo платформа названа исполнительным слоем для Claude Code и Codex, который добавляет специализированных агентов, совместную работу и самообучающуюся память.

Уязвимость находилась не в Claude Code, Codex, языковых моделях или самом протоколе MCP. Причиной стали настройки MCP-моста Ruflo и отсутствие проверки доступа на критических маршрутах.

MCP-мост принимает запросы от интерфейсов и агентов, а затем вызывает нужные инструменты. В исследованной сборке через него были доступны 233 функции, включая выполнение команд, работу с базой данных, управление агентами и запись информации в память.

Стандартный файл docker-compose.yml публиковал порт моста 3001 на адресе 0.0.0.0. Служба принимала подключения на всех сетевых интерфейсах. MongoDB с портом 27017 была опубликована аналогичным способом.

Такая настройка не означала автоматическую доступность каждой установки из интернета. Внешнее подключение могли блокировать межсетевой экран, правила облачной сети или сегментация. Но любой пользователь, способный обратиться к порту 3001 из доступного сегмента, получал возможность атаковать службу без учётной записи.

Маршруты POST /mcp и POST /mcp/:group не проверяли токен. Злоумышленник мог отправить запрос JSON-RPC, вызвать инструмент ruflo__terminal_execute и передать ему системную команду. Участие владельца сервера не требовалось.

В Ruflo уже существовал список запрещённых инструментов, куда входил terminal_execute. Проверка применялась лишь при работе через режим Autopilot. Прямые обращения к двум маршрутам MCP обходили ограничение. Эту цепочку подтверждает официальный бюллетень Ruflo.

Команды выполнялись внутри контейнера MCP-моста от имени пользователя node. Это не давало автоматического контроля над основной системой, но открывало доступ к ресурсам, которые разработчики передали контейнеру.

Среди них находились переменные окружения с ключами ИИ-провайдеров. Атакующий мог извлечь настроенные ключи OpenAI, Anthropic, Google или OpenRouter, а затем использовать их для собственных запросов. Расходы при этом списывались бы с учётной записи владельца ключа.

Доступ к функциям Ruflo позволял запускать управляемые атакующим группы агентов. Такие агенты могли обращаться к подключённым инструментам и моделям в пределах разрешений скомпрометированной установки.

Отдельную опасность представляла MongoDB. В ней могли храниться пользовательские диалоги и другие данные платформы. Прежняя конфигурация публиковала базу на всех интерфейсах и не включала обязательную авторизацию.

Ruflo использует AgentDB для долговременной памяти. Платформа сохраняет шаблоны успешных действий, а затем возвращает их агентам при выполнении новых задач.

Атакующий мог записать в AgentDB вредоносный шаблон. При последующем обращении к памяти такая запись попадала в контекст и влияла на решения агентов. Подмена могла затрагивать будущие ответы всех пользователей одной установки.

Этот сценарий опаснее обычного удалённого выполнения команд из-за сохранения вредоносных данных. Обновление Ruflo закрывает уязвимый маршрут, но не удаляет ранее добавленные записи из AgentDB. Заражённая память может продолжить влиять на работу уже исправленной системы.

Noma Labs передала разработчикам отчёт 30 июня 2026 года вместе с рабочим примером атаки на стандартную установку. Исправление подготовили менее чем за сутки, а исследователи проверили новую конфигурацию. Версия 3.16.3 вышла 1 июля, запись CVE опубликовали 9 июля, технические подробности раскрыли 29 июля.

GitHub, выступающий центром нумерации CVE для этой записи, оценил CVE-2026-59726 в 10 баллов из 10 по шкале CVSS 3.1. Национальная база уязвимостей США NVD пока не опубликовала собственную оценку и отображает результат GitHub.

Вектор атаки обозначен как сетевой, сложность эксплуатации — низкая. Специальные права и действия пользователя не требовались. Возможное влияние на конфиденциальность, целостность и доступность признано высоким.

В карточке NVD перечислены три класса недостатков: внедрение команд операционной системы, отсутствие авторизации для критической функции и чрезмерно разрешительная политика межсайтового доступа.

Оценка CISA от 9 июля указывала, что уязвимость пригодна для автоматизированной эксплуатации и может привести к техническому ущербу. Подтверждённых атак на тот момент зафиксировано не было. 

Запись CVE относит к уязвимым все версии Ruflo ниже 3.16.3. Для описанной удалённой атаки требовалось развёртывание MCP-моста через проблемную конфигурацию Docker Compose и сетевой доступ к порту 3001.

Версия 3.16.3 привязывает MCP-мост и MongoDB к локальному адресу 127.0.0.1. Публикацию службы на всех сетевых интерфейсах теперь нужно включать вручную. При попытке открыть мост на адресе 0.0.0.0 без переменной MCP_AUTH_TOKEN приложение отказывается запускаться.

Токен проверяется на маршрутах MCP, Autopilot, управления MCP-серверами и совместимого с OpenAI интерфейса генерации. Для сравнения значений применяется функция с постоянным временем выполнения, которая уменьшает риск подбора токена через измерение задержек.

Инструмент terminal_execute отключён по умолчанию. Его необходимо отдельно разрешить переменной MCP_ENABLE_TERMINAL=true. Проверку перенесли в общий обработчик инструментов, через который проходят запросы к /mcp, /mcp/:group и Autopilot.

Разработчики включили обязательную авторизацию MongoDB, потребовали задавать пароль администратора перед запуском и перевели корневую файловую систему MCP-контейнера в режим чтения. Конфигурация также получила список разрешённых источников для межсайтовых запросов и автоматические проверки безопасных настроек. Изменения перечислены в описании Ruflo 3.16.3.

Владельцам установок с доступными портами 3001 или 27017 необходимо обновить Ruflo до версии 3.16.3 или более новой и закрыть эти порты от внешних подключений.

Ключи OpenAI, Anthropic, Google и OpenRouter, находившиеся в переменных окружения потенциально доступного контейнера, следует считать скомпрометированными. Их нужно отозвать и выпустить заново.

AgentDB требуется проверить на неизвестные записи agentdb_pattern-store, а MongoDB — на посторонние изменения и несанкционированный доступ к данным. Контейнеры безопаснее пересобрать из чистых образов. В запросе на включение исправления разработчики отдельно предупреждают, что повторное развёртывание обновлённой версии не очищает уже подменённую память.

Вопросы и ответы

Что такое CVE-2026-59726?
Критическая уязвимость MCP-моста Ruflo, позволявшая выполнять команды внутри контейнера без авторизации.

Получал ли атакующий права root?
Нет. Команды выполнялись от имени пользователя node внутри контейнера. Название RufRoot не описывает реальный уровень прав.

Затрагивает ли проблема Claude Code или Codex?
Нет. Уязвимость находилась в отдельной платформе Ruflo и её конфигурации Docker Compose.

Какие версии нужно обновить?
Все версии Ruflo ниже 3.16.3 считаются уязвимыми. Исправление включено в 3.16.3.

Можно ли ограничиться установкой обновления?
 Нет, если MCP-мост был доступен из сети. Необходимо заменить ключи, проверить MongoDB и удалить посторонние записи из AgentDB.

Есть новость? Станьте автором.

Мы сотрудничаем с независимыми исследователями и специалистами по кибербезопасности. Отправьте нам новость или предложите статью на рассмотрение редакции.