3月下旬、ツイッターを眺めていると不穏なツイートが流れてきました。

ツイートにある通り、ビットコインノードを運用していればbitcoin-cli getpeerinfoコマンドで接続しているノードの一覧を出すことができます。Umbrel+Torを使っているので自分のノードには今回問題となっているノードは接続されていませんでした。

もしクリアネットでビットコインノードを公開している場合はぜひコマンドを試してみて下さい。いずれかが表示されたらたまたま自分から接続していることになります。

bitcoin-cli getpeerinfo | grep -E '162.218.65|209.222.240|91.198.115|2604:d500:4:1'

数日後に0xB10Cから先程のツイートをした理由について説明がありました。どうも多数のビットコインノードに接続を繰り返して監視を試みている主体がいると疑っているようです。

今日はビットコインのP2Pネットワークでのプライバシーについて簡単に見ていきましょう。

オンチェーンの影に隠れる重要部分

長年仮想通貨業界にいる人でもビットコインについては通貨とブロックチェーンの部分についてしか知らない人が大半ではないでしょうか。ビットコインノードの動作とP2Pネットワークはあまり光が当たらない部分ですが、いわゆるビットコインコア開発者たちの作業の大半はこれらの部分に充てられていて、ビットコインの分散性や検閲耐性を縁の下で支えています。

ウォレットでトランザクションに署名した後、そのトランザクションはビットコインノードからP2Pネットワークへと提出されます。他のノードからトランザクションを受け取ったノードは検証後に自身のメモリプール(未承認トランザクションを保持しておく領域)にトランザクションを保存し、周りのノードにも転送します。このように、ウォレットで署名したトランザクションはP2Pネットワークに提出してから数秒~数十秒でほぼ全てのノードに行き渡ります。

ここにプライバシーが漏れてしまう要因があります。そう、ノードがトランザクションを受信したタイミングです。

例えばネットワークの数カ所にノードを配置してみて、あるトランザクションを受信したタイミングを計測してみます。1つめのノードがトランザクションを受信してから2秒後に2つめのノードが、5秒後に3つめのノードがそのトランザクションを受信していれば、1つめのノードがネットワーク上でトランザクションを配信したノードに近いと推測できます。これをより大きな数のノードを散りばめて実行すると、特定のトランザクションとそれをネットワークに流したノードをある程度の精度で紐づけることができてしまいます。

ノードとトランザクションが紐付けられると様々な問題が発生します。例えばビットコインのオンチェーンプライバシー面での長所の1つは複数のアドレスを利用することでウォレットの全貌を隠すことができる点です。しかし、個人のノードと判定されるようなノードから出てくるトランザクションはほとんどがそのノードの持ち主のものと考えられるため、オンチェーンでは全く関連性のない2つのトランザクションが同一のユーザーのものと推測されてしまいます。

ウォレットサービスや取引所の利用では確保できないレベルのプライバシーを得られるはずの独自ノードを利用したトランザクション配信にも穴があるかもしれないということです。

ちなみにライトニングネットワーク上での支払いも似たようなプロセスで送金者・宛先を推測することが理論上はできますが、ただノードを繋げるだけではだめでライトニングチャネルを大量に運用し実際に送金を中継する必要があり、コストがかかる点でオンチェーン支払いより同様の攻撃に強いです。

LinkingLionとは何者なのか

さて、今回監視の可能性を告発した0xB10C氏 (マイニングプールによる検閲が起こっていないか監視するminingpool.observerなどの開発者)がLinkingLionと名付けた今回のノード群の運営者は誰なのでしょうか。

0xB10C氏が後日投稿した記事で4つのIPアドレスに対してWhois検索をかけると4つの別々の会社名が出てきますが、すべて同じASであるLionLink Networks社に帰属するIPアドレスを利用していることとビットコインノードの特徴的な挙動が同じなことから同一主体と断定し、LinkingLionと名付けたようです。

関連性が不明瞭な4社ともLionLink Networks社(AS54098)に帰属するIPアドレスを利用している

記事の中では該当ノードの特徴的な挙動についても触れられているので、興味のある方は"Behavior"の段を読んでみて下さい。まとめるとノード接続時に共有されるメタデータを収集してすぐ接続を切断するような挙動が多く、2割くらいのケースで2分半から10分程度の間ブロックやトランザクションを受け取ってから接続を閉じるそうです。

また、このIPアドレス群は2019年からビットコインネットワーク上でアクティブなほか、匿名性に特化した仮想通貨モネロのノードにも接続を試みていたことからモネロノードのブラックリストに載っているそうです。学術や趣味が目的にしては長期間の現象であり、モネロの匿名性を下げたい主体も限られるため、この情報はLinkingLionがブロックチェーン解析企業や捜査機関、情報機関である可能性を強く示唆しています。

ブロックチェーン解析企業は取引所などが規制対応のために「できる限りのことをやった」と主張するために存在していて、結果を出すことと業績がほとんど関係ないためそれほど本気を出しているとは思えないから捜査機関だろう、という意見もあります。

現時点で対策は限られる

さて、LinkingLion対策はどうしたら良いのでしょうか。

残念ながら現時点で多数のビットコインノードを用意してトランザクションの受信タイミングを測る攻撃への対策は大してありません。既知のIPアドレスをBANする程度でよければ、外部公開しているノードを持っている方は以下のコマンドを試してみて下さい。

ただし、LinkingLionが使用するIPアドレスを変えれば全く無意味のことなので、根本的には何も解決していません。

1つのお手軽な対策はTor上でのみノードを公開することです。例えばUmbrelは既定でこれに該当します。クリアネット側からの接続を受け付けられないだけでもある程度の対策になっていますが、トランザクションを配信するたびに異なるTor上のノードに接続して配信後に接続を切るというひと手間を加えると非常に強固なプライバシーが得られます。ノードよりも軽量でビットコインネットワークに接続するスタンドアロン型のトランザクション提出ツールもあるようです。(古いのでBDKとかで作り直すべきかもしれません)

もちろんマイニングプールに直接依頼したり、ウォレット事業者やBlockchain.comのようにトランザクションを代理で配信してくれるサービスを用いることも考えられますが、この場合はサービス側に多少の情報が残ってしまうことを考慮する必要があります。

上記の対策はとりあえず取れるものですが、長期的な解決策もいくつか考えられます。トランザクションの配信を他のノードにさせるDandelionの導入がその代表例ですが、DoS攻撃対策が難しいことから過去に不採用となった経緯があります。

お金と労力をかけてプライバシーを侵害しようとする謎の主体LinkingLionが無差別に(?)ビットコインノードに接続して情報収集しているよ、という話題でした。