В открытой платформе оркестрации 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: аутентифицировать каждый запрос, ограничивать доступные инструменты по умолчанию и не открывать такой сервис в сеть без необходимости.
Ссылки