個別にカスタマイズした攻撃を仕掛ける

悪質な「JavaScript」がますます狡猾になっている

2007/04/23

 悪質な「JavaScript」が、ますます狡猾になっている。Arbor Networksの上級セキュリティエンジニアであるホセ・ナザリオ博士によれば、今日のJavaScriptは、標的のWebブラウザや脆弱なコンポーネント、アクセス可能なクラス識別子(CLSID)を特定したり、個別にカスタマイズした攻撃を仕掛けたりすることも可能だという。

 ナザリオ氏は、「NeoSploit」と呼ばれる新たなマルウェアツールが、少なくとも7種の異なる手段の中から標的の弱点を衝くものを選択し、PCへの感染を広げている事実を把握したと述べている。

 「過去数カ月の間に、この種の攻撃や悪質なJavaScriptが大量に出回った。JavaScriptがより自己防衛的に、なおかつ攻撃的に悪用されるケースが増えている」(ナザリオ氏)

 ナザリオ氏は4月18日に現地で開かれたセキュリティイベント「CanSecWest」に出席し、JavaScriptマルウェアのリバースエンジニアリングに関する講演を行った。同氏によれば、自らの身元を隠し、セキュリティシステムに攻撃を検知されないよう、これまで以上に洗練された構造を持つコードが多数発見されるようになったことから、JavaScriptの悪用が防衛的な色を濃くしていると判断したのだという。

 悪質なJavaScriptは、例えば「adodb.Stream()」や「setSlice()」オブジェクトなどを用いてWebブラウザ攻撃を行い、ときには「ActiveX/VBScript」コンテンツを生成して、システムにマルウェアをダウンロードする。最も単純なスタイルの偽装JavaScriptは、固定的なコード検査を阻害する曖昧なコードを使用し、これによって作者のコード作成方法や意図を秘匿している。偽装の手法には、シンプルな「ASCII chr()」もしくは「ord()」テクニックを使うものからBase64エンコーディングまで、あるいはHTMLを隠したり、スプリットおよびジョイントを配列してAJAXオブジェクトを作成したりするために「iWebTool HTML Encrypt」などのツールを用いるものまで、幅広く存在している。

 こうした目的でスプリットを配列する際は、次のような文字列が使われる場合がある。

Daxhi="A"+pplica"+"tion";

Vvu=".";

 このような文字列を含む悪質なコードは人間の目にはすぐに見抜かれてしまうが、自動検知機能を回避するには有効だと、ナザリオ氏は説明している。

 また、二重の偽装工作を施す攻撃者も見られるという。単純なジョイントもしくはスプリットや、シングルエンコーディングに加えて、カスタムデコーダを用いるなどのダブルエンコーディングが行われているのだ。一部のユーザーはそうした攻撃を解読するWebブラウザを好んで利用しているが、Webブラウザがゼロデイ状態にある場合は、この対策では完全な情報を取得するまでに時間が掛かり過ぎるので危険だと、ナザリオ氏は警告した。

 同氏は、「NJS」などのツールを使って、WebブラウザからJavaScriptエンジンを切り離す方法を推奨している。NJSは、ネットスケープが開発し、ECMAが標準化したJavaScript言語のスタンドアロン型インタープリタで、リエントリ性、拡張性、機敏性に優れ、プログラミングも可能になっている。そのほかのデコードツールには、Mozilla FoundationのJavaScript-Cエンジン「SpiderMonkey」や、100%Javaで記述されたオープンソース版 JavaScriptの「Rhino」などがある。

 ナザリオ氏も指摘したとおり、ダブルエンコーディングが施されたマルウェアのリバースエンジニアリングには、原則としてHTMLの除去とコマンドライン上でのデコードが必要になる。その結果、さらに解読しなければならないコードが生成され、これ以上暗号化をしなくてもよくなるまで同じプロセスが繰り返される。

 もっとも、「常にこううまくいくわけではない。あらゆる検査方法を回避する自己防衛的なJavaScript(のコードサンプル)が、山ほど出回っている」と、ナザリオ氏は述べた。

 例えば、NJSは「arguments」については関知しないので、攻撃者は「arguments.callee」を悪用して、自作コードを改変できないようにすることがある。calleeはargumentsのプロパティの1つで、無名関数に自分自身を参照させるためのあらゆる関数オブジェクトにおいて有効な、ローカル変数として機能する。再帰的なストリングを記述するのに必要なものであり、これが実行されると無限ループが起こって、リバースエンジニアリングの障害となる。

 ナザリオ氏は、SpiderMonkeyを効果的な対策として挙げた。SpiderMonkeyは、「alert()」および「print()」といった特定の関数を無効化するので、コードの解読を阻むためにこうした関数を使う攻撃者に対抗できるのだ。研究者はこれらの関数を無効化したうえで、 Pythonなどのほかの言語を利用し、リバースエンジニアリングを続行すればよい。

 つまるところ、攻撃者はJavaScriptをマルウェアの運搬手段として悪用するようになっていると、ナザリオ氏は言う。同氏いわく、身を守るためにまずすべきことは、JavaScriptを理解し、味方に付ける術を会得することだ。JavaScriptは比較的簡単な言語であり、学習するのにそれほど苦労は伴わない。

 幸いにも、WebブラウザでJavaScriptが使用される際にはデコードが必要になるので、同言語を悪用する攻撃者の行動はいまのところ制限されている。そのうえ、攻撃者がコード自体、もしくはその意図の偽装に使っているツールも、まだ成熟していない。それでも、コードの分析には人間の目が不可欠であることを考えれば、こうした原始的なツールでも十分に事足りると、ナザリオ氏は警鐘を鳴らした。

 いずれにせよ、JavaScriptマルウェアが今後の脅威となる可能性は大きい。ナザリオ氏は、「これからJavaScriptマルウェアの暗躍が始まるだろう」と予測し、さかんにもてはやされているWeb 2.0のように、マルウェア2.0が活気づく日も遠くないかもしれないと述べた。

原文へのリンク

(eWEEK Lisa Vaas)

情報をお寄せください:



@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)