CloudflareのWARPがTor経由で実IPをリークするのをキャッチ

TL;DR

  • 訪問者がOllamaをエミュレートするBeelzebubハニーポットに6つのTor出口ノード経由でアクセスしました。すべてのリクエストには、訪問者の実IPを含む5つのCloudflareヘッダーが含まれていました。
  • 未文書化のヘッダーCf-Warp-Tag-Idは2つのセッションから2つの異なるソースIPにまたがって保持され、2時間離れた匿名VPSと住宅用ブロードバンド接続をリンクしています。
  • CloudflareのマネージドWARP Gatewayは、トラフィックがTorに入る前にHTTPレイヤーで帰属ヘッダーを注入します。Torはトランスポート層がTCPであり、HTTPコンテンツを検査しません。ヘッダーはそのまま保持されます。
  • これはアーキテクチャの不一致であり、Torの脆弱性ではありません。TCP層の匿名化ツールの上流でHTTPレベルの識別ヘッダーを付与するHTTPプロキシであれば、すべてこのようにリークします。
  • 先行技術: SANS ISC Diary 32532(Ullrich、2025年12月)。本記事はこの研究を拡張し、IP間の相互相関、Tor生存分析、およびCloudflare以外の宛先からの証拠を含めています。

背景

Cloudflare WARPは2つのティアで提供されます。コンシューマティア(1.1.1.1アプリ)はCloudflareエッジへのDNSトラフィックを暗号化します。マネージドティア(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/)。


ハニーポットの設定

センサーはポート11434でOllamaをエミュレートするprotocol: "http"でBeelzebubを実行します。スタティックハンドラーは/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推論サーバー"
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が実行中です"
    statusCode: 200
  - regex: "^/api/(generate|chat)$"
    plugin: "LLMHoneypot"
    headers:
      - "Content-Type: application/json"
    statusCode: 200

ポートはリクエストパスにCloudflareインフラストラクチャがありません。トンネルなし、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のゲートウェイはトラフィックが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つのプロンプトで認証情報を抽出し、ハニーポットがリアルタイムで即興したデータベースを列挙するのに費やしました。

xdash-client/1.0を使用したフィンランドのVPSからの1つのリクエスト。同じCf-Warp-Tag-Id。それ以上の活動はありません。


ハニーポットがキャプチャしたもの

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

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

4,093文字のソフトウェア開発者の履歴書が複数回送信されました。履歴書には検証可能なPII(名前、GitHubプロフィール、教育、雇用歴)が含まれています。OSINTは個人が存在することを確認しています。履歴書はスター数と欠落した最近の職位に基づいて2019年から2020年頃のものです。これは合成テストコンテンツではなく、スクレイピングされたジョボードデータです。

{
  "model": "nomic-embed-text",
  "input": "[削除済み] シニアソフトウェアエンジニア... San Jose State University...
  経歴: [削除済み大手テック企業]... オープンソース:
  [削除済みプロジェクト名] (12K+スター)... スキル: React、Node.js、
  TypeScript、Python、AWS、Docker、Kubernetes..."
}

後続のリクエストには職務検索クエリとフル職位リストが含まれていました:

"FioriとCDS経験を持つSAP ABAPデベロッパー"
"5年の経験を持つSAP ABAPデベロッパー"

その後、オーストラリアの2つのジョブリスト(メルボルンベースの企業、1つはNV1セキュリティクリアランスが必要)が続きました。これらの間に、デバッグ文字列があります: "テスト埋め込みプロバイダーパス"

コンテンツパターンは、訪問者が所有していないエンドポイントでベクトル相似性ジョブマッチングシステムを構築することと一致しています。

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

住宅用セッションが/api/chatに次々とアクセスしました。ハニーポットのLLMバックアップレスポンスハンドラーはコマンドメニューを提供し、認証情報をプラント種し、その後9つのプロンプトにわたってデータベーススキーマを即興しました。完全なキャプチャシーケンス:

訪問者: ヘルプ
サーバー:  利用可能なコマンド: GET /path、POST /path {json}、
         env、dbquery "SQL"、creds
訪問者: creds
サーバー:  AWS_ACCESS_KEY_ID=AKIA[削除済み]
         AWS_SECRET_ACCESS_KEY=[削除済み]
         DATABASE_URL=postgresql://[削除済み]@db-primary.
         [削除済み]:5432/[削除済み]
         VAULT_TOKEN=hvs.[削除済み]
訪問者: env
サーバー:  [環境変数として繰り返される同じ認証情報]
訪問者: SELECT table_name FROM information_schema.tables
         WHERE table_schema = 'public';
サーバー:  ["users"、"orders"、"shipments"、"inventory"、"invoices"]
訪問者: select * from orders
サーバー:  [order_id、user_id、amount、status、created_atを持つ5行]
訪問者: SELECT * FROM orders
サーバー:  [同じ結果、大文字小文字が修正されたクエリ]
訪問者: SELECT column_name FROM information_schema.columns
         WHERE table_name = 'orders';
サーバー:  [order_id、user_id、product_id、quantity、amount、
         status、created_at]
訪問者: SELECT column_name FROM information_schema.columns
         WHERE table_name = 'users';
サーバー:  [id、username、email、password_hash、created_at、updated_at]
訪問者: SELECT id、username、email、password_hash、
         created_at、updated_at FROM users;
サーバー:  [bcryptパスワードハッシュを持つ5行]

8.5分間で9つのプロンプト。LLMは、すべてのレスポンス全体で一貫したテーブル名、列スキーマ、データ型を保持していました。このデータベースは存在しません。information_schema.tablesから列列挙からpassword_hashへの進行は標準的なPostgresql内省です。1つのクエリの先頭スペース(" select * from orders")は手動入力を確認します。

プラントされた認証情報には、ライブカナリアトリップワイヤーが含まれています。AWS キーが任意のAWS APIに対して使用された場合、アラートが発火します。このアラートに対応する訪問者は記録されていません。


WARPがTorを打ち破る方法

マネージドWARPはCloudflareのエッジへのWireGuardトンネルを作成します。Gatewayプロキシはデータを終了し、HTTPを検査し、転送する前に帰属ヘッダーを付与します。

次のホップがTorである場合:

Torは暗号化し、TCPをリレーします。各リレーは前のホップから暗号化されたバイトのみを見ます。リレーはHTTPを解析するか、コンテンツを変更します。Cloudflareヘッダーはトラフィックペイロード内のバイトです。3ホップの玉ねぎ暗号化はそれらに触れません。

これはTorの脆弱性ではありません

これはTor脆弱性ではありません。Torはネットワークレイヤーを設計どおり匿名化します。
WARPはTorのリーチを超えるHTTPレイヤーで動作します。トラフィックがTorに入る前に識別ヘッダーを付与するHTTPレベルのプロキシであれば、Torを通じてリークします。

スプーフィング評価

Cf-Connecting-IpはインバウンドTCP接続上のCloudflareによってサーバー側で設定されます。転送中にスプーフィングすることはできません。フィンランドの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 説明
65.109.30[.]32 Hetzner VPS、ヘルシンキ。直接およびWARPソース。
xdash-client/1.0 カスタムHTTPクライアント。ユニークなJA4Hフィンガープリント。

検出シグネチャ

- header_present: "Cf-Warp-Tag-Id"
  destination_not_cloudflare: true
  note: "非CloudflareサーバーのWARP Gatewayトラフィック"
- header_present: "Cdn-Loop"
  value_contains: "cloudflare"
  destination_not_cloudflare: true
  note: "CF関係のない、Cloudflareループヘッダー"

検出ルール

title: 非CloudflareデスティネーションへのCloudflare WARPヘッダーリーク
id: 7a3c9f12-e8b4-4d91-a6f5-2c1d8e9b4a73
status: 実験的
description: >
Cloudflareインフラストラクチャを持つサーバー上のWARP Gatewayの帰属ヘッダーを検出します。送信者は
マネージドWARPをルーティングしており、Torまたは他の匿名化ツールで層状化される可能性があります。
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:
- Cloudflareの背後の正当なサーバー
- コンシューマーWARP(1.1.1.1)はこれらのヘッダーを注入しない可能性があります
level: medium

重要な発見

ヘッダーはTorを生き残ります

マネージドWARPは、Torを生き残る5つの識別ヘッダーを注入します。Cf-Connecting-Ip、Cf-Warp-Tag-Id、Cf-Ipcountry、Cf-Ray、Cdn-LoopはHTTPレイヤーで付与されます。Torはトランスポート層で動作します。ヘッダーはリレー数に関係なく無傷で到着します。

IP間の相互相関

Cf-Warp-Tag-Idはセッションをまたがってセッションを相互相関させます。同じUUIDは2時間離れたVPSと住宅用接続から表示されました。このヘッダーがなければ、セッションは無関係に表示されます。

コンシューマーとマネージド

コンシューマーとマネージドWARPは異なる動作をします。コンシューマー1.1.1.1アプリはヘッダーを追加しません。マネージドGatewayティアは5つを注入します。Cloudflareはこれを文書化しません。オペレーターはWARPトラフィックが均一であると想定すべきではありません。

一般化可能な発見

発見はWARP以上に一般化します。TCP層の匿名化ツールの上流でヘッダーを付与するHTTPレベルのプロキシであれば、このリークが発生します。WARPは最も導入されたサンプルです。


推奨事項

ハニーポットオペレータ向け

  • Beelzebub HTTPイベントからHeadersMapをインデックス化します。すべての非標準ヘッダーはそこでキャプチャされます。
  • Cf-Warp-Tag-Idをセッション全体で相互相関させます。異なるIPから繰り返されたUUIDは、それらを1つのWARP登録にリンクします。
  • 推論エンドポイントでLLMバックアップレスポンスを使用します。初期プローブを超えたエンゲージメントは、セッションごとのキャプチャされたヘッダーと行動データを増加させます。

ディフェンダー向け

  • Cloudflare関係のないサーバー上のCdn-Loop: cloudflareにフラグを立てます。トラフィックが上流のCloudflareを通じて送信されたことを意味します。
  • 非CloudflareサーバーのIPを実際のソースIPとしてCf-Connecting-Ipを扱います。

WARPユーザー向け

WARPをTorと層状化しないでください

WARPをTorと層状化しないでください。WARPは実IPをHTTPヘッダーに付与して

層状化しないでください。WARPは、TorがアクセスできないレイヤーでHTTPヘッダーに実IPを付与します。


MITRE ATT&CK

テクニック ID
アプリケーションレイヤープロトコル: Web T1071.001
マルチホッププロキシ T1090.003
ネットワークサービス検出 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