その Proxy、信用できますか?

昔から、Proxy を通して自分の IP アドレスを隠すことが、「オレ、ちょっとカッコイイ」みたいな雰囲気があって、Proxy のことを「串」などと、隠語めいた呼び方をして悦に入る人を見かけましたが、今でも、そんな風に考える人が結構いるのに、ちょっと驚きました。

Mozilla Re-Mix: ボタン一つでIPを偽装してブラウジングを行うことができるFirefoxアドオン「Stealthy」

センセーショナルなタイトルで、ちょうど Winny が大流行したころに「悪用厳禁」と大きく書かれた本が平積みされていたのを思い出しますが、この Firefox のアドオンがやっていることは、単に Proxy を設定しているだけです。

記事に登場する Proxy 設定の画面でちょっと不思議なのは、なぜか SOCKS のプロキシとして、同じ IP、同じポート番号が指定されている点です。ちょっと実験してみたのですが、これだと、http、https、ftp に関しては、通常の HTTP Proxy として繋ぎにいきます。ポート番号も Squid デフォルトの 3128 ですし、おそらく、SOCKS プロキシの設定は意味が無い*1と思われます

で、このアドオンで指定される Proxy って、大丈夫?

Proxy を通す、という事は、全ての通信内容を Proxy サーバが取得できる事を意味します。https の場合には Proxy に対して CONNECT メソッドという、特別な命令を発行して繋ぎます。CONNECT メソッドを使ってつなぐと、Proxy は単純にパケットの中身を右から左へ、左から右へと中継するだけになります。この場合、Proxy サーバ上では暗号化された後のデータしか取得出来ないので、とりあえずは Proxy に実際の中身が知られる事は、基本的にはありません。

ただ、もしこのアドオンが、ルート証明書を勝手に追加するような事をしていると、SSL/TLS でも油断できません。

通常、ブラウザ側から送られる通信用の暗号鍵は、その Web サーバから取得した公開鍵で暗号化して送ります。公開鍵で暗号化され通信用の暗号鍵は、Web サーバが持つ秘密鍵でしか元に戻せません。なので、Proxy サーバのように中間で SSL/TLS の通信を取得しても、暗号を解いて中身を知る事は出来ません。

そうなると都合が悪いのは、Proxy として動作するウィルスチェック・ゲートウェイの類です。通信の中身が分からないという事は、ウィルスチェック・ゲートウェイにとっても、ウィルスかどうかをチェックできない事を意味します。

で、これを回避する為に、特別なルート証明書をインストールして、下記のような手順にします。

  1. クライアントは Proxy(ウィルスチェック・ゲートウェイ)に対して、CONNECT メソッドで接続要求を行う。
  2. Proxy は、あたかもブラウザのように、HTTPS で Web サーバへ接続する。
  3. と同時に、クライアントに対しては、接続先の FQDN に対する証明書をその場で作成し、クライアント側に送る。この際、クライアント側にインストールする「特別な証明書」に対応する署名鍵で署名する。
  4. クライアントは、受け取った証明書の確認を行う。この証明書は事前にインストールした「特別な証明書」で検証される。
  5. 以下、Proxy と Web サーバの間は、本物の Web サーバの証明書を使った通信、Proxy とクライアントの間は、Proxy が生成した偽物の証明書を使った通信となる。
  6. 結果、Proxy で通信内容が取得できる。

そもそも、アドオンでルート証明書がインストールできるかどうかも分からないし、もし出来たとしても、さすがに Add-ons for Firefox で公開されないだろう、と思いますが、少なくとも SSL/TLS されない通信は、このアドオン作者が用意した Proxy サーバで全て把握する事が可能です。

その Proxy、信用できますか?

余談:

会社でアクセス制限されているようなサービスを利用したり、

そもそも、会社でアクセス制限がかかっていたら、これを使って設定される Proxy へ繋がらないと思うんだけどなぁ。社外の Proxy へ繋がる、って事は、クライアントから直接インターネット側へ繋がる、って事になると思うけど。

*1:Firefox 上の設定として意味が無い、というよりも、同じサーバの同じポート番号で HTTP Proxy が待ち受けしているのなら、そこへ SOCKS のプロトコルで繋ぎに行っても、そもそも繋がらない。