世界を動かす技術を、日本語で。

Mullvadの出口IPは意外にも特定可能です

概要

  • Mullvad は複数のサーバー出口IPを提供する数少ないVPNプロバイダー
  • 各サーバーで WireGuardキー に基づき出口IPが決定
  • 実際には 組み合わせ数が限定的 で、ユーザー特定リスクあり
  • 乱数生成アルゴリズム の仕様が原因
  • 自己防衛策として キーのローテーション が推奨

Mullvadの出口IP割り当ての仕組みとリスク

  • Mullvad は他のVPN(例:Proton VPN)に比べて サーバー数が少ない (578台)
  • 各サーバーは 複数の出口IP を持ち、同じサーバーに接続しても異なるIPが割り当てられる
  • 出口IPは WireGuardキー によって決定され、キーは1~30日ごとにローテーション
    • サードパーティクライアント使用時は ローテーションなし
  • サーバーごとに 独立して出口IPが割り当てられる ため、理論上はユーザーごとに一意のIP組み合わせが与えられるはず
  • 実際には、 膨大な組み合わせ数(8.2兆以上) があるにもかかわらず、284通りの組み合わせしか割り当てられていない

割り当てアルゴリズムの調査と考察

  • 出口IPの位置(プール内のインデックス)を計算し、 サーバーごとのプールサイズで割る と、ほぼ同じ比率(例:81%付近)になる
  • 隣接した出口IP しか割り当てられない仕様
  • これは seed(種)付き乱数生成器(RNG) の仕様によるものと推測
    • Rustの乱数生成器(StdRng)が使われている可能性
    • 同じseedとプールサイズで常に同じ結果を出す
    • プールサイズが異なっても、最初のfloat値をスケーリングするだけで エントロピーは変わらない
  • このため、 出口IPの組み合わせは極端に限定される

Deanonymization(匿名性の危険)

  • 各ユーザーの出口IP組み合わせは意外と 多くのユーザーと共有されている
    • 例:100,000人中0.34%(約340人)が同じIP組み合わせ
  • しかし、 >99%の精度でユーザーを特定 できる場合もある
    • フォーラム管理者やデータ流出時のIPログから ユーザーの相関分析 が可能
    • 複数サーバー利用でもIP組み合わせの重複範囲で高確率で同一人物と推定される

Mullvadユーザー向けの自己防衛策

  • 1つのWireGuardキーでサーバーを頻繁に切り替えない
  • Mullvadアプリからログアウトし、キーを強制ローテーション する
  • これにより、 同じIP組み合わせでの特定リスクを減少

まとめ

  • Mullvadの出口IP割り当ては限定的な組み合わせに依存
  • 乱数生成アルゴリズムの仕様 が想定外の匿名性リスクを生む
  • キーのローテーション とサーバー切り替え頻度の制御が重要

Hackerたちの意見

驚くべきことに、サーバーに接続するたびに与えられる出口IPはランダムではなく、あなたのWireGuardキーに基づいて決定的に選ばれるんだって。これって何の意味があるの?サーバーレベルで出口IPをマッピングするより実装が複雑そうだけど、きっと何か良い理由があるんだよね?

これは、悪用するユーザーがいると、他のユーザーが大きなサービス(例えばGoogle)からVPN経由でボット行為をしてIPを常に回転させてブロックされないようにするためだと思う。実用的な対策だけど、プライバシーにはコストがかかるね。

インターネット上には、いろんなIPアドレスから接続しようとすると壊れるものがたくさんあると思う。CAPTCHAの仕組みとか、レート制限とか、IPの評判とかね。

それは、よりステートレスで実装が簡単だから、ユーザー体験も良くなるんだ。接続するたびに新しい出口IPをもらうと、「キー0xabcが出口IP1.2.3.4に対応する」みたいなNATテーブルが必要になって、アクティブなユーザー数分だけ大きくなって、NSAがそのIPを誰がどのくらい使ったかを聞いてきたときに答えられるように永遠に保存しなきゃいけない。キーから導き出された静的なマッピングがあれば、そんなテーブルは必要ない。VPNソフトを再接続しても(例えばWi-Fiホットスポットを切り替えたとき)、違うIPアドレスにならないから、SSHセッションが再開できるのもいいところだね。毎回違うパブリックIPだったら、それは無理だもん。

俺の予想だと、決定論的な割り当てが負荷分散やデバッグを楽にするんじゃないかな。でもプライバシー製品にとっては、その便利さを再考する必要があるかもね。

Mullvadはほぼ完璧なVPNホストだから、サイト運営者がこの特性を利用して禁止措置を取れるといいよね。解決策はシンプル(擬似乱数シードを追加するだけ)だから、Mullvadは数日以内に修正を出すと思う。1. TeamPCPのお気に入りのVPNだし。

ソースは?これについてググってるけど、関連情報が見当たらないんだよね。

驚くべきことに、サーバーに接続するたびに与えられる出口IPはランダムではなく、あなたのWireGuardキーに基づいて決定的に選ばれるんだって。キーは1日から30日ごとに回転する(サードパーティのクライアントを使うと回転しないけど)。これについてちょっと混乱してるんだけど…リポジトリにやり方が詳しく書いてあるなら、サードパーティがメインアプリのクライアントみたいにキーの回転をするのを止める理由は何?

サードパーティのクライアントには、LinuxカーネルのWireGuardドライバーなんかが含まれるよね。特定の商業サービスに対する攻撃を軽減するのは、ネットワークドライバーの仕事じゃないと思う。

サードパーティがキーのローテーションを行うのを妨げているのは何か 知っていること、主にそれだね。

VPNの目的には、ユーザーが訪れるサイトに対して匿名性を持たせることは含まれていないから、Mullvadがユニークな出口IPを強制しないのはあまり驚くことじゃないよ。匿名性を求めるユーザーはTorのようなネットワークを使うべきだね。

それがパブリックVPNの目的なんだよね。公衆VPNを使ってるときは、リクエストをしている人が誰か、終端のIPも含めて誰にも知られたくない。考えてみて。君の論理だと、VPNは終端のIPに対して匿名化すべきじゃないから、トレントには使うべきじゃないってことになる。でも、実際にはトレントにはめちゃくちゃ効果的なんだよね。プライベートVPNの話をしてるなら、Mullvadはそれに当たらないよ。

Torって、アメリカ政府のプロジェクトで、匿名性が崩れることが示されてるんじゃないの?

なんでダメなの?特定のVPNサービスの目的になってもいいじゃん?

例えば、あなたがフォーラムのモデレーターで、新しいユーザーが前日にバンしたユーザーのソックパペットだと疑っているとしよう。IPログをチェックすると、異なるMullvadサーバーを使っているにもかかわらず、両方のアカウントが重なり合うフロートレンジ0.4334 - 0.4428と0.4358 - 0.4423に解決される。これで、99%以上の確率で同一人物だって分かるね。これって、もし僕が情報機関だったらVPNを設計する方法に似てるな。

なんか考えさせられるね…

これは、もし私が情報機関だったらVPNを設計する方法に聞こえるね。君のコメントもそうだね…

いつかCloudflareが情報機関と関係があるってことが明らかになるんじゃないかな。「突然のDDoS」に対する解決策は、彼らのウェブサイトをCloudflareの背後に置くことだし、あの突然の攻撃を仕掛けられるのは誰なんだろうね?

でも、彼らがログを保存していないっていう小さな詳細がまだあるよね。これって私にとっては大問題で、複数のVPNの出口ノード間での相関を可能にするけど、それだけなんだ。自動的にあなたを特定することはできないけど、特定するためのハードルは確かに下がる。ただ、要求される条件はまだ高いけどね。早くこれを修正してほしいな。こんな「ハッシュにするか、何か敏感なものにする」っていうのがまだあるなんて信じられないし、しかもマルヴァドでのことだよ。もっとシンプルにランダム化すればいいのに。

VPNがTorと同じくらいのものだと思う人がいるのは驚きだね。そう言われると確かにおかしいし、出口ノードをコントロールすることでTorユーザーを特定できる可能性があるってことも理解しないといけない。

大手の消費者向けVPNは「プライバシー」を謳っていて、匿名性を暗示してるから、驚くことじゃないよね。

「23034 IPs to blocklist.txt」っていうリストを管理してて、そこには全てのVPNプロバイダーのブロックされたIPが含まれてる。多くのVPNプロバイダーは、間違ったデータでジオフィードを撒くから、実際の位置を特定するためにトレースルートやpingネットワークを使ってるんだ。

サーバーに入ってくるトラフィックのIPを記録するスクリプトを持ってるんだ。トラフィックを受け付けないポートに来たIPをブロックして、サービスがあるポートにはアクセスできないようにしてる。もし彼らが私の施錠されたドアをチェックしてるなら、開いてるドアから入ってきてほしくないんだよね。

VPNを使うのには正当な理由があるって知ってるよね?例えば、旅行中に、サイトが私のIPアドレスの場所の言語を使って表示することが多かったんだ。ブラウザで設定した言語の好みじゃなくてね。だから、読めないサイトが表示されることがあって、唯一の選択肢はVPNを使って位置情報を偽装することだったんだ。そうすれば、理解できる言語のサイトが表示されるからね。

どんどん暗号化の層を追加してるけど、メタデータは結局私たちを裏切っちゃうんだよね。

例えば、フォーラムのモデレーターで、新しい顔が前日にバンしたユーザーのソックパペットだと疑っているとしよう。IPログをチェックすると、異なるMullvadサーバーを使っているにもかかわらず、両方のアカウントが重なるフロート範囲0.4334 - 0.4428と0.4358 - 0.4423に収束する。このことから、彼らが同一人物である確率は>99%になる。この記事に提供されている数字だけで、著者がこの「>99%の確率」にどう到達したのか理解できない。最初の(バンされたIP)シードと2番目のシードが両方とも0.4423 - 0.4358の範囲にあると仮定すると(例からは正当化されない強い仮定)、これが示すのは、最初と2番目のIPアドレスが両方とも0.4423 - 0.4358の範囲にシードがあるということだけで、これは全Mullvadユーザーの0.65%にあたる。つまり、0.0065 * 100,000 = 650ユーザーが「容疑者」として排除されたけど、実際には複数の出口IPで個人を特定する際に>99%の精度を得たわけじゃない。もっとベイズ的に考えると、潜在的なシードの重なりは、これらのIPアドレスが同一人物(少なくともMullvad VPNアカウント)を表しているという強い証拠になるけど、私が見る限り、著者はそう言ってるわけじゃないみたいだね。

あなたのフォーラムが大きくて、1000人のアクティブユーザーがいて、毎日1人が参加するって言ったら、誰かがこのVPNを使って、誰かがバンされた次の日にフォーラムに参加して、似たようなIPを持ってる可能性ってどれくらいあるの?ほとんどの小さいサイトにとっては、これはかなり強い証拠になるよね。