
RufRoot: один неаутентифицированный запрос к MCP-мосту Ruflo выполнил команды, украл ключи и отравил память ИИ
- OrcaНОВИНКАOrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29101 tok/s
- OrcaНОВИНКАOrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 за 1 млн токенов · 103 tok/s
- OrcaНОВИНКАOrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 за 1 млн токенов · 282 tok/s
- OrcaНОВИНКАOrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 за 1 млн токенов · 93 tok/s
- MoonshotНОВИНКАMoonshotAI: Kimi K3.1 Pro2026-10-2446Интеллект
- OrcaНОВИНКАOrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 за 1 млн токенов · 106 tok/s
- minimaxНОВИНКАMiniMax: M3.1 Flash2026-10-1929Интеллект
- OrcaНОВИНКАOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 за 1 млн токенов · 70 tok/s
- deepseekНОВИНКАDeepSeek: DeepSeek V4.1 Flash 10172026-10-1733Интеллект
- DeepSeekНОВИНКАDeepSeek: DeepSeek V4.1 Flash2026-10-1740Интеллект
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 за 1 млн токенов · 95 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955Интеллект
- anthropicAnthropic: Claude Sonnet 5.52026-09-2854Интеллект
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 за 1 млн токенов · 168 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228Интеллект
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Интеллект
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Интеллект
- xiaomiXiaomi: MiMo-V2.6-Flash2026-09-2127Интеллект
- xiaomiXiaomi: MiMo-V2.6-Pro2026-09-2130Интеллект
- xAIGrok 4.72026-09-2134Интеллект
В 30 июня 2026 года, Noma Labs передала мейнтейнеру Ruflo рабочий эксплойт против самого проекта. Исследовательское подразделение Noma Security выяснило, что Ruflo — платформа оркестрации агентов с открытым исходным кодом, ранее выпущенная под названием Claude Flow — поставлялась со стандартной конфигурацией развёртывания Docker Compose, в которой её Model Context Protocol мост был привязан к порту 3001 на всех сетевых интерфейсах и вообще не требовал аутентификации. Одного HTTP-запроса к эндпоинту /mcp было достаточно, чтобы выполнить shell-команды внутри контейнера от пользователя node, и из этой оболочки злоумышленник мог прочитать все API-ключи LLM-провайдеров в окружении, выгрузить все сохранённые диалоги, запустить рои агентов, оплачиваемые за счёт ключей жертвы, и записать инструкции в хранилище обучения AgentDB, которые продолжали бы направлять ответы ИИ для каждого пользователя этого экземпляра. Уязвимость — CVE-2026-59726, получившая название RufRoot, оценена в CVSS 10.0 и исправлена в 3.16.3 в течение 24 часов. Ни один из прочитанных нами источников не сообщает о её эксплуатации в реальных атаках. Собственная запись архива об этой уязвимости, со списком источников и оценкой достоверности, находится в архиве инцидентов ИИ, рядом с другими записями об MCP и инфраструктуре, размещёнными вокруг неё.
Дефолт, который открыл дверь
Ruflo — это то, что Noma Labs называет мета-каркасом для агентов: самостоятельно размещаемый слой для роёв до 100 агентов, созданный для Claude Code и OpenAI Codex, с долговременной памятью и встроенным MCP-сервером для вызова инструментов. Обычная установка — та, что описывает Noma: клонируйте репозиторий, добавьте ключи API LLM, выполните docker compose up -d. Файл compose по умолчанию в проекте привязывал мост к 0.0.0.0 на порту 3001 и привязывал сопутствующий экземпляр MongoDB ко всем интерфейсам на 27017, с отключённой аутентификацией Mongo. Насколько широко это распространяется, зависит от брандмауэра, группы безопасности и сетевой сегментации вокруг развёртывания; по формулировке самой Noma, любой экземпляр, доступный по сети, был полностью эксплуатируем без аутентификации.
MCP Bridge — это сервер Express.js, который преобразует JSON-RPC-запросы, поступающие по HTTP, в вызовы к внутренней библиотеке инструментов Ruflo. В уязвимой строке эта библиотека содержала 233 инструмента, которые охватывают доступ к оболочке, операции с базами данных, управление агентами и хранение в памяти. В материале Noma без обиняков сказано, что это означает: «MCP Bridge — не случайный вспомогательный отладочный интерфейс; скорее, это центральная нервная система Ruflo. Каждый вызов инструмента, каждое действие агента, каждая операция с памятью проходит через MCP Bridge».
Слой аутентификации отсутствовал, а не был просто слабым. POST /mcp и POST /mcp/:group реализуют протокол MCP JSON-RPC и передают входящие запросы tools/call напрямую во внутреннюю функцию executeTool(). В Ruflo действительно имелся блок-лист команд, AUTOPILOT_BLOCKED_PATTERNS, предназначенный для остановки опасных операций оболочки, но в GitHub advisory прямо указано, что он «применялся только в потоке autopilot. POST /mcp и POST /mcp/:group обходили его». Таким образом, один неаутентифицированный вызов с именем ruflo__terminal_execute выполнял произвольные команды от имени пользователя node контейнера, записанного в рекомендации GitHub как uid 1000, без необходимости токена, сеанса или предварительного взаимодействия. Для последующего не требовалось повышения привилегий: учётные данные, API агентов, хранилище памяти и база данных были доступны из этой оболочки.
Цепочка в восьми шагах
Noma Labs опубликовала proof of concept из восьми шагов и подтвердила каждый шаг в реальном времени на развертывании Ruflo по умолчанию в AWS EC2, используя внеполосные обратные вызовы к Burp Collaborator для проверки выполнения и эксфильтрации. Эти шаги — не умозрительные последствия, надстроенные над теоретической уязвимостью; это продемонстрированная последовательность, и раздел рекомендаций по устранению в бюллетене написан для операторов, которые, возможно, уже находятся внутри неё.

Разведка идёт первой, потому что список инструментов доступен любому вызывающему: tools/list возвращает все 233 записи без учётных данных. Выполнение команд следует из той же конечной точки, и proof-of-concept от Noma подтвердил это с помощью внеполосного обратного вызова, а не на основании вывода из тела ответа. Шаг с окружением — это тот, который превращает компрометацию хоста в проблему выставления счетов и потери данных: файл compose передавал ключи провайдера в контейнер, а серверные процессы наследовали полное окружение через { ...process.env }, поэтому один printenv вывел их. Затем эти ключи позволили ruflo__swarm_init и ruflo__agent_spawn запустить контролируемые атакующим рои, которые израсходовали квоту и вычислительные ресурсы жертвы.
Пятый шаг — тот, что переживает вторжение. Используя ruflo__agentdb_pattern-store, Noma внедрила сфабрикованную политику соответствия SOC2, которая предписывала ИИ встраивать контролируемый злоумышленником URL в каждый скрипт развертывания, который он впоследствии создавал. Поскольку AgentDB существует именно для того, чтобы сохранять подобные паттерны и поведение агента улучшалось от сессии к сессии, внедренная запись вела себя так, как система и была задумана. «В будущих диалогах выходные данные будут формироваться под влиянием злоумышленника, и пользователь никак не сможет это распознать», — говорится в отчете Noma. Издание Dark Reading, сообщившее об уязвимости 29 июля, попросило внешнего эксперта пояснить это различие: Джон Галлахер, вице-президент Viakoo, назвал это проблемой иного класса: «Это не эксплуатация недостатков программного обеспечения, это отравление памяти».
Остальные шаги — это стандартная постэксплуатация, выполненная с необычным удобством. MongoDB во внутренней сети Docker не имела аутентификации, поэтому злоумышленники установили клиент в /tmp, выгрузили переписку и отправили её наружу. Для закрепления они записали /app/beacon.js, добавили строку require('./beacon.js') в index.js и убили PID 1, после чего политика перезапуска Docker вернула контейнер к жизни с активным маячком. Последним шагом было очищение истории командной оболочки. Всё это стало следствием одного неаутентифицированного запроса; ничто в конфигурации по умолчанию не остановило цепочку ни на одном этапе.
Исправление — и то, до чего не дотянется патч
Мейнтейнер выпустил Ruflo 3.16.3 в течение 24 часов после раскрытия информации 30 июня, а GitHub опубликовал рекомендацию GHSA-c4hm-4h84-2cf3 1 июля 2026 года. Исправление, отслеживаемое в репозитории как ADR-166 и объединённое в пул-реквесте 2521, меняет значения по умолчанию, а не просто добавляет проверку:
• MCP-мост по умолчанию привязывается к 127.0.0.1; публичная привязка требует MCP_AUTH_TOKEN, а при отсутствии токена процесс завершается при запуске с фатальным сообщением.
• Промежуточное ПО для Bearer-токена со сравнением за постоянное время находится перед мостом.
• terminal_execute ограничен на стороне сервера флагом MCP_ENABLE_TERMINAL=true, по умолчанию выключен, и это ограничение одинаково применяется к /mcp, /mcp/:group и потоку автопилота — недостающее звено, которое позволяло раскрытой цепочке достичь оболочки.
• Для MongoDB требуется аутентификация, а для запуска контейнера необходим root-пароль.
• Контейнер bridge работает с корневой файловой системой, доступной только для чтения, с tmpfs; список разрешённых источников CORS заменяет wildcard, а регрессионные «замки» CI охватывают как статическую конфигурацию, так и поведение в рантайме.
Ничто из этого не удаляет запись, уже внесённую в AgentDB. Рекомендация предписывает операторам любого открытого экземпляра немедленно закрыть порты 3001 и 27017 с помощью межсетевого экрана, сменить ключи провайдера, провести аудит хранилища паттернов на наличие внедрённых agentdb_pattern-store записей и удалить их, провести аудит MongoDB на предмет несанкционированного вмешательства и пересобрать контейнеры из чистых образов. Её предупреждение необычно прямое: «Повторное развёртывание с исправлением само по себе НЕ отменяет отравление». В отчёте Noma делается тот же вывод — аудит хранилища паттернов является частью устранения последствий, а исправление — нет.
Причина структурная, а не небрежность. Хранилище паттернов, которое формирует будущий вывод модели, не имеет способа отличить законную усвоенную инструкцию от внедрённой злоумышленником; и то и другое поступает в виде паттернов, а система построена так, чтобы доверять им. Это превращает сетевую уязвимость в проблему целостности данных с неизвестным накопленным объёмом, и это означает, что оператору важно выяснить не только, был ли порт доступен, но и что сейчас содержится в памяти.

Что установлено, а что — нет
Техническая запись здесь является первичной и согласованной. В уведомлении указан затронутый пакет (npm ruflo ниже версии 3.16.3), исправленная версия, точные конечные точки, пользователь контейнера и два порта; примечания к выпуску сопровождающего описывают ту же цепочку; публикация Noma предоставляет подробности доказательства концепции; а независимые издания — The Hacker News и Dark Reading 29 июля 2026 года, SecurityWeek 30 июля — сообщают о том же механизме, не добавляя противоречивых подробностей. Исследовательская заметка Cloud Security Alliance от 5 августа 2026 года повторяет последовательность и помещает её рядом с более ранними уязвимостями неаутентифицированных MCP и оркестрации агентов, которые она отслеживала. Архив присваивает записи уровень уверенности A, бесспорный, и отмечает её как веху; его оценка серьёзности для записи — высокая, отличная от самой оценки CVSS.
Одну деталь оценки стоит изложить точно, поскольку два основных документа расходятся. GHSA-c4hm-4h84-2cf3 имеет оценку CVSS 10.0 по вектору AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — именно изменение области действия выводит её на максимум. Копия того же уведомления на странице релиза 3.16.3 описывает оценку как «критическую — CVSS 9.8». Запись в National Vulnerability Database, проверенная 30 октября 2026 года, опубликованная 9 июля 2026 года и помеченная как Отложено, содержит оценку GitHub 10.0 в качестве вторичной метрики и не имеет собственной оценки, подготовленной NVD. Мы не нашли объяснения для строки 9.8, и этот материал не разрешает этот вопрос.
Показатели внедрения скромнее. Noma Labs на тот момент описывала проект как имеющий более 67 000 звёзд на GitHub, около 10 млн скачиваний и примерно 1 млн активных пользователей; The Hacker News, как резюмировал Cloud Security Alliance, приводил более 66 500 звёзд. Счётчики скачиваний и пользователей принадлежат самой Noma и независимо не проверялись. Количество звёзд репозитория на 30 октября 2026 года составляло 80 198 — это показатель охвата проекта, а не мера экспонирования, и ни один источник не опубликовал, сколько развёртываний на самом деле было доступно из сети.

То, что не установлено, — это как раз та часть, которую проще всего раздуть. Ни Noma, ни сопровождающий, ни любое издание, которое мы читали, не утверждают, что уязвимость эксплуатировалась в реальных атаках, и в архиве по этой записи не зафиксировано реального ущерба. Proof of concept от Noma запускался на развёртывании, которое исследователи контролировали на EC2; это показывает, что допускает установка по умолчанию, а не то, что пострадал какой-либо конкретный производственный экземпляр. Не опубликовано никаких данных о количестве развёртываний Ruflo, доступных из интернета, и ни один оператор не опубликовал результаты аудита AgentDB, поэтому и численность затронутой популяции, и объём существующей отравленной памяти неизвестны. Рекомендация Cloud Security Alliance считать открытые развёртывания полностью скомпрометированными — это позиция по рискам, оправданная эксплуатацией без взаимодействия; это не доказательство того, что компрометация произошла.
Почему архив отмечает это как веху
Знаковый флаг архива опирается на нечто более конкретное, чем максимальная оценка. Уязвимость удаленного выполнения кода с оценкой CVSS 10.0 в популярном сервисе для самостоятельного размещения — это привычная история, и исправление здесь появилось в течение 24 часов. RufRoot отличается тем, что эксплуатация завершалась в собственном обучающем конвейере ИИ, где обычные меры — обновить, развернуть заново, закрыть порт — оставляют внедренную инструкцию на месте, и она продолжает формировать ответы. В заметке Cloud Security Alliance это рассматривается как практический пример паттерна, который она уже документировала в инструментах для агентов, включая цепочку контрольных точек LangGraph и неаутентифицированную поверхность AutoGen Studio, и утверждается, что постоянную память, используемую для формирования поведения агента, следует рассматривать как хранилище конфиденциальных данных, подлежащее мониторингу целостности, а не как кэш.
Такая переформулировка — это практический вывод. Видимый артефакт этого инцидента — исправленная зависимость и опубликованное уведомление; невидимый — тот паттерн, который всё ещё может содержаться в AgentDB оператора, и не существует опубликованного инструмента или сигнатуры, позволяющих отличить законную изученную политику от внедрённой. Для организаций, запускавших стандартный compose-файл за доступной сетью, полезный ответ — тот, который дают и Noma, и уведомление: считайте, что ключи были прочитаны, смените их и проверьте память, прежде чем доверять ответам, которые она выдаёт.
