Bitcoin Core 31.0で新たに導入された-privatebroadcast機能のプライバシーに関するバグを認識しました。 このバグにより、特定のネットワーク条件下で発信者のIPアドレスが受信ピアに公開される可能性があります。 修正は近日公開予定で、31.1でリリースされる予定です。-privatebroadcastのユーザーは、 31.1がリリースされるまで、以下の回避策のいずれかを適用することをお勧めします。

影響を受けるユーザー

このバグは、以下のすべてに該当するユーザーに影響します:

  • Bitcoin Core 31.0を実行しており、-privatebroadcastを設定している。
  • sendrawtransaction RPCを使ってトランザクションをブロードキャストしている。 Wallet RPC(sendtoaddresssendallなど)はプライベートブロードキャストを使用しないため、影響を受けません。
  • アウトバウンド接続でTorに到達可能である。
  • アウトバウンドのIPv4またはIPv6接続が直接行える状態である。つまり、 -onlynetの制限でそれらを除外しておらず、-proxy=...の設定もそれらに適用されていない。
  • -v2transport=0によってBIP324 v2トランスポートが無効化されていない。

影響

プライベートブロードキャスト機能が、v2(BIP324)トランスポートのサポートを通知しているIPv4またはIPv6ピアを選択した場合、 最初の接続は想定どおりTorプロキシ経由でルーティングされます。しかし、その接続でv2ハンドシェイクが失敗すると、 Bitcoin Coreはv1で再接続を試みます。このv1の再試行はTorプロキシを経由せず、 IPv4またはIPv6ピアに直接接続するため、発信元のIPアドレスが受信ピアに晒されてしまいます。

最初からv1で行われる接続(v2を通知していないピアへの接続)は、正しくTorプロキシ経由でルーティングされるため影響を受けません。 このバグは、v2ハンドシェイク失敗時のv1再接続固有のものです。onionピアおよびI2Pピアへの接続は、 v1での再試行時もそれぞれのプロキシ経由のままであり、クリアネットのIPアドレスが晒されることがないため影響を受けません。

これは、31.0のリリースノートにあった「発信者のIPアドレス(つまり地理情報)が受信者に知られることがない」を破るものです。

どのようにして発生するのか

実際にv2トランスポートをサポートしているピアに対して、v2ハンドシェイクが失敗することはまずありません。 このバグは、悪意あるピアがv1での再試行を強制するために意図的にv2ハンドシェイクを切断することで引き起こされる可能性が最も高いです。

回避策

31.1にアップグレードできるようになるまで、-privatebroadcast機能のユーザーは、 以下のいずれかを適用してください:

  1. 機能を無効化する。 -privatebroadcast=0を設定する。

  2. v2トランスポートを無効化する。 -v2transport=0を設定する。これによりノードのすべての接続が 暗号化されていないv1プロトコルを使用するようになり、クリアネット上でのフィンガープリンティングや 検閲が容易になるというデメリットがあります。

  3. アウトバウンドのIPv4/IPv6をTor経由にする。 -proxy=127.0.0.1:9050を設定する( TorのSOCKSポートが異なる場合は9050を置き換えてください)。これによりアウトバウンドの IPv4/IPv6 P2PトラフィックのすべてがTorの出口ノード経由でルーティングされるようになり、 ノードがシビル攻撃を受けやすくなるというデメリットがあります。

謝辞

このバグを発見したEugene Siegelに感謝します。