SSL
脆弱性
freak
SSL/TLSDay 18

輸出暗号とFREAK

世界が改変される12月18日ですが、いかがお過ごしでしょうか。

さて、SSL暗号の世界も普及までの道のりは平坦なものではなく、途中にはいろんなできごとがありました。

暗号≒軍事

シーザー暗号とか、第2次大戦期の暗号解読をめぐる情報戦を例に引くまでもありませんが、軍事上、情報管理、そして暗号は重要な役割を占めています。

インターネットの普及や、個人レベルで豊富な計算能力が利用可能となった20世紀末ごろまで、暗号は基本的に軍事利用がメインでした。

暗号の輸出規制

軍事利用できる技術が拡散すれば問題となるので、軍事上さまざまな規制を行っていました。昔はかなりガチガチだったのですが、1つの事件を機として大幅に緩和されます。今でもiOSアプリの配信にあたって「輸出コンプライアンス」に基づく申告が求められますが、これは現在も残っている規制のためです。

「Pretty Good Privacy」というソフトウェアがありますが、発表当時はまだアメリカの暗号規制がガチガチにかかっていて、インターネット上でPGPを公開した作者が輸出規制違反として捜査対象となる、という事件がありました。

そのさなか、作者は本を発表します。それは、「PGPのソースコードを印刷して本にした」ものでした。合衆国憲法修正第1条にあるように、出版物の検閲は法的にも行えないので、輸出規制で揉めているのを尻目に本は堂々と海外に輸出され、共感した海外のボランティアがこの本をOCRにかけて復元したソースコードから「国際版PGP」が作られるに至り、規制は公然と突破されてしまうこととなりました。本人に及んでいた捜査の手も、「合法的に拡散してしまった以上、もはや意味がない」ということで打ち切りとなったといいます。

このことや、インターネットショッピングなどで「暗号通信できないと不安」という経済界の声もあり、規制緩和が進んだ結果、十分な強度の暗号が(一部の国を除く)世界中で使えるようになっています。

SSLと輸出規制

SSL 2.01のリリースは1994年と、まだ暗号規制が行われているさなかであったため、当然ながら対策が求められることとなりました。具体的には、許可なしで扱えた強度の暗号(RSA 512ビット、共通鍵暗号40ビット2)を使う国際版と、128ビットなどフルに暗号をかける「アメリカ版」がブラウザで用意されていたほか、サーバ側でも輸出暗号を受け付けるようになっていました。

もちろん、通信内容の暗号化に使う共通鍵暗号は「適切」なものを使えるのですが、RSA 2048ビットの証明書のあるサーバで、RSA 512ビットの鍵交換はどうすればいいのでしょうか。ここで登場するのが一時的な鍵です。2048ビットの鍵で署名した512ビットの一時的な公開鍵をサーバからクライアントに送信して、こちらを使って鍵交換を行う、という仕組みとなっています。

なお、「一時的な鍵」とはいっても、サーバから署名して送っているように、2人にしか知られないものではなく、また処理負荷を考えて1日ぐらい使いまわしていたとのことで、現代のForward Secrecyとはまったく別概念です。

輸出暗号を破る

強度512ビットのRSAを使うこと、またその鍵を使いまわすことなどがあって、使いまわしているうちに鍵を因数分解できてしまえば、輸出暗号を受け付けるサーバ⇔クライアント間で、でダウングレードさせての中間者攻撃を行うことができます。

まず、中間者はクライアントからサーバへ提示するプロトコルリストを改ざんして、輸出暗号だけにします。そうすればサーバから512ビットのRSA鍵が来ますので、すでにこの公開鍵に対する秘密鍵が得られていればあとはこっちのものです。クライアントにはそのまま輸出暗号での接続を続けさせれば、サーバへの接続を構築しつつ、ネゴシエーションも完全に解読できるので、中間者攻撃が成立します。

亡霊 - FREAK

上述のような攻撃は1998年には報告されていたのですが、時は流れて2015年。どういうわけか輸出暗号を受け入れるままとなっているサーバが大量に存在し、そしてAWSなりでクラウドを借りれば512ビットRSAは半日ほどで解ける、というように、攻撃の方は格段に楽となっていました。そして、もはや時代として求められていないはずの輸出暗号を、ブラウザなどクライアントサイドで受け入れてしまうという脆弱性があって、この期に及んで輸出暗号を使った攻撃が成立してしまうという事態となりました。

対策としては、

  • サーバサイド…輸出暗号をオフにする
  • クライアント…輸出暗号を受け入れないようにする

ということで、古い暗号を受け付けるままとなっているのは、時として脅威となる、という話でした。

脚注


  1. SSL 1.0はプロトコルレベルで脆弱性があったため、リリース前に取り下げられています。 

  2. 実際に使うアルゴリズムはRC4(128ビット)やDES(56ビット)ですが、40ビットを超える鍵を平文で送って、わざと強度を落としていました。