Multi-layer Obfuscated JavaScript Using Twitter API」より
April 16,2010 posted by Tamas Rudnai

 現在のIT部門にとって最大の脅威は、マルウエアに感染したWebページではないだろうか。マルウエアに感染したHTML文書は大抵の場合、活動内容を隠しておくために、JavaScriptで攻撃用コンテンツを動的に生成するようになっている。セキュリティ検査で発見されないようにするため、こうした攻撃の手口はどんどん複雑化している。今回分析するのは、自動解読エンジンをごまかす細工と5段階の難読化が施されたサンプルだ。

 分析対象はWebページに感染した6Kバイトの難読化JavaScriptであり、解読していくと最後に攻撃用サイトを指す一つのiframeタグが現れる。攻撃者は暗号表やXOR演算代入暗号に加え、古典的な文字入れ替えといった手法を組み合わせることで、最終的なコンテンツを隠そうとしている。当ブログでも以前こうした難読化手法をいくつか紹介した

 解読するには、ペイロードとなっているこのJavaScriptをそのまま実行するのではなく、真の姿を現すようにコードを少し変更しなければならない。奇妙なコードだが、見た目では悪質かそうでないか判別できない。

 未加工のコードを眺めるだけでは、難読化スクリプトであると分かるだけで大した情報は得られない。セキュリティ専門家は、必ずこうしたコードに強い疑念を抱く。というのも、作者がコードを難読化したということは、何らかの理由で隠しごとをしているからだ。ここでコードをうまく整形すれば、少し読みやすくなる。ちなみに、このコードは二つに分けられる。以下に示した一つ目の部分には、非常に短い関数と変数定義が一つずつ入っているだけだった。

 このコードで変数に入力している値は、長すぎるし、アルゴリズムの理解に不要な情報なので省略した。二つ目の部分には、以下に示した通り別の関数と、一つ目の部分にあった関数を呼び出す処理がある。

 上記コードは、関数z()のラッパーとしての機能しかない関数t()を呼び出している。この処理の目的は、簡単な解読妨害工作にすぎないと見てよいだろう。そこで二つ目のz()だけを分析する。ここでは「Z」だけ別の文字に変える単純な代入暗号を使っていることが一目で分かる。さらに代理文字を使う処理もあるが、復号は関数unescape()だけで行う。この処理の最後で関数eval()を呼び出している。解読したコードを表示するために、この関数をprint()に書き換えよう。

 この解読結果は最初のJavaScriptと異なる内容だが、まだ意味不明である。現在出回っている悪質なJavaScriptsは、複数回の難読化を施されたものが多い。難読化を繰り返したコードの解読作業については、当ブログでも取り上げた。解読を進めるにつれ、コードの新たな詳細情報が手に入る。ただし分析に役立つ情報もあれば、そうでないものもある。

 上記データ列の最後にURLがはっきりと書かれていることに気付いただろうか。これは間違いなく調べた方がよい。我々はここでも整形ツール(もう少し格好よく呼べば「コード美化ツール」)を使い、何が隠されているか確認した。