Lenovo製のPCの一部にSuperfishというマルウェアが標準でインストールされていることが確認され、大きな問題となっています。
- [2015-11-24追記] DELL製のPCにも、「eDellRoot」とされるSuperfishと同様の問題を持つルート証明書が導入されているようです。
- DellのPCに不審なルート証明書、LenovoのSuperfishと同じ問題か - ITmedia エンタープライズ
- Dude, You Got Dell’d: Publishing Your Privates - Blog - Duo Security
- Joe Nord personal blog: New Dell computer comes with a eDellRoot trusted root certificate
https://t.co/chURwV7eNE eDellRootでサインしたgoogleの証明書の例。任意のサイト、コードに署名が可能に。
— 高梨陣平 (@jingbay) 2015, 11月 24
経緯や影響範囲等については、Kangoさんの記事にまとまっているのでそちらをご覧ください。
この記事では、Superfishというマルウェアがなぜ特別に危険かを解説します。
Superfishの目的
このSuperfishの目に見える目的は、ブラウザで表示しているウェブサイトに広告を挿入することです。言い換えれば、ウェブサーバから取得したHTMLを書き換えて勝手なJavaScriptを挿入するすることにあります。
目的だけ見れば一般的なアドウェアの一つとも言えます(もちろんそれだけでevilだと個人的には思います)が、Superfishはさらに踏み込んで、普通のやり方では書き換えができない暗号化されたウェブサイトを書き換えるために特殊な方法を利用していますが、その実装方法に大きな問題があるために、広告が挿入されるというレベルをはるかに超えた脆弱性となっています。
前提として、TLS──いわゆるSSLは、ウェブサイトの通信内容を秘匿するだけで無く、その内容の改竄を防ぐことも目的としています。そのため、SuperfishではMITM攻撃と呼ばれる手法で、このTLSの暗号化通信に「穴」を開けています。
TLS(いわゆるSSL)による安全な通信
まず、通常の暗号化された通信を見てみます。
安全に通信を行うためには、自分(のPCで動いているブラウザ)と、その通信相手のウェブサーバの他に、様々な基準によって信頼されたCA(認証局)を利用します。
ウェブサーバは、暗号化するための「秘密鍵」とウェブサイトのドメインネーム(このページで言えば「d.hatena.ne.jp」)が書かれた「証明書」を持っていますが、あらかじめこの証明書に、CAの「お墨付き」の判子を押してもらっておきます(図の1)。
その一方で、ブラウザは自分が信頼できるCAの一覧を持っています。これがルート証明書のリストと呼ばれるものです(図の2)。
安全な通信がしたいときに(3)、まずブラウザはウェブサーバから証明書を送ってもらい、そこに押された判子を見ます(4)。そして、その判子を押したCAが、自分のルート証明書のリストに含まれていることを確認します(5)。このときに、証明書に書かれたドメインネームや有効期限についてもあわせてチェックします。
ここで何か一つでも問題があれば、赤いバッテンとかで警告されてしまうわけです。
MITM攻撃
それでは、具体的にSuperfishが何をやっているか見てみます。
ざっくり言うと、2つのことをやっています。
- ブラウザとウェブサーバの間の通信を乗っ取るプログラムを動かす
- ブラウザに、乗っ取り用のルート証明書を追加する
やはり最初にブラウザがウェブサーバから証明書を送ってもらうのですが(1)、Superfishがその通信を横取りしてしまいます。
Superfishは、そのプログラムの中に小さなCAを持っていて、ブラウザが通信しようとしていたウェブサーバのドメインネームでニセの証明書を作成し、Superfish CAの判子を押してブラウザに返します(2)。本来ならばSuperfish CAなんて得体の知れないCAは信頼されていないので警告が出るのですが、Microsoftの決めた基準に反して、Lenovoが勝手にこのSuperfish CAを信頼するように設定してPCを販売しています。
そのため、ブラウザはSuperfish CAの判子が押された証明書を信じてしまうわけです(3)。
こうなってしまえばもうSuperfishのやりたい放題で、一旦そこで暗号も解かれてしまうので、あらためて本来の通信先ウェブサーバから取得したHTMLにJavaScriptを組み込んでブラウザに返すことができるようになります(4)。
このように、ブラウザとサーバの間に入り込んで暗号化を攻撃するため、MITM──すなわち、Man-in-the-Middle 攻撃と呼ばれています。
Superfishの問題点
TLSの暗号化は、以下のような前提があって初めて機能します。
- ブラウザは、信頼できるCAのルート証明書の一覧を持っている
- CAの判子(署名)は、第三者が勝手に押せないよう「CAの秘密鍵」を秘密にしなければいけない
- サーバは、その秘密鍵を秘密にしている (CAですら各ウェブサーバの秘密鍵のデータは知らない!)
ところが、ブラウザに勝手に追加されてしまったSuperfish CAは、その秘密鍵を適切に管理していません。具体的には、なんとそのPC上に組み込まれたSuperfishのプログラム内にあります!これは、通信時にリアルタイムでニセの証明書を作って判子を押すために仕方無いことではあります。さらに、このSuperfish CAの秘密鍵や証明書はあらかじめ用意されたもので、全世界すべてのSuperfishで共通のものが使われていました。
となれば、あとは様々なソフトウェアのクラック技術を使えば、誰かのPC上に保存されたプログラムを調べるだけでSuperfish CAの秘密鍵を取得することができます。
恐ろしいことに、Lenovoが紹介している対応方法(電子証明書を利用したWEBサイトにログインできないについてのお知らせ)では、Superfishの通信を書き換えてMITM攻撃をしているプログラムは停止、削除しますが、ブラウザに登録されたSuperfish CAのルート証明書は削除をしません。
これが最悪です。
何が起こるか
ブラウザにはSuperfish CAとやらのルート証明書が信頼できるCAとして登録され、このCAの秘密鍵は誰もが知ることができます。
何が起こるかと言えば、誰でも勝手にウェブサーバの証明書を作成して判子を押して、ブラウザに信頼してもらうことができます。
さらに言えば、Windowsではソフトウェアにも判子による作成者チェックがありますが、それすらもすり抜けることができ、たとえば別の手段を併用してWindows Updateに紛れ込ませることで、OSのコンポーネントを差し替えることすら可能かもしれません(あくまで可能性レベルで未検証です)。
こうなってしまえば暗号化も電子署名も何もあったものでは無く、TLSとかSSLとか無かった1990年代初頭に逆戻りです。Heartbleedも裸足で逃げ出すレベル。
そのほかのリスク
また、SuperfishプログラムによるMITM攻撃そのものにも問題があります。本来はウェブサーバの証明書に押された判子の確認(サーバ証明書の検証)をSuperfishプログラムがやっているわけですから、ウェブサーバが送ってきているはずの正しい証明書をブラウザは知ることができません。
そのため、例えば様々な追加情報を表示してくれるはずのEV証明書(いわゆるアドレスバーが緑に染まる奴)も機能しませんし、Superfishの実装が手抜きをしていれば、本来期限切れや、さらに別の第四者による攻撃など別の理由でエラーとなるはずの誤った証明書を知らずに受け付けてしまう可能性もあります。
あとは、Superfishが本来のウェブサーバにアクセスしている暗号化通信に関しても、適切な設定が行われていれば同等ですが、もしブラウザよりも実装の品質が低い場合、暗号化通信の内容自体が解読されやすくなっている可能性もあります(例: DHEにブラウザは対応していたはずなのにSuperfishが非対応のためPFS性が無くなっていた、など)。これはあくまで未検証ですので可能性の話にすぎません。このあたりは、続報が出てくるまで冷静に注視が必要と思います。
どうすれば「まだまし」だったのか
例えばウィルス対策ソフトなど、使用者の適切な同意があったうえでどうしても通信内容を見たいのであれば、ウェブサーバ側から来た証明書のチェックをブラウザと同じように適切に行った上で、Superfish CAのような全世界で共通なんて手抜きをせず、PC別ユーザ別に秘密鍵を生成するのであれば、あきらかな脆弱性ではなくなります。また、EV証明書なども、動的に作るニセ証明書をうまく作り込むことで「それっぽく」見せることは可能かもしれません。
とはいえ、それでもセキュリティ上のリスクが大きく拡大するのは確かなので、MITMなんて手法に頼るのは可能な限り避けるべきだと個人的には考えます。
どうすれば良いか
既にチェックサイトが用意されているので、まずは確認しましょう。
自分のブラウザにSuperfish CAが登録されていなければ、「Good, Superfish is probably not intercepting your connections.」など安全そうな表示が出ることでしょう。表示内容は執筆時点のものなので今後変わる可能性があるのでちゃんと文章を読んでください。
もしSuperfish CAが登録されてしまっていた場合には、ルート証明書を削除する必要があります。
手順についてはたぶん明日になればどっかから出てくと思うのでそれを見てください……。
細かい補足
- 実際には、今回ターゲットとされているWindowsでは、IEやChromeはブラウザ個別ではなく、Windowsが提供しているルート証明書のストアを共用しています。Windows Updateなども対象となる可能性があるのはこのためです。その一方でFirefoxはOSに依存せず個別に持っています。
- 「判子」まわりは当然ながら公開鍵と電子署名のメタファですが、細かく厳密に書くと一冊の本ができあがるので、今回をきっかけに興味を持った方には以下の本を紹介します。
- 基本的に、開発者のデバッグ用途を超えるような、特に一般利用者向けのMITMは腹を切って死ぬべきだという立場です。なぜならそのリスクを利用者に十分に説明することが現実的では無いからです。
- MITM攻撃は、日本語としては中間者攻撃とも呼ばれます。ただでさえ簡略化した説明なので、先入観が無い方が良いという考えから敢えてこちらで表記しています。