CVE-2026-33017

CVE-2026-33017

NVD 詳細

概要

Langflow CVE-2026-33017(CVSS 9.3)— 同じexec()呼び出しで2度ハック

言及日

脆弱性情報(NVD)

影響を受けるバージョン:

概要(日本語): CVE: CVE-2026-33017
説明: Langflowは、AIを活用したエージェントやワークフローを構築およびデプロイするためのツールです。1.9.0より前のバージョンでは、POST /api/v1/build_public_tmp/{flow_id}/flow エンドポイントが認証を必要とせずにパ

原文: Langflow is a tool for building and deploying AI-powered agents and workflows. In versions prior to 1.9.0, the POST /api/v1/build_public_tmp/{flow_id}/flow endpoint allows building public flows without requiring authentication. When the optional data parameter is supplied, the endpoint uses attacker-controlled flow data (containing arbitrary Python code in node definitions) instead of the stored flow data from the database. This code is passed to exec() with zero sandboxing, resulting in unauthenticated remote code execution. This is distinct from CVE-2025-3248, which fixed /api/v1/validate/code by adding authentication. The build_public_tmp endpoint is designed to be unauthenticated (for public flows) but incorrectly accepts attacker-supplied flow data containing arbitrary executable code. This issue has been fixed in version 1.9.0.

VulnCheck KEV

PoC / Exploit

悪用事例

参考リンク

技術詳細

脆弱性の概要

本脆弱性は、LangflowのPOST /api/v1/build_public_tmp/{flow_id}/flowエンドポイントに認証が欠落しており(CWE-306)、かつリクエストのdataパラメータで渡された攻撃者のフローデータ(ノード定義に任意のPythonコードを含む)がサンドボックスなしのexec()に直接渡されることで、認証前のリモートコード実行(RCE)が可能となるものです(CWE-94, CWE-95)。

根本原因

dataパラメータが指定された場合、エンドポイントはデータベース上の保存済みフロー情報の代わりに攻撃者制御のフローデータを使用します。このフローデータ内のノード定義(Pythonコードを含むフィールド)が、安全な評価機構を一切経由せずにexec()へ渡される設計上の欠陥に起因します。加えて、当該エンドポイントは認証チェックを行わずに公開されており、外部からの直接的な攻撃を許容していました。

攻撃シナリオ

  1. 攻撃者は有効なflow_idを推測または列挙します(公開フローIDの推測、あるいはタイミング攻撃等)。
  2. 攻撃者はPOST /api/v1/build_public_tmp/{flow_id}/flowに対して、Content-Type: application/jsonで、dataキーを含むJSONペイロードを送信します。このdata内に、ノード定義の一部として任意のPythonコード(例:OSコマンドを実行するコード)を埋め込みます。
  3. サーバがリクエストを受信し、data内のノード定義を解析、含まれるコード片をexec()で実行します。サンドボックス機構が存在しないため、任意のシステムコマンドがサーバ権限で実行され、リモートコード実行が成立します。

検出方法

ブラックボックステスト

以下のcurlコマンドを用いて、対象サーバにRCEが発生するか検証できます。

curl -X POST "https://target.example.com/api/v1/build_public_tmp/test-flow-id/flow" \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "nodes": [
        {
          "id": "node-1",
          "data": {
            "template": {
              "code": "__import__(\"os\").system(\"id > /tmp/pwned.txt\")"
            }
          }
        }
      ]
    }
  }'

確認ポイント:

ホワイトボックステスト

  1. ソースコード内のルーティング定義を検索し、当該エンドポイントのデコレータに認証要求(例:@login_required)が付与されていないことを確認する。
    grep -r "build_public_tmp" ./src/
    
  2. エンドポイント内でdataパラメータが処理され、データベースの値より優先されてノード構築に使われる分岐を特定する。
    grep -rn "exec(" ./src/backend/
    
  3. exec()に渡される引数が、攻撃者入力に由来するノード定義のコード片を含んでいることを確認する。特に、サンドボックス化処理(ast.literal_evalや制限付きグローバル等)が一切行われていないことをコードパスから検証する。

対策

恒久的対策

Langflow 1.9.0以降にアップグレードすることで修正が適用されます。当該バージョンでは、エンドポイントに適切な認証が追加され、かつexec()への信頼できないコードの受け渡しが防止されています。
アップグレードコマンド例:

pip install --upgrade langflow==1.9.0

Dockerを利用している場合は、イメージタグを1.9.0以降に変更し再デプロイしてください。

暫定対策

即時のバージョンアップが困難な場合、以下の軽減策を実施します。