Malicious Code Evolution from IE Zero-Day Exploit Code」より
March 19,2010 posted by Tim Xia

 「Internet Explorer(IE)」を標的にするゼロディ・エクスプロイトは目新しくなく、我々はIEが登場した当初から悩まされてきた。今回取り上げるIEの最新ゼロディ・エクスプロイト「CVE-2010-0806」も、これまでに現れたものと同様で驚くに当たらない(関連記事:チェックしておきたいぜい弱性情報<2010.03.24>)。ただし、内部の変化については注目が必要だ。このエクスプロイトのコードは、存在が世間に知られてからわずか1週間で多くの亜種を生み出している。当社(米ウェブセンス)のセキュリティ・ラボがWebベースの脅威からユーザーを保護する目的の「ThreatSeeker Network」で集めた情報を参考にして、同エクスプロイト・コードの進化を解説しよう。

 セキュリティ・ベンダーはエクスプロイトの検出を目指し、マルウエアの作者はコードの検出回避に最善を尽くすものだ。両者が繰り広げるこの終わりのない戦いでは、コードを隠すことが戦局の鍵となる。以下に挙げる3種類の隠ぺい手法は、ハッカーが好み、現在も高い頻度で使い続けているものである。

中核コードの難読化

 中核コードは攻撃用コードの中心であり、攻撃の主目的を担っている。実体は一つのシェルコードであることが多く、パソコンへの侵入に成功するとリモート・サーバーからファイルをダウンロードして実行する。ハッカーは中核コードを難読化することで、真の目的を隠す。

アルゴリズム・コードの難読化

 アルゴリズム・コードは、中核コードを確実に実行するためのヘルパーの部分。アルゴリズム・コードはエクスプロイト・コード全体から選び抜かれた重要なコードなので、セキュリティ・ベンダーは見つけるための努力を惜しまない。侵入の準備を整える目的のJavaScriptコードであることが多い。ハッカーはアルゴリズム・コードを暗号化して動作の痕跡を減らし、検出を避ける。

コード位置の難読化

 攻撃用コードを調べる場合、まずはスクリプトとiframeタグの中にコードがあるかどうか探すことが多い。しかし、iframe以外のHTMLタグも攻撃用コードを隠すにはよい場所だ。よく使われるのはpタグとdivタグだが、inputタグとtextareaタグのこともある。コード隠ぺい目的で使われることの多いもう一つの方法は、攻撃用コードを複数のファイルに分けて入れるコード分割だ。当然ハッカーは、コード検出を避けるためにコードの位置を分かりにくくする。

 今回のIEに対するゼロディ攻撃で、マルウエアの作者たちはオリジナル版をベースに多くの別バージョンを作ってきた。これら亜種を簡単なバージョンから順番に調べていこう。下に示す最初の図は、通常のスクリプト・タグ内に定数形式で記述された中核コードとアルゴリズムだ。

 上記コードは極めて容易に読めて理解できてしまうため、この例では納得できないかもしれない。そこで中核コードとアルゴリズム・コードにそれぞれ簡単な難読化を施すが、それでもまだ読める。この手口に馴染みのない人もいるだろうが、我々は何度も目にした。詳しくは「Gumblar」攻撃に関する過去記事(英文)を参照してほしい(関連記事:進化し続けるGumblarとは)。この種の難読化を実行する方法はたくさん存在するし、我々も数多くの事例を知っている。以下に例を二つ掲載しておく。これを見ればどのような手法か分かるはずだ。

 この例だと、中核コードの動作内容はあらかじめ簡単に理解できる。ところが「隠れん坊」好きは理解を邪魔する新たな手口を採用したのだ。このコードを複数の、場合によっては大量のファイルに分けることで、読んだり理解したりしにくくするどころか、存在に気付くことすら難しくしてしまった。

 次の図は、上記のコード隠ぺい手法を適用した上で、難読化済み中核コードをHTMLタグに移動させた例だ。

 以下の例は、極めて単純な小細工である。関数と変数の名前がすべてランダム化されているため、コード全体が読解不可能に見える。

 最後の例は、アルゴリズムがさらに読みにくく難読化されている。非常に複雑なので、完全にデコードしない限り本来のコードを知ることはできない。それでも、我々はこれ以上に困難な例に出会ったことがある。当ブログでは2009年6月の「Beladen」攻撃を取り上げ、難読化がどのように強化されたかについてと、コツコツとコードの解読に取り組むのが好きな人でもさじを投げてしまうほど繰り返し施された難読化について説明した(関連記事:「難読化を繰り返して検出を困難に」――工夫を凝らすWebウイルス)。

 様々な難読化の手口を見てきたが、幸いなことに我々は「Gustav」という優れたツールを持っているので、難読化は調査時の障害にならない。GustavはHTML/JavaScriptコードを読み込み、シミュレータで動かして最終的なコードを出力するので、長い時間をかけて解読する必要がないのだ。Gustavの詳細については、後日紹介する。


Copyrights (C) 2010 Websense, Inc. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,ウェブセンスの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログWebsense Security Labs Blogの記事を抜粋して日本語化したものです。オリジナルの記事は,「Malicious Code Evolution from IE Zero-Day Exploit Code」でお読みいただけます。