まずは前回の続きから。ランタイムパッカーによるマルウェアの難読化を背景として、ここ2、3年の間、情報セキュリティ関連のカンファレンスなどでは、これらパッカーに関する講演や発表が多数行われている。つまり、ランタイムパッカーに関する調査研究はマルウェア研究者間の「ホットトピック」のひとつであり、とくにアンパック(ランタイムパッカーを動作させて、本来のコードを抽出させること)の自動化についてはさまざまな手段が開発されている。

ところで、今回使用した検体をVMware上で動作させると、図1のようなダイアログボックスが表示され、感染動作は発生しない

図1 今回使用した検体をVMware上で動作させると表示されるダイアログ

これは、なにも検体が壊れているというわけではない。VMware仮想環境を検知するコードを具備しており、それが動作したことを示しているのである。

ここで別の資料を参照してみることにしよう。JPCERT/CCから公開されている「ボットネットの概要」という報告書である。この報告書では、"ボット"と呼ばれるマルウェアの一種が構成するネットワークであるボットネットについて詳細に解説が行われている。そして、この報告書の9ページ目「2.3.3 自己防衛」の「(3) デバッガ・仮想環境対策」には、代表的なボットであるAgobot(別名 Phatbot/Gaobot)を解析した結果判明した事実のひとつとして、以下のようなくだりがある。

Agobotは、デバッガ上またはVMware等の仮想システム上で実行されていることを検出する機能があり、これを検出した場合、活動を停止したり、自分自身を消去するものがある。

この報告書が公開されたのが2006年の7月であるから、この当時からすでにVMware環境上で動作した場合、その環境を検知し、感染活動を抑制するマルウェアが存在していたことになる。また、もう少し古い文献としてHoneynetプロジェクトの"Know Your Enemy:Tracking Botnets"があるが、こちらは2005年の2月である。

VMware検知

それでは、VMware検知を行っているコードに注目してみよう。図2をご覧いただきたい。

図2 VMware検知を行っているコード

このままではまったく意味不明であるため、少し補足説明をしよう。なお、この説明のための参考文献は「仮想な背中」というサイトの解説である。

図2はVMware環境検知を実施するアセンブラコードである。そして、これら一連のコードは特定の手順を踏むことで「VMwareに固有なI/Oポート」にアクセスを行い、アクセスに成功した場合得られる結果を用いて、VMware環境上で動作しているかどうかを判別する、ということを行っている。

つまり、そもそもVMwareには基本的に非公開のI/Oポートが設定されており、それを使用することで実環境と仮想環境間の情報交換を実現しているのである。このしくみの有無を調査することで、仮想環境かどうかがわかる、というわけである。それを行っているのが上記のコードなのだ。

そして、その結果「VMware仮想環境で動作している」と判別した場合には、0x00000000といった通常アクセスできないメモリ領域から命令を読み出す、といった命令を実行することでアクセス違反を発生させる。その結果、検体は感染動作を行うことなくプロセスが強制終了される。その結果、表示されるのが図1のダイアログボックスなのである。

感染端末のプロファイリング

実際にはVMware環境のチェックの前に、検体は別の処理を行っている。その処理とは「感染端末のプロファイリング」である。具体的には、以下の2つの処理を行う。

  • 感染端末のInternet Explorerのキャッシュのチェック
  • 感染端末のキーボードレイアウト(言語)の確認

なぜこのような処理を行うのか、その理由を推察する前に、具体的なその処理の内容に目を向けてみることにしよう。

今回の検体は、Internet Explorerのキャッシュをチェックし、次のようなサイトに感染端末がアクセスしていないかどうかを確認する(アクセス先ページのリンクにマルウェアが含まれるといった問題があるため、具体的なドメイン名は避けた一般表記とする)。

  • ロシアのソーシャルネットワーキングサイト
  • ロシアの検索サイト
  • マルウェア配布サイト
  • ドイツ語の情報セキュリティ対策サイト
  • 英語の情報セキュリティ関連掲示板
  • ロシア語の情報セキュリティ関連掲示板

これらのサイトにアクセスした形跡(キャッシュの残存)があれば、今回の検体はプロセスを終了させる。つまり、感染動作を発生させない。さらに、キーボードレイアウトが次の言語であった場合も、感染動作を発生させない。

  • ロシア
  • チェコ
  • ウクライナ
  • ブラジル