SSLとオープンソース
OpenSSLは、SSL(Secure Socket Layer)という、インターネットで安全な通信を行うための仕組みを提供するオープンソースのソフトウェアを指します。リナックスといったオープンソースのOSで利用される一方、ウィンドウズやmacOSにも対応しており、macOSでは標準で搭載されています。
もともとSSLとは、かつて存在したネットスケープ(Netscape)社の考案した仕組みで、同社はSSLに対応したWEBブラウザであるネットスケープナビゲータ(Netscape Navigator)を無償配布する一方、SSLに対応したWEBサーバソフトウェアを有償で販売し、収益を上げていました。
そんな中、SSLの仕様をもとに、いちから作り直した「SSLeay」というソフトウェアがオープンソースで発表され、ここから発展してOpenSSLが登場しました。
OpenSSLは、HTTPSなどSSLによる通信機能を提供する一方、MD5(与えられた入力に対して128ビットのハッシュ値を出力するハッシュ関数)やSHA1(与えられた入力に対して160ビットのハッシュ値を出力するハッシュ関数)などといった、安全な通信のために必要になるダイジェストを計算する機能や、SSLの通信で必要になる電子証明書を作成する「opensslコマンド」を提供するなど、インターネットを安全に使うために必要なものがひととおり入っています。そのため、1990年代末から今に至るまで、リナックスなどオープンソースのOSで広く使われているのです。
OpenSSL以外のSSL
macOSの場合はというと、コアサービス(CoreServices)に「Security.framework」というセキュリティ機能を担うフレームワークが存在します。メールやサファリなど、macOSのネイティブソフトウェアはすべてこのフレームワークを利用して、SSLによる通信を実現しています。
ただ、macOSにはOpenSSLも搭載されています。WEBサーバソフトウェアの「Apache」など、オープンソースソフトウェアがOpenSSLを前提に作られているためです。すべてを「Security.framework」を置き換えるように書き換えるより、OpenSSLも搭載しておいたほうが手っ取り早いというわけです。
狙われるOpenSSL
近年、インターネットショッピングなどが一般的になっていくにつれ、その安全性を担うSSLへの攻撃が深刻化してきました。 OpenSSLも徹底的に攻撃され、致命的な問題も何件と見つかっているのです。
OpenSSLはmacOSやリナックス以外にもウィンドウズなど多くの環境で動作するように作られていることもあり、非常に大量のソースコードでできています。また、古くから存在するため、今はもう使われていないかもわからないソースコードも多々あり、見とおしが悪く、改善がしづらい部分もあります。とある環境向けの修正が、結果としてほかの環境で重大なセキュリティ上の問題を引き起こした、などという事件も起きてしまっているのです。
OpenSSLも適宜問題の修正を行いアップデートをしていますが、今後も攻撃は続くことが予想されます。修正を迅速に行うためにも、ソースコードの整理は急務となったのです。
より安全なLibreSSL
そこで、「OpenBSD(オープンソースのUnix系オペレーティングシステム)」の開発チームが主導してOpenSSLをリファクタリングし、互換性を保ちつつもより安全性の高いライブラリに作り直した「LibreSSL」が開発されました。
OpenBSDはセキュリティを重視した、より安全なOSを開発しようというプロジェクトで、ファイアウォール機能の「PF(Packet Filter)」や、コマンドラインでのリモート接続を実現する「OpenSSH」など、従来よりセキュリティが高く、オープンソースで誰もが使えるソフトウエアを発表しています。PFやOpenSSHをはじめとして、macOSでも多くのOpenBSD由来のソフトウェアが利用されています。
しかし、OpenSSHもOpenSSLの機能を利用する形で実装されているのです。いくら安全なソフトウエアを作っても、利用しているライブラリが安全でなければ、安全性は保てません。そのため、LibreSSLが作られたのです。
macOSのOpenSSH
macOSでは少しだけ事情が異なります。OS X 10・8 マウンテンライオンまでは、ほかのOSと同じく、OpenSSHはOpenSSLを利用しています。ところが、OS X 10・9 マーベリックスではOpenSSLを利用せず、「osslshim」というモジュールを追加して、OpenSSHの中で処理しています。
osslは「OpenSSL」の略称でよく使われるもので、shimとは「隙間に埋めるもの」を意味し、プログラミングの世界では「上手くつながらない2つのコードの間を埋め合わせするもの」を意味します。つまり、osslshimはAPIが異なるため交換できないOpenSSLとSecurity.frameworkの間を埋めて、OpenSSHの必要とする機能をSecurity.frameworkのもので代替する、ものです。これにより、マーベリックス以降はもはやOpenSSLを使っていないともいえるのです。
そして実は、OS X 10・11エルキャピタン以降では、さらに変更が加えられています。同じ機能を提供するとはいえAPIが異なるSecurity.frameworkに代替させるのも複雑だったためか、今度はOpenSSH専用にLibreSSLを用意し、OpenSSHの中に組み込んでしまったのです。LibreSSLもOpenSSH も同じOpenBSDのプロジェクトで、お互いの親和性がよいため、この変更も悪いことではありません。ともあれ、macOS でOpenSSHを使う分においては、OpenSSLの問題とは少しだけ離れていられます。
OS X 10.9~10.10の場合
OS X 10.9以降はOpenSSLの利用をやめ、純正のSecurity.frameworkを使用していました。ただ、この2つではAPIが異なるため、間を取り持つosslshimをSSH側に組み込んでいます。
OS X 10.11~macOS 10.12の場合
OS X 10.11からはosslshimをやめて、SSH側にlibresslの必要部分を直接埋め込んでいます。なお、OpenDirectoryとの通信など、ほかの機能が使うこともあり、Security. framework自体は今もダイナミックリンクされています。
【 FirefoxとNSS 】
WEBブラウザの「ファイアフォックス(Firefox)」は「NSS(Network Security Service)」という、SSLなど安全な通信を行うためのライブラリを自前で用意しており、どのOS上でもOSの提供するSSL機能ではなく、このNSSを使っています。ちなみにNSSは、ネットスケープ社が開発していた安全なネットワーク通信のためのライブラリが元になっています。
【 AndroidとSSL 】
iOSではmacOSと同じく、「Security.framework」を使っています。では、アンドロイドではどうでしょう? アンドロイドでは長らくOpenSSLが使われてきました。もちろん本家のOpenSSLに脆弱性が発見されるたびに修正は行われてきましたが、アップデートがすべてのアンドロイド端末に提供されているかはかなりの疑問です。ちなみに、アンドロイド6.0からはOpenSSLを元にグーグルが修正を行った「Boringssl」というソフトウェアが搭載されています。
【MS】
現在マイクロソフトではOpenSSHをウィンドウズ向けに移植していますが、こちらでもOpenSSLを使用せず、OS標準のSSL機能を使う見込みです。
【修正】
ちなみに、OpenSSLだけが攻撃にさらされているように思えるかもしれませんが、そういうわけではありません。NSSもSecurity.frameworkも脆弱性を発見され、何度も修正を行っています。
文●千種菊理
本職はエンタープライズ系技術職だが、一応アップル系開発者でもあり、二足の草鞋。もっとも、近年は若手の育成や技術支援、調整ごとに追い回されコードを書く暇もなく、一体何が本業やら…。