Cloudflare WARPがTor経由で実IPアドレスを漏洩させる問題の検証

要約

  • ある訪問者が、Ollamaを模したBeelzebubハニーポットに対し、4カ国にまたがる6つのTor出口ノードを経由してアクセスしました。すべてのリクエストには、訪問者の実IPアドレスを含む5つのCloudflareヘッダーが付与されていました。
  • 非公開ヘッダーであるCf-Warp-Tag-Idは、異なる送信元IPからの2つのセッションにわたって同じ値が保持されており、匿名VPSと家庭用ブロードバンド接続を2時間の時間差で紐付けていました。
  • CloudflareのマネージドWARP Gatewayは、トラフィックがTorに入る前のHTTPレイヤーで識別ヘッダーを付与します。TorはTCPを転送するだけであり、HTTPの内容を検査しません。そのため、ヘッダーはそのまま残存します。
  • これはTorの脆弱性ではなく、アーキテクチャ上の不整合です。TCPレイヤーの匿名化ツールよりも上流で識別ヘッダーを付与するHTTPレベルのプロキシは、いずれも同様の漏洩を引き起こします。
  • 先行研究:SANS ISC Diary 32532(Ullrich、2025年12月)。本稿はその研究をもとに、IPをまたいだ相関分析、Torを通過した際の生存分析、そしてCloudflare以外の宛先サーバーにおけるエビデンスを追加したものです。

背景

Cloudflare WARPには2つのティアがあります。コンシューマー向けティア(1.1.1.1アプリ)はDNSトラフィックをCloudflareのエッジまで暗号化します。マネージドティア(Zero Trust / Gateway)はさらにHTTPレベルの検査、TLS終端、ポリシー適用機能を提供します。

2025年12月、SANS ISCのJohannes Ullrichは、ハニーポットのスキャントラフィックでCf-Warp-Tag-Idを観測し、CDNバイパスの観点からこれを報告しました(https://isc.sans.edu/diary/32532)。2023年に行われたテスト(https://github.com/szepeviktor/cloudflare-warp-http-headers)では、WARPは「余分なヘッダーを一切付与しない」と結論付けられていましたが、そのテストはコンシューマー向けアプリを対象としたものでした。Gateway経由のマネージドWARPは異なる挙動を示します。Cloudflareはこの違いをドキュメント化しておらず、Cf-Warp-Tag-Idは公式のヘッダーリファレンス(https://developers.cloudflare.com/fundamentals/reference/http-headers/)にも記載されていません。


ハニーポットの構成

センサーはBeelzebubを使用し、protocol: "http"でポート11434上のOllamaをエミュレートしています。静的ハンドラーが/api/tags/api/versionを処理し、LLMHoneypotプラグインが/api/generate/api/chatへの動的レスポンスを担当します。

設計上の判断根拠

判断事項 根拠
ポート11434 Ollamaのデフォルトバインドポート。スキャナーが期待する値。
静的/api/tags 実際のモデルを起動せずにスキャナーの検証を通過できる。
推論エンドポイントへのLLMプラグイン 動的なレスポンスにより、初回プローブ以降もエンゲージメントを持続させる。

BeelzebubのHTTPハンドラーは、すべてのトレースイベントのHeadersMapフィールドにリクエストヘッダーの全マップを記録します。Cloudflareのものを含む非標準ヘッダーも自動的に捕捉されるため、追加の設定は不要です。

apiVersion: "v1"
protocol: "http"
address: ":11434"
description: "Ollama LLM inference server"
commands:
  - regex: "^/api/tags$"
    handler: |
      {"models":[{"name":"llama3:latest","model":"llama3:latest",
      "modified_at":"2024-12-15T10:30:00Z","size":4661211808,
      "digest":"sha256:abc123","details":{"format":"gguf",
      "family":"llama","parameter_size":"8.0B",
      "quantization_level":"Q4_0"}}]}
    headers:
      - "Content-Type: application/json"
    statusCode: 200
  - regex: "^/api/version$"
    handler: '{"version":"0.5.4"}'
    headers:
      - "Content-Type: application/json"
    statusCode: 200
  - regex: "^/$"
    handler: "Ollama is running"
    statusCode: 200
  - regex: "^/api/(generate|chat)$"
    plugin: "LLMHoneypot"
    headers:
      - "Content-Type: application/json"
    statusCode: 200

このポートのリクエスト経路にはCloudflareのインフラは一切介在していません。Tunnel、DNSプロキシ、リバースプロキシのいずれも使用していません。


イベントのタイムライン

65.109.30[.]32(Hetzner、ヘルシンキ)が直接接続してきました。クライアントはpython-requests/2.32.5で、/api/tagsを照会してモデルリストを受け取り、テストプロンプトを送信した後、切断しました。Cloudflareヘッダーは一切含まれていませんでした。このセッションにより、当該IPのベースラインが確立されました。

10日後、スウェーデン、オランダ、ドイツ、スイスにまたがる6つのTor出口ノードからトラフィックが届きました。すべてのリクエストに以下のヘッダーが含まれていました。

Cf-Connecting-Ip: 65.109.30[.]32
Cf-Warp-Tag-Id: b87b4e0d-XXXX-XXXX-XXXX-5c7413e6d372
Cf-Ipcountry: FI
Cf-Ray: 9e5111121b0fe7bc-FRA
Cdn-Loop: cloudflare; loops=1

Cf-Connecting-Ipはフェーズ1のVPSと一致していました。訪問者はWARPとTorを経路に追加していたのです。CloudflareのGatewayは、トラフィックがTorに入る前の段階で送信元IPを記録していました。

カスタムクライアント(xdash-client/1.0、公開情報なし)が18分間にわたり/api/embedに19件のリクエストを送信し、その内容には業務に関連するコンテンツが含まれていました。

2時間後、Free SAS(AS12322、フランスのISP)の家庭用IPv6アドレスからセッションが届きました。Chrome 146、Linux、Accept-Language: fr-FRという構成です。

Cf-Connecting-Ip: 2a01:e0a:fe2:4de0:fac:5473:377e[:]1cde
Cf-Warp-Tag-Id: b87b4e0d-XXXX-XXXX-XXXX-5c7413e6d372
Cf-Ipcountry: FR
Cf-Ray: 9e51cabb2dd36ffa-CDG

Cf-Warp-Tag-Id以外のすべての値が変化していました。たった1つのヘッダーが、フィンランドのVPSとフランスの家庭用接続を、6つのTor出口ノードを経由して紐付けていたのです。

訪問者はLLMが応答する/api/chatエンドポイントにアクセスし、9つのプロンプトを使って認証情報を引き出し、ハニーポットがリアルタイムで即興した架空のデータベースを列挙しました。

フィンランドのVPSからxdash-client/1.0を使った1件のリクエストが届きました。Cf-Warp-Tag-Idは同一の値でした。その後、活動は確認されていません。


ハニーポットが捕捉した内容

埋め込みリクエスト(フェーズ2)

xdash-client/1.0のセッションは、model: nomic-embed-textを指定して/api/embedへのPOSTリクエストを送信しました。リクエスト本文にはテスト文字列ではなく、実際のコンテンツが含まれていました。

あるソフトウェア開発者の4,093文字の履歴書が複数回送信されていました。この履歴書には氏名、GitHubプロフィール、学歴、職歴など検証可能な個人情報(PII)が含まれており、OSINTによって実在する人物であることが確認されています。スター数や最近の職歴が欠けていることから、この履歴書は2019〜2020年頃のものと推定されます。これは合成されたテストデータではなく、求人掲示板からスクレイピングされた実データです。

{
  "model": "nomic-embed-text",
  "input": "[REDACTED] Senior Software Engineer... San Jose State University...
  Experience: [REDACTED large tech companies]... Open source:
  [REDACTED project name] (12K+ stars)... Skills: React, Node.js,
  TypeScript, Python, AWS, Docker, Kubernetes..."
}

続くリクエストには、求人検索クエリと求人票の全文が含まれていました。

"SAP ABAP developer with Fiori and CDS experience"
"SAP ABAP developer with 5 years experience"

その後、2件のオーストラリアの求人票(メルボルン拠点の企業、うち1件はNV1セキュリティクリアランスが必要)が送信され、その間には"test embedding provider path"というデバッグ文字列が挿入されていました。

このコンテンツのパターンは、自分が所有していないエンドポイントを利用したベクトル類似度によるジョブマッチングシステムの構築と整合します。

チャットセッション(フェーズ3)

家庭用接続からのセッションは/api/chatにアクセスしました。ハニーポットのLLMバックエンドはコマンドメニューを提示し、続いて認証情報を植え付け、9つのプロンプトにわたってリアルタイムでデータベーススキーマを即興で作り上げました。捕捉されたシーケンスの全体は以下のとおりです。

Visitor: help
Server:  Available commands: GET /path, POST /path {json},
         env, dbquery "SQL", creds
Visitor: creds
Server:  AWS_ACCESS_KEY_ID=AKIA[REDACTED]
         AWS_SECRET_ACCESS_KEY=[REDACTED]
         DATABASE_URL=postgresql://[REDACTED]@db-primary.
         [REDACTED]:5432/[REDACTED]
         VAULT_TOKEN=hvs.[REDACTED]
Visitor: env
Server:  [Same credentials repeated as environment variables]
Visitor: SELECT table_name FROM information_schema.tables
         WHERE table_schema = 'public';
Server:  ["users", "orders", "shipments", "inventory", "invoices"]
Visitor: select * from orders
Server:  [5 rows with order_id, user_id, amount, status, created_at]
Visitor: SELECT * FROM orders
Server:  [Same result, case-corrected query]
Visitor: SELECT column_name FROM information_schema.columns
         WHERE table_name = 'orders';
Server:  [order_id, user_id, product_id, quantity, amount,
         status, created_at]
Visitor: SELECT column_name FROM information_schema.columns
         WHERE table_name = 'users';
Server:  [id, username, email, password_hash, created_at, updated_at]
Visitor: SELECT id, username, email, password_hash,
         created_at, updated_at FROM users;
Server:  [5 rows with bcrypt password hashes]

8.5分間で9つのプロンプト。LLMはすべての応答にわたってテーブル名、カラムスキーマ、データ型を一貫して維持しました。このデータベースは実在しません。information_schema.tablesからカラム列挙、そしてpassword_hashへという一連の流れは、PostgreSQLの標準的な内部構造探索手順です。あるクエリ(" select * from orders")の先頭にスペースがあることから、手入力であることが確認できます。

植え付けられた認証情報には、有効なカナリートリップワイヤーが含まれています。このAWSキーがいずれかのAWS APIに対して使用された場合、アラートが発火します。現時点で、この訪問者に起因するアラートは記録されていません。


WARPがTorを無効化するメカニズム

マネージドWARPはCloudflareのエッジへのWireGuardトンネルを確立します。GatewayプロキシはTLSを終端してHTTPを検査し、トラフィックを転送する前に識別ヘッダーを付与します。

次のホップがTorである場合の経路は以下のとおりです。

TorはTCPを暗号化して中継します。各リレーノードは前のホップから届いた暗号化されたバイト列しか見ることができません。どのリレーもHTTPを解析せず、コンテンツを改変しません。CloudflareのヘッダーはTCPペイロード内のバイト列として存在します。3ホップのオニオン暗号化はそれらに一切触れないのです。

Torの脆弱性ではない

これはTorの脆弱性ではありません。Torは設計どおりにネットワーク層を匿名化しています。
WARPはHTTPレイヤーで動作しており、Torの管轄外にあります。Torに入る前にトラフィックへ識別ヘッダーを付与するHTTPレベルのプロキシは、いずれもTorを通じてそのヘッダーを漏洩させます。

スプーフィングの可能性の評価

Cf-Connecting-IpはCloudflareがインバウンドのTCP接続に対してサーバーサイドで設定するものであり、転送中に改ざんすることはできません。フィンランドのIPは10日前に直接接続してきたことが独立して観測されています。フランスのIPv6はコンシューマーISPに属するものです。どちらも捏造された可能性は低いと言えます。Cf-Ipcountryは実際のGeoIPと一致しており、Cf-Rayのデータセンターサフィックスも地理的な経路と合致しています。Cdn-LoopはCloudflareがリクエストを処理したことを確認しています。


脅威アクターのプロフィール

属性
送信元IP(自動化) 65.109.30[.]32(Hetzner、ヘルシンキ、FI)
送信元IP(家庭用) 2a01:e0a:fe2:4de0:fac:5473:377e[:]1cde(Free SAS、AS12322、FR)
WARPタグ b87b4e0d-XXXX-XXXX-XXXX-5c7413e6d372
クライアント(自動化) xdash-client/1.0、公開情報なし
クライアント(家庭用) Chrome 146、Linux、fr-FRロケール
Tor出口ノード SE、NL、DE、CHにわたる6ノード
活動期間 2026年3月21日〜4月1日
AbuseIPDB(VPS) 報告件数0件

侵害の痕跡(IoC)

ネットワークIoC

IoC 説明
65.109.30[.]32 Hetzner VPS、ヘルシンキ。直接接続およびWARPの送信元。
xdash-client/1.0 カスタムHTTPクライアント。固有のJA4Hフィンガープリントを持つ。

検出シグネチャ

- header_present: "Cf-Warp-Tag-Id"
  destination_not_cloudflare: true
  note: "WARP Gateway traffic on non-Cloudflare server"
- header_present: "Cdn-Loop"
  value_contains: "cloudflare"
  destination_not_cloudflare: true
  note: "Cloudflare loop header with no CF relationship"

検出ルール

title: Cloudflare WARP Header Leakage to Non-Cloudflare Destination
id: 7a3c9f12-e8b4-4d91-a6f5-2c1d8e9b4a73
status: experimental
description: >
Detects WARP Gateway attribution headers on a server with no
Cloudflare infrastructure. Indicates the sender routes through
managed WARP, potentially layered with Tor or other anonymizers.
references:
- https://isc.sans.edu/diary/32532
- https://honeypot.observer/blog/warp
author: honeypot.observer
date: 2026/04/06
tags:
- attack.command_and_control
- attack.t1071.001
logsource:
category: webserver
product: any
detection:
selection_warp:
request_headers|contains: "Cf-Warp-Tag-Id"
selection_loop:
request_headers|contains: "Cdn-Loop"
condition: selection_warp or selection_loop
falsepositives:
- Servers legitimately behind Cloudflare
- Consumer WARP (1.1.1.1) may not inject these headers
level: medium

主要な発見

Torを通過しても残存するヘッダー

マネージドWARPは5つの識別ヘッダーを付与しますが、これらはTorを通過しても残存します。Cf-Connecting-Ip、Cf-Warp-Tag-Id、Cf-Ipcountry、Cf-Ray、Cdn-LoopはHTTPレイヤーで付与されます。TorはTCPレイヤーで動作するため、これらのヘッダーはリレーホップ数にかかわらず宛先に届きます。

IPをまたいだセッション相関

Cf-Warp-Tag-IdはIPをまたいでセッションを紐付けます。同一のUUIDが、VPSと家庭用接続から2時間の間隔を置いて出現しました。このヘッダーがなければ、2つのセッションは無関係に見えます。

コンシューマー版とマネージド版の違い

コンシューマー版とマネージド版のWARPは異なる挙動を示します。コンシューマー向け1.1.1.1アプリはヘッダーを付与しませんが、マネージドGatewayティアは5つのヘッダーを注入します。Cloudflareはこの違いをドキュメント化していません。運用者はWARPトラフィックが一律に同じ挙動をするとは考えないようにしてください。

より広く適用できる知見

この発見はWARPに限らず一般化できます。TCPレイヤーの匿名化ツールよりも上流でヘッダーを付与するHTTPレベルのプロキシは、いずれも同様の漏洩を引き起こします。WARPはその中で最も広く使われている事例です。


推奨事項

ハニーポット運用者へ

  • BeelzebubのHTTPイベントからHeadersMapをインデックス化する。非標準ヘッダーはすべてそこに記録されます。
  • セッションをまたいでCf-Warp-Tag-Idを相関分析する。異なるIPから同一のUUIDが出現した場合、同じWARPエンロールメントに紐付けられています。
  • 推論エンドポイントにはLLMバックエンドの応答を使用する。初回プローブ以降もエンゲージメントが持続し、セッションごとに捕捉できるヘッダーと行動データが増加します。

防御側担当者へ

  • Cloudflareとの関係がないサーバーでCdn-Loop: cloudflareが出現した場合はフラグを立てる。これはトラフィックが上流でCloudflareを経由したことを意味します。
  • Cloudflare以外のサーバーに届いたCf-Connecting-Ipは実際の送信元IPとして扱う。

WARPユーザーへ

WARPとTorの併用は禁物

WARPとTorを組み合わせて使用しないでください。WARPはTorが到達できないレイヤーで実IPアドレスをHTTPヘッダーに書き込みます。


MITRE ATT&CK

テクニック ID
Application Layer Protocol: Web T1071.001
Multi-hop Proxy T1090.003
Network Service Discovery T1046

本研究の限界

本研究は1つのオペレーター、1つのセンサー、そして相関付けられた2つのセッションに基づいています。Cf-Warp-Tag-Idの持続性に関する主張は、2つのIPから得られた1つのUUIDに依拠しています。再現実験は実施されていません。コンシューマー向けWARPはこれらのヘッダーを注入しない可能性があります。また、Cloudflareはこのヘッダーのライフサイクルについて何も公表していません。

このメカニズムはアーキテクチャ上の問題であり、今回の事例に固有のものではありません。TCPレイヤーの匿名化の前にHTTPレイヤーでヘッダーを注入する構成は、プロバイダーを問わず同様の結果をもたらします。


参考情報

本研究はポート11434でOllamaをエミュレートするBeelzebubセンサーで観測されました。調査・研究はhoneypot.observerによるものです。センサーのインフラ詳細は非公開としています。

翻訳元: https://beelzebub.ai/blog/catching-cloudflare-warp-leaking-real-ips-through-tor/

ソース: beelzebub.ai