政府によるインターネットの検閲とSNIについて

韓国政府により韓国国内ではSNIを利用して、政府が有害サイトと認定したサイトへの接続が制限されるようになりました。

私は以前にSNIに関する記事を書いており、普通の人よりはSNIという技術に関して詳しいと思います。Web技術に関する仕事をしている1人の人間として、今回SNIを悪用する形で政府により個人のプライバシーを侵害する事例が発生してしまったことに非常に心を痛めています。

しかし今回一般の人の目にも触れる形でSNIやHTTPSのことが報じられた結果、エンジニアも含めて明らかに技術に関して勘違いをしているのではないかと感じる発言を見ることがありました。このまま放置するのも良くないと感じているので、Q&Aという形でSNIやHTTPSに関する誤解を少しでも解ければと思います。

Q&A

Q: そもそもSNIって何?

以前書いた記事にも書かれているので是非読んでみてください。

簡単に説明すると、HTTPSではSSL/TLSを利用して通信が暗号化されます。なので1つのIPアドレスで複数の証明書を扱おうとした場合、最初の通信時にどの証明書を利用すればいいか分かりません。そこでSNIが必要になります。

SNIは最初の通信時に今から通信したいサーバーネーム(ドメイン名と考えてください)をサーバーに平文で渡すことで、通信したいSSL証明書を指定できます。SNIは現在の一般的なブラウザではすべてで有効になっています。

現在のWebサービスはHTTPSで提供することが事実上必須ですが、すべてのドメインに対してすべてのIPアドレスを用意することは特に枯渇が懸念されているIPv4では現実的ではありません。実際に数年前から日本国内でも各種サービスのHTTPS化が行われましたが、HTTPSに変更される際にSNIが有効でないと利用できないWebサイトになった事例を私はいくつも知っています。既に一般的に利用されている技術です。

Q: HTTPSで通信を暗号化しているのにSNIは穴になるのでは?

これは大きな勘違いです。解説します。

SNIを利用せずにHTTPSのサイトを提供するには前述の理由で専用のIPアドレスを確保する必要がありました。HTTPSでは通信内容は暗号化されますが、通信しているIPアドレスは暗号化されません。なので通信を傍受された場合、特定のIPアドレスの443番ポート(HTTPS通信のデフォルト)と通信を行っていることは必ず分かってしまいます。通信しているIPアドレスが分かるならば当然そのIPアドレスが配布しているSSL証明書も分かります。

つまりSNIを利用しないHTTPS通信では証明書からどのドメインと通信しているかが分かります。通信しているドメイン自体を秘匿することはできません。

例外があるとすれば以前書いた記事でも紹介したように、SANを利用して複数のドメインが有効な証明書を作成することが考えられます。しかし一般的に証明書は組織単位で作成するものなので、記事内で紹介した例だとGoogle社が提供しているいずれかのサービスを利用したことは分かってしまいます。

CDNによってはSANを使って様々なユーザーの証明書を1つにしてサービスを提供することもあります。しかしメジャーなサービスのドメインで使われることはおそらく今後も無いと思います。基本的に利用した証明書が分かれば、どの組織のドメインを参照したかは分かると断定していいでしょう。

Q: そもそもDNSが暗号化されてないならこれから通信しようとするドメインは分かってしまうのでは?

その通りです。この問題を解決するために現在利用されようとしている代表的な技術にDNS over HTTPSとDNS over TLSの2つがあります。

DNSは暗号化されていないため、傍受されていた場合は通信を改竄することが可能ですし、これから通信しようとするドメインも分かってしまいます。

DNS over HTTPSとDNS over TLSはどちらも暗号化されているという点で同じですが、DNS over TLSは専用の853番ポート(DNSは53番ポート)が利用されるのに対して、DNS over HTTPSはHTTPSと同じ443番ポートが利用されていて通常のHTTPS通信と全く同じ通信が行われることが特徴です。

利用しているポート番号は秘匿できないのでDNS over TLSを利用している場合、DNS over TLSの通信をしていること自体は分かってしまいます。通常のHTTPS通信と混ざってしまい区別できないDNS over HTTPSの方がより安全と言えると思います。

なぜそう言えるのかというと詳しくは後述しますが、これまでの事例から考えるとDNS over TLSが一般的になった場合、おそらくブロッキングを行いたい政府から853番ポート自体が通信できなくなると考えられるからです。

またDNS over HTTPSもIPアドレス自体がブロックされたら当然通信はできなくなります。政府の意向に沿わないDNS over HTTPSを提供するIPアドレスは政府からブロックされていくはずです。

Q: SNIを暗号化することはできませんか?

これから一般的になるであろうTLS1.3の拡張仕様としてSNIを暗号化する仕様が提案されています。

なぜ今まで暗号化していなかったのかというと理由は単純です。HTTPSの通信を開始した時点では暗号化に必要な鍵を共有できていません。そのため最初の通信を暗号化することはできません。そして最初の通信の時点でどの証明書を利用するか指定する必要があるためにSNIは暗号化ができませんでした。

それでは現在提案されているEncrypted SNIはどうやって鍵を取得するのでしょうか?答えはDNSです。ドメインのIPアドレスをクライアントに伝えるために使用されるDNSですが、これからは暗号化に必要な鍵もDNS経由で伝えることになります。

DNSについて少し捕捉します。ユーザーはドメイン名からIPアドレスを調べるためにフルサービスリゾルバー(Googleが提供している 8.8.8.8 が代表的なフルサービスリゾルバーです)に対してリクエストを送っています。このフルサービスリゾルバーから鍵を返すようにすることでSNIを暗号化することができるなら一見良さそうに見えます。

しかしまだ問題があります。次に続きます。

Q: SNIによるブロッキングもEncrypted SNIで解決するのでは?

Encripted SNIはDNSを使用することを前述しました。今回はEncripted SNIの問題について紹介します。

それはユーザーが使用しているフルサービスリゾルバーが信用できるのかという点と、DNSがそもそも暗号化されておらずフルサービスリゾルバーとの通信経路上で改竄される可能性がある点です。このように何らかの手段でDNSの通信を改竄することをDNS汚染と呼びます。

韓国政府はこれまでも特定サービスのブロッキングにDNS汚染を利用してきました。つまり韓国国内のネットワーク内にいるとDNSが正しく解決できる保証はありません。当然SNIの暗号化に使用される鍵も偽装されたり、そもそも返さないように改竄されている可能性があります。

ではなぜ暗号鍵を取得する方法として偽装が容易なDNSを使用するのでしょうか?それはそれ以外の選択肢があまりないというのが一番大きいですが、そもそもDNSが信用できない環境の場合、攻撃者が自分たちが管理するIPアドレスを名前解決結果として返すことで通信内容をすべて傍受するなど、もっと深刻な攻撃が可能になります。SNIの暗号化という観点ではあまり気にしても仕方が無い部分ということです。

HTTPSならば通常はDNS汚染を行っても証明書の検証に失敗するはずです。しかしこれにも回避策はあります。

そもそもブラウザの警告を無視するユーザーが30%~70%いるという研究もあります(プロフェッショナルSSL/TLS)。適当な証明書を返しておけば一定数のユーザーの通信はHTTPSであっても傍受できます。

またアンチウィルスソフトによっては独自のルート証明書をインストールするものも存在するため、そういうソフトウェアをインストールさせてしまえば証明書は偽造可能になります。Lenovo社のSuperfishの事件のようにそもそもルート証明書がプリインストールされていた事件もありました。

日本政府に関して言えばGPKIのルート認証局を持っているため、正当な証明書を発行することは技術的に可能です。このルート認証局はMozillaからは信用されていませんが、WindowsなどのOSでは現在そのルート証明書がインストールされています。実際に偽の証明書を発行された場合は各種OSやブラウザから信用されなくなると思われます。例えばChromeは基本的にはOSのルート証明書を使用しますが、信用しないルート証明書のブラックリストを所有しているため、Chromeの場合はすぐにChromeのブラックリストに入ると考えられます。しかしどのルート証明書を信用するかどうかは一部の企業の裁量の元に行われているものである点と、政府のサイトがそのルート証明書がインストールされてないと見れなくすることも現実的に可能です。HTTPSだから通信は絶対に成功しないということはありません。

また前述の通りSNIを利用しない場合はIPアドレスから通信したドメインが分かります。

つまりSNIを暗号化する意味があるのは、CDNを利用して特定のIPアドレスから様々な事業者のサービスが提供されている中で自社のサービスを提供しているときだと思います。以下の記事から引用すると

ひとことでいうと「木を森の中に隠す」アプローチ

ということになります。

ここまで技術的に何が可能なのかを書いてきましたが、既に韓国国内ではEncrypted SNIは無効にされているそうです。前述の通りDNS汚染が利用されている韓国国内では技術的に十分可能です。まだ実用化前のEncrypted SNIを無効にしたということはSNIを暗号化させる気は全くないということだと思います。

前述のDNS over HTTPSもIPアドレスをブロックされたら通信できないのでEncrypted SNIとDNS over HTTPSの両方が利用できるフルサービスリゾルバーがあったとしても韓国政府からIPアドレス自体がブロックされれば利用できなくなります。

Q: 政府によるインターネットの検閲について知りたい

私が知っている情報をいくつか書いてみます。

これについておそらく世界最先端は中国の金盾(グレート・ファイアーウォール)でしょう。

中国では政府による検閲が非常に一般的なため、そもそもインターネットが検閲前提になっていると言っても過言ではありません。中国では『商用暗号管理条例』という法律により、政府の許可の無い暗号化が違法です。これはHTTPSにも適用されています。中国では現在でもHTTPSは一般的ではありませんが、それはこの法律が原因です。これにより中国政府は中国国内のネットワークを基本的にすべて傍受可能な状況になっており、実際に監視を行っているとされています。

中国政府による特定サービスのブロッキングにはいくつかのレベルがありますが、大きく2つあり、DNS汚染とIPアドレスのブロックがあります。DNS汚染によるものならばOSのhostsファイルを変更するなどの方法で回避することが可能ですが、IPアドレスのブロックが行われた場合、中国国内のネットワークに所属している限り回避方法はありません。

韓国国内では暗号化が違法ということはありませんが、ブロッキング自体は行われており、これまでは中国政府と同様にDNS汚染とIPアドレスのブロッキングが行われていました。それが以前から検討されていたSNIを利用したブロッキングも利用されるようになったのが今回の報道です。

中国では有名な例でいえば『天安門』という文字列が含まれているサイトはアクセスできないと言われていますが、おそらくURLに『天安門』が含まれているサイトもアクセスできないのではないかと考えられます。HTTPSの場合はURLのパスも暗号化されているため、特定のパスのみブロッキングすることは技術的に不可能です。

最後に

単純に暗号化すれば解決みたいな簡単な話ではないことが分かってもらえれば幸いです。また韓国や中国だけの話ではなく、現在日本国政府の中でもブロッキングなどに関する議論が活性化しており、予断を許さない状況です。

そもそも違法サイトが運営されているなら違法サイト運営者を逮捕してサービスを止めればいい話であり、そのことを理由にして通信を傍受したり改竄したりするということはあってはなりません。この辺りの話題にはしばらく目が離せそうにありません。

また現在策定中のHTTP/3では徹底的にプライバシーを考慮しながら策定されています。興味のある方は情報を追うことをおすすめします。