カテゴリー別アーカイブ: 未分類

脆弱性の歴史からみるWindows XPのウイルス感染過程

もうみなさんご存じでしょうが、2014年4月8日をもってWindows XPのサポートは終了しました。
先週、先々週あたりはXPから早くアップデートしろだの、XPは窓から投げ捨てろだの騒がしくなってましたね。

ニコニコ動画には、Windows XPサポート切れをあつかった自主制作アニメまで上がっていました。

ざっくりまとめてしまうと、社内のXPで怪しいソフトをインストールしてしまって大変なことに…。みたいなお話。XPユーザーはドキッとしてしまうような内容ですね。

でも、なんか違うんだよなー。

だって、怪しいソフトをインストールしちゃいけないのは、Windows8だろうと、Linuxだろうと変わらないじゃないですか。(いわゆるトロイの木馬ですね)

Windows XPが危ないって伝わったひとでも、実際のところどう危ないのかってことまではわかってないひとは多いんじゃないでしょうか。Windows XPを脅かす“脆弱性”とはどういうものなのか?これまでの脆弱性を振り返ることで見ていきたいと思います。

ここ半年のWindowsのセキュリティ情報をながめる

Windowsには毎月のように脆弱性が発見されています。これは、XPだけでなくVista, 7, 8でも同じことです。XPサポート終了が問題になるのは、この毎月のように発見されている脆弱性が修正されなくなるからです。

では、脆弱性というのはいったいどういうものなのでしょう?

脆弱性がどういうことものなのかを理解するのに手っ取り早いのは、これまでにあった脆弱性を知ることです。Windowsの修正ずみの脆弱性についてはマイクロソフトのサイトで公開されています。

マイクロソフト セキュリティ情報

以下に、2013年9月から2014年3月までに公表された脆弱性のうち深刻度「緊急」のものの一部を挙げていきます。

ぱっと眺めてみただけで、やばさはわかると思います。特に注目すべきことは以下のことです

  • 脆弱性のあるソフトウェアでは、ウェブページを閲覧したり、画像を閲覧したり、フォントを閲覧したり、メールを閲覧したりするだけで、ウイルスに感染させることが可能だということ
  • これらに、怪しいソフトウェアをインストールしたり、怪しいメールの添付ファイルを開くなどの危険とされる操作は必要ないということ
  • 脆弱性のうちいくつかは修正より前に公開されてしまって、だれでも攻撃ができる状態になってしまうこと
  • Windows8, 7, Vista, XPに共通する脆弱性は多いということ
  • Windows8, 7, Vistaの脆弱性にこれからも修正や情報公開をしていくが、XPの脆弱性は修正されないということ。つまり、Windows8, 7, Vistaの更新内容から、XPの持っている脆弱性がある程度推測できるということ

脆弱性があるということは「ちょっとした過失でウイルスに感染しうる」ことだと思っているひとは多いかもしれません。脆弱性があるということは「何の過失がなくてもウイルスに感染しうる」ということです。むしろ、「脆弱性の放置されたPCを使い続けること自体が、過失である」とも言えます。

攻撃者はどうやって悪意あるWebページを閲覧させるか

Windows XPの脆弱性をねらう攻撃としてありそうなものは、閲覧するだけでウイルスに感染するようなメールを送りつけることや、閲覧するだけでウイルスに感染するようなWebページに誘導するなどがあります。

ここでは、攻撃者が悪意あるWebページを閲覧させる方法を掘り下げてみます。怪しいWebページになんて見なければいいんだろうと思う人もいるかもしれませんが、そう簡単ではありません。

泥棒はスーツを着ている

空き巣にもっともポピュラーな服装はスーツであるという話があります。悪意ある人間と同じように、悪意あるサイトもいたって健全そうな見た目をしていることはよくあります。

ある攻撃サイトは、GoogleやYahoo検索の上位に上がるようなサイトをつくることで、ページの閲覧者を増やします。ある攻撃サイトは中古のドメインを利用して、例えばもともと映画の公式サイトがあったURLにサイトをつくります。FC2や、はてなブログ、Tumblrのようなフリーのブログサービスなどを攻撃に使うことも可能です。こういった手法をつかわれると、リンクをみて怪しいサイトかどうかを判断するのはほとんど不可能です。

それだけではありません。もっとメジャーなSNSから攻撃されることもありえます。

クロスサイトスクリプティングでTwitterやYoutubeから攻撃をする

不特定多数のユーザーに対してWebページを閲覧させる方法の1つは、XSS(クロスサイトスクリプティング)を使う方法です。このXSSに対する脆弱性というのは、いままでTwitter、YouTube、Facebook、Yahoo知恵袋にも見つかった脆弱性です。

XSS脆弱性があるユーザー投稿型のサービスでは、特定のテキストを投稿するとそのテキストを閲覧した人に対してJavaScriptを実行させることが可能になります。

例えば、SNSなどのユーザー名やタイトルに

<script>document.location = "http://google.com"</script>

というテキストを含めた投稿を行うと、タイトルやユーザーが表示されるはずの場所で、

document.location = "http://google.com"

というテキストがJavaScriptとして解釈されて、閲覧者は、Googleのトップページに飛ばせる場合があります。わかりやすいのが、Yahoo知恵袋の例です。

<script>alert("xss");</script> これであなたもおしまいです。 – Yahoo知恵袋

ただ、タイトルに <script>alert("xss");</script> という文字が含まれているだけの質問ですが、当時はこのページの閲覧後に他の質問を閲覧すると、画面上に”xss”というポップアップが表示されるようになっていました(現在は修正ずみ)。

上の質問では、ただ文字を表示するだけでしたが、alert(“xss”)の代わりに別のJavaScriptが使えば、悪意あるWebページを表示したり、アカウントのログインに必要な情報を盗んだりすることも可能な状態になっていました。

とても単純な脆弱性ですが、このような脆弱性はめずらしいものではなく多くの有名なWebサービスでも見つかっています。

XSS脆弱性があったサービス

その他の悪意あるWebページを閲覧させる方法

  • 審査の甘い広告サービスを利用した広告枠からの攻撃(マルバタイジング)
  • 中間者攻撃
    • 例えば、無料Wifiスポットに偽装したWifiスポットで、偽のWebページを閲覧させる。
  • DNSキャッシュポイズニング
    • google.comやyahoo.co.jpなどのドメイン名がどこのサーバーを指しているのかを解決するサーバー(DNSサーバー)の脆弱性を狙った攻撃。成功すれば、例えばhttp://www.yahoo.co.jpを閲覧しようとしている人に対して、偽のページを表示させることができる。

悪意あるWebページを表示させる手法はいろいろあります。

結論

Google検索しか使わなくても、Twitterしか使わなくても、Youtubeしか使わなくても、Facebookしか使わなくても、悪質なWebページを閲覧する危険性がある。

Windowsだから危険なのか?

Windowsの脆弱性についてばかり取り上げていますが、これは決してWindowsが他のOSに比べて脆弱性が多いという意味ではありません。例えば、Linuxなどにも同じように脆弱性は存在しています。

Linuxの安全性を語るときによくいわれるのは「オープンソースなので脆弱性が少ない」ということです。しかし、オープンソースであっても、ごく単純な脆弱性が発見されることなく放置されていた例というのはいくつもあります。

オープンソースのバグで記憶に新しいのはOpenSSLの、HeartBleedです。重大な脆弱性ですが、2年間も存在していました。長いものでは、X Windowの22年間放置されていたユーザーが昇格できる脆弱性というのもあります。

これらのバグを生んだソースコードは誰でも閲覧可能だったわけです。ソースを公開していないWindowsの脆弱性よりも、はるかに見つけやすかったはずです。オープンソースであることは、かえって攻撃しやすい原因にすらなります。

Linuxに対するウイルスは確かに、Windowsに対するものより少ないです。ただし、これはデスクトップPCのLinuxユーザーが少ないからという理由につきると思っています。スマートフォンのシェアの半数以上を握るAndroidは攻撃の的になっていますしね。

まとめ

サポート期限切れのソフトだと、メールをただ閲覧しただけ、いつものSNSやWebサイトを閲覧してるだけで、ウイルスに感染するよ!

ユーザーとしてできること

ソフトウェアを使う側としてできることって、当たり前なことを当たり前にやるってことぐらいしか思い浮かばないです。Linux、Windowsだの、Internet Explorer、Chromeだの関係なく以下のようなことはやっときましょう

  • OSはちゃんとアップデートしましょう
  • ブラウザやメールクライアントなどのソフトもアップデートしましょう
  • セキュリティソフトを使いましょう

脆弱性の話ばかりしたので、インターネットを利用することが怖く感じる人もいるかもしれません。ですが必要以上にインターネット自体を恐ろしく感じる必要は無いです。

悪意ある攻撃の話ばかりしてきましたが、実際のインターネットには善意があります。マイクロソフトのセキュリティ情報の謝辞の欄をみてください。ここには非公開の脆弱性をマイクロソフトに連絡してくれた方の名前がずらりと並んでいます。OSやブラウザの脆弱性を見つけるのは悪質なクラッカーだと思っている人は多いかもしれません。しかし実際には、善意をもった人たちが開発元への報告をしてくれたことで発見される脆弱性がほとんどです。

Internet ExplorerやWindows、Chromeなどの脆弱性は非公開で報告すれば多額の賞金が与えられます。大きな名誉も得られます。脆弱性を見つけたからといって、リスクを冒してそれを攻撃するメリットは大きくありません。

しかし、サポートの終了したソフトウェアは違います。公開されてしまった脆弱性で攻撃をすることができますし、それから守ってくれる人もいません。これが、サポートの終了したXPが危険な理由です。

開発者としてできること

じつは本当に言いたいことは、開発者に対しての話だったりします。安全なソフトウェアをつくるためにどうすべきかの話です。

Windowsのセキュリティ情報を読んでいると、「メモリ破壊による脆弱性」というものが多く出てきます。

メモリ破壊というのは、開発者が意図しないメモリへの書き込みが行われる脆弱性です。以下のバッファオーバーランなどがその代表例です。

IPA ISEC | バッファオーバーラン ~その1・こうして起こる~

メモリ破壊が不可能なことをメモリ安全であるといい、CやC++のような言語はメモリ安全でありません。メモリ安全でない言語では、ほんのちょっとした不注意によって非常に深刻な脆弱性が生まれてしまいます。

そして、C/C++のようなメモリ安全でない言語が、多数の脆弱性を生んできたというのは歴史的な事実です。

では、どうすればメモリ破壊による脆弱性を作らないことができるのか?これには単純で明快な解決策があります。

「メモリ安全な言語を使う」ということです。

ブラウザ、コーデック、メールクライアント、Webサーバー、バーチャルマシン、エディタ、動画・音楽プレーヤー、オフィスソフト。これらのソフトウェアは今でも多くがC/C++で作られていますが、これまでの脆弱性の歴史を考えればC/C++はこれらをつくるのに向いていません。

メモリ安全な言語を使用していればJPEG画像の閲覧などのプログラムで、任意のコードが実行可能な脆弱性の入り込む余地がありません。

C/C++と同様にネイティブコードを出力する言語であっても、D言語やGoはほとんどメモリ安全な言語です。

さらに、MozillaはC/C++を代替するためのメモリ安全な言語「Rust」の開発をしています。Mozillaはこの言語を使って、次世代のブラウザレンダリングエンジン「Servo」の開発にも取り掛かっています。

C/C++はもはや代替されるべき言語です。


ある程度の知識がある開発者がWindows XPを使用している人を見れば、「危険だ」「今すぐ新しいOSに変えた方がいい」「人にも迷惑がかかることだから自己責任では済まない」くらいのことは思うはずです。

しかし、メモリ安全でないCやC++でソフトウェアを作っている人を見て、「危険だ」「今すぐ新しい言語に変えた方がいい」「人にも迷惑がかかることだから自己責任では済まない」という人は、ほとんどいません。

不思議なことです。

メモリ安全でないCやC++を使い続ける人たちは、「気を付けて使えば大丈夫」「新しいことを覚えるのは大変なことだから」「コストがかかることだからそう簡単にはできない」と考えるのでしょうか。

でも、それってXPを使い続ける言い訳と何も変わらないように思えます。

2014/04/23: コメントより「メモリ安全」に関する記述を修正