Lenovoが最悪クラップウェア「Superfish」で失った信用の大きさ

西方望

March 13, 2015 19:00
by 西方望

新しいPCを購入し、セットアップを終えてOSが起動したあと、頼んでもいないプログラムが大量にインストールされているのを見て、嫌な気分を味わったことはないだろうか。セキュリティソフトの試用版あたりはまだしも、見栄えも使い勝手も悪いランチャー、どうでもいいショッピングアプリ、つまらないゲームや体験版、初心者向けと称するがほぼ初心者にも役に立たない解説アプリの数々……。愚にも付かない代物がデスクトップやスタート画面を埋め尽くし、ディスク容量や場合によってはメモリも無駄に消費している。この手の無駄なプリインストールソフトウェアは「crapware(ごみソフト)」「bloatware(水増しソフト)」などと呼ばれる。メーカーによっては、個人向けだけでなく法人向けモデルにまでクラップウェアが入っていることがあり(さすがに個人向けよりは少ないが)、うんざりさせられる。

だが、うんざりする程度ならまだ良かったのだ。今年の2月、中国Lenovo(レノボ)製ノートPCにとんでもないクラップウェア…… いや、ほとんどマルウェアといえる代物がプリインストールされていたことが発覚した。それも、悪意ある攻撃者が密かに仕込んだとかクラックしたとかいう話ではない。メーカー自身が意図的に入れていたものなのだ。その名は「Superfish」。Superfishは、ユーザーがWebを閲覧する際に、Lenovoがコントロールする広告を勝手に挿入する。「うんざり」どころではない。ユーザーの同意なく通信を覗き、改竄しているというのだ。これだけでも許しがたい話だが、Superfishの悪質さはそれにとどまらない。Superfishの問題は、以下の2点だ。

  • ルート証明書を勝手にインストール
  • CAの秘密鍵がすべての製品で共通

これがどういうことなのか、詳しく見ていこう。

通常のWebブラウザーとサーバー間の通信、つまりHTTPプロトコルを使った通信では、その内容は全く暗号化されていない。誰かが通信を覗くことができれば、内容は丸見えだ。これではクレジットカード番号の入力など、秘密を要する行為はできない。そこで、SSL(Secure Sockets Layer)というプロトコルにより、暗号化された通信を行う方法が考えられた。これがHTTPS通信だ。SSLは、単に暗号化を行うだけでなく、正しい相手と通信しているかを認証する機能も持つ。なお現在は、SSLから発展したTLS(Transport Layer Security)プロトコルを使う方が一般的だが(SSLがなくなったわけではない)、TLSまで含めて「SSL」と呼ばれることが多い。

だが、Webサーバーとの通信はどうやって暗号化したらいいのか。データを暗号化して送り出すだけなら簡単だが、それを元に戻す(復号)ためには、当然「鍵」が必要となる。その鍵をユーザーはどうやって入手すればいいのだろう。誰からも見えるWebページに鍵を置いておくのでは意味がない。そもそも全ユーザーが同じ鍵を使うのなら、暗号化していないのと同じだ。となると、ユーザーがWebサーバーを利用する際、個別に鍵を発行してもらうことになるが、その鍵自体は暗号化せずに送るしかないので、盗聴に対して無力だ。

これを解決するのがSSLだ。SSLでは「公開鍵暗号」と呼ばれる暗号化/復号方式を用いる。公開鍵暗号方式は、暗号化と復号に別の鍵を用いるのが特徴だ。セットになった2つの鍵があり、片方は「公開鍵」、もう1つは「秘密鍵」と呼ばれる。そして、公開鍵で暗号化したデータは、秘密鍵でしか復号できない。たとえて言うなら、両方が同じ鍵を持つ方式(共通鍵暗号)は、箱に鍵をかけて送り、受け取った側は同じ鍵(共通鍵)で箱を開けて中身を取り出すようなものと言える。これに対し公開鍵暗号方式は、箱に南京錠をかけて送るようなものだ。これを開けることができるのは、鍵を持っている人物だけだ。

共通鍵暗号では、誰からも見える所に鍵を置いたのでは意味がないというのは先ほど述べたとおりだが、公開鍵は誰もが使える状態でも問題ない。だから「公開」鍵なのだ。SSLで通信を行う場合、Webサーバーはブラウザーに対し公開鍵を送る。ブラウザー側は、そのたびごとに異なる一時的なデータを生成し、サーバーの公開鍵を使って暗号化して送る。Webサーバーはそれを受け取って秘密鍵で復号する。これで両者が盗聴の危険にさらされることなく同じデータを持つことができ、これを元に共通鍵暗号の鍵を生成する。同じデータから同じアルゴリズムで作られた鍵なので、ブラウザーとサーバーは同じ鍵を持つことになったわけだ。あとはこれを使って暗号化・復号して通信すればよい。

これで安全に鍵の交換ができ、暗号化した通信を行えるようになったわけだが、まだ問題はある。ユーザーは通信相手が「本物」なのかどうやって確認すればよいのか。ブラウザー上で確かに「amazon.co.jp」に接続しているように見えても、例えば攻撃者が通信の間に入り込んでいる(Man-in-the-Middle:MITM、中間者攻撃)場合、この偽装は簡単だ。相手が偽サイトでは、「これがamazon.co.jpの公開鍵ですよ」と言って送って来たものを使っても、単に経路が暗号化されるだけで、情報は当然相手に筒抜けだ。つまり、それが本当にamazon.co.jpの公開鍵なのかを保証する仕組みが必要になる。

これを保証するのが、認証局(Certification Authority:CA)と呼ばれる機関だ。認証局は、企業や個人からの申請(身元を証明する情報が必要)を受けて、それぞれの公開鍵に対していわば「お墨付き」を与える。具体的には、それぞれのドメイン名や公開鍵などから生成したデータをCAの秘密鍵で暗号化したもの(署名)だ。公開鍵にこの署名の他、所有者や有効期間などの情報を加えたものを、サーバー証明書と呼ぶ。SSLによる通信で最初にサーバーから送られて来るのがこのサーバー証明書だ。

SSLで使われている暗号方式は、秘密鍵で暗号化したものは公開鍵だけで復号できる、という性質も持つ(これ自体は公開鍵暗号方式の要件ではない)。だがこれは要するに誰でも復号できるということだから、暗号としての意味はない。しかし、対応する秘密鍵によって作られたもの、つまり秘密鍵の所有者が発行したものであるいう確認はできるわけだ。ブラウザーはサーバー証明書の署名をCAの公開鍵で復号する。それがWebサーバーの公開鍵と一致すれば正しい「お墨付き」であることになり、この公開鍵を送ってきたのは間違いなくCAが認めたところのamazon.co.jpであると分かる。

しかし、CAの公開鍵はどうやって入手したらいいのかといえば、実はOSやブラウザーが持っているのだ。OSやブラウザーのベンダーが「信頼できる」と見なしているCAの証明書(公開鍵を含む)は最初からインストールされている。こういった証明書は「ルート証明書」と呼ばれる。ユーザーはOSやブラウザーを信頼し、OSやブラウザーのベンダーはCAを信頼し、そのCAがWebサーバーの身元を保証するという構図だ。

これにより、普通の中間者攻撃ではSSLの通信を覗いたり改竄したりするのは非常に困難となる。Aという人物とamazon.co.jpの通信の間に入り込んだ中間者が盗聴する場合を考えてみよう。これは、A-中間者、中間者-amazon.co.jp、という2つの経路に分かれる。中間者-サーバー側の通信は特に問題ない。amazon.co.jpが送ってきた証明書を中間者が確認し、普通に暗号化通信をするだけだ。

だが、A-中間者の方は難しい。中間者がamazon.co.jpになりすましてAと通信することになるわけだが、中間者はamazon.co.jpの電子証明書を持っていない。本物から送られた証明書をそのままAに渡した場合、Aはamazon.co.jpの公開鍵で暗号化したデータをamazon.co.jpに送る。中間者は容易にこれを入手できるが、当然amazon.co.jpの秘密鍵は持っていないので、復号は不可能だ。つまり共通鍵はAと本物amazon.co.jpの間でだけ共有され、これで暗号化される。中間者は中身が見られないままデータを受け渡す役目しかできない。なら、中間者が自分でサーバー証明書を発行したらどうだろう。しかしこれも通用しない。中間者が「amazon.co.jpですよ」と主張する証明書には、当然ながらブラウザーが信頼しているCAによって発行された署名がないので、ブラウザーが警告を出すことになる。

さて、ここからが本題だ。このようにHTTPS通信に対しては通常の方法では中間者攻撃ができないのだが、SuperfishはHTTPSであっても広告を挿入、つまり通信内容を改竄するという中間者攻撃を行っていたのだ。これはどうやっていたのか。Superfishは、中間者であると同時にCAとして動作する。そして、ユーザーがアクセスしたサイトの証明書をその場で作成し、ユーザーに送るのだ。だがこれだけなら、上で述べたのと同様にブラウザーが警告を出してしまう。そこでLenovoは、Superfishのルート証明書も製品にプリインストールした。つまり、Superfishによる「お墨付き」があれば、ブラウザーが信頼してしまうようにしたのだ。これでHTTPSでも勝手に広告を入れ放題というわけだ。

これだけでも十分不愉快な話だが、問題はさらに大きい。SuperfishのCAが偽証明書を作成する際、当然ながら秘密鍵を使って署名を行う。だがこの秘密鍵は、すべてのSuperfishで同じものが使われているのだ。そしてSuperfishの解析の結果、今やその秘密鍵は誰にでも知ることができてしまう。これが何を意味するのかといえば、誰にでもSuperfish CAによる「お墨付き」が作れるということだ。悪意を持った攻撃者がこれでサーバー証明書を作り、Superfishのルート証明書がインストールされているPCがそこに接続したら、無条件で信頼してしまうことになる。もちろん中間者攻撃にも利用できる。

さらに、この問題が発覚してからのLenovoの対応も酷いものだった。当初のプレスリリースでは「我々は本アプリケーションを徹底的に調査しましたが、セキュリティ上の懸念を実証するいかなる証拠も見つかりませんでした」と言っているのだ。冗談ではない、むしろ「懸念しかない」代物ではないか。このプレスリリースは後で修正され、今では上の文言は削られているが「なかったこと」にはならない。以下のように「Web Archive」にしっかり残っている

むろん、Lenovoがユーザーに害を与える意図を持ってSuperfishをインストールしたのかどうかは分からない。だが、ユーザーの同意を得ずに通信内容を覗き、改竄するソフトにセキュリティ上の懸念を感じないとしたら、コンピューター企業としての基本的な常識が欠けていると言わざるを得ない。また「徹底的に調査」したと言っているが、第三者による悪用の可能性は少し調べればわかることだ。

社会とはそもそも「信頼」で成り立っている。私たちは普段、車のエアバッグから金属部品が飛んでこないか、エレベーターが突然動き出して挟まれはしないか、冷凍食品に毒が入っていないか、といった心配はせずに暮らしている。社会と、社会内存在としての人間や企業を暗黙的に信頼しているからだ。だからこそ、それが裏切られる事件は大きな騒ぎとなる。

コンピューターの世界でも同じことで、技術的にどのような工夫をしようとも、セキュリティにどれほど気を配ろうとも、最終的に私たちはメーカーを信頼するしかないのだ。ハードウェアやOSの段階で、悪意ある仕掛けをされたらもはやどうしようもない。Superfishは、いわば食品メーカーが意図的に毒を入れていたに等しい。毒だとは思っていなかった、というのは言い訳にはならない。加えて言うなら、食品メーカーが「ピーナッツでアレルギーが起きることがあるとは知りませんでした」と言っているようなものだ。ユーザーの信頼を踏みにじったLenovoが今後支払うことになるツケは、決して小さなものではないだろう。




ビール祭りにやってきた犯罪者を「顔認識」で一網打尽

November 13, 2017 08:00

by 牧野武文

中国山東省青島市で開催された国際ビール祭りで、青島市開発区警察は、会場に顔認識システムを設置。公安部保有のデータベースと照合することで、犯罪者を抽出し、逮捕するという作戦を実行した。49名の逃亡犯、麻薬犯罪者、スリなどを逮捕する成果をあげたと『新浪科技』が伝えた。 10万人以上がやってくるイベント …

PacSec 2017レポートソフトバンクPepperが危険な理由

November 10, 2017 08:30

by 『THE ZERO/ONE』編集部

米国のセキュリティ企業「IOActive」に所属するセキュリティエンジニア、ルーカス・アパ氏が「スカイネットが来る前にロボットをハックする」と題してロボット、特に家庭向けの製品に関するセキュリティ・リスクについて「PacSec2017」で講演を行った。 家庭用のロボットはリスクだらけ ルーカス氏はネ…