Уязвимость в AI-оркестраторе Ruflo позволяет удалённо выполнить код без аутентификации

Ruflo

В открытой платформе оркестрации AI-агентов Ruflo обнаружена ошибка, получившая максимальный балл опасности по шкале CVSS - 10.0. Уязвимость CVE-2026-59726, названная исследователями RufRoot, затрагивает компонент MCP Bridge - Express.js-сервер, отвечающий за вызов инструментов в рабочих процессах агентов. Для эксплуатации достаточно одного HTTP-запроса без аутентификации.

Уязвимость CVE-2026-59726

Проблему выявила компания Noma Labs. MCP Bridge по умолчанию открывает 233 высокопривилегированных инструмента через HTTP без какой-либо проверки подлинности. Среди них - функция "ruflo__terminal_execute", позволяющая выполнять произвольные команды оболочки внутри контейнера. Установка Ruflo по умолчанию привязывает порт 3001 ко всем сетевым интерфейсам ("0.0.0.0"), что делает конечную точку "/mcp" доступной из любого сегмента сети.

Стандартный Docker-компонент "docker-compose.yml" явно задаёт публичную привязку. Это означает, что любое инстанцирование, доступное по сети, может быть скомпрометировано без аутентификации - не требуется ни токен, ни ключ API, ни IP-фильтр. Внутри контейнера выполнение команд происходит от имени пользователя "node" (UID 1000), но это не является серьёзным ограничением: переменные окружения содержат ключи API к провайдерам языковых моделей (OpenAI, Anthropic, Google, OpenRouter и др.), а внутренняя база данных MongoDB запускается без аутентификации.

Исследователи продемонстрировали полную цепочку атаки на реальном развёртывании Ruflo в AWS EC2. После первоначального выполнения команды через терминальный инструмент злоумышленник может:

  • перечислить все доступные инструменты через вызов "tools/list";
  • извлечь переменные окружения командой "printenv", получив ключи API к LLM-провайдерам;
  • используя украденные ключи, развернуть собственные рои агентов через функции "ruflo__swarm_init" и "ruflo__agent_spawn";
  • отравить память AI-агентов, записав подложные шаблоны в хранилище "agentdb", что повлияет на будущие ответы и рабочие процессы;
  • получить доступ к MongoDB в той же сети Docker (без аутентификации) и извлечь все диалоги, заголовки, метаданные;
  • закрепиться в системе, создав файл-маяк в каталоге "/app" и модифицировав точку входа ("index.js") для автоматической загрузки вредоносного кода при перезапуске контейнера (политика "restart: unless-stopped").

Каждый этап был подтверждён с помощью вызовов OAST (внеполосных callback) к Burp Collaborator. Очистка истории команд завершает сценарий практически без следов.

Уязвимость привлекла внимание к феномену теневого искусственного интеллекта (Shadow AI) - когда мощные AI-системы разворачиваются без должного контроля безопасности. Ruflo, насчитывающий десятки тысяч звёзд на GitHub и около 10 миллионов загрузок, часто устанавливается простой командой "docker compose up -d". Эта простота увеличивает вероятность появления небезопасных конфигураций, открытых в интернет.

Разработчики Ruflo отреагировали оперативно: в течение нескольких часов после ответственного раскрытия информации был выпущен патч (PR #2521), опубликован бюллетень безопасности (GHSA-c4hm-4h84-2cf3) и принято решение по архитектуре безопасности ADR-166. Исправления включают:

  • привязку MCP Bridge к петлевому интерфейсу (localhost) по умолчанию; при попытке публичной привязки без установки токена MCP_AUTH_TOKEN сервер не запустится;
  • обязательную аутентификацию через bearer-токен с константным временем сравнения;
  • отключение терминального выполнения ("ruflo__terminal_execute") по умолчанию - его активация требует явного флага "MCP_ENABLE_TERMINAL=true";
  • требование аутентификации для MongoDB при запуске;
  • перевод корневой файловой системы контейнера в режим только для чтения с монтированием tmpfs для временных данных;
  • ограничение CORS белым списком вместо подстановочного знака;
  • внедрение регрессионных тестов CI для предотвращения повторного появления проблемных настроек по умолчанию.

Организациям, использующим Ruflo, рекомендуется немедленно закрыть доступ к портам 3001 и 27017 на межсетевых экранах, сменить все связанные ключи API, проверить хранилище шаблонов AgentDB на предмет внедрённых записей (простой перезапуск с патчем не удаляет уже внедрённые данные), а также провести аудит логов MongoDB и поведения агентов на предмет необычных вызовов инструментов.

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

Ссылки

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