我々は通常、長年にわたってマルウェアが発展、進化するのを見ている。我々がフォローしてきたマルウェアにはZeroAccessがあるが、これは2010年後半に初めて検出して以来、常に改良されている。代表的なのは、最新のサンプルで、自己削除ルーチンが変化している点だろう。

  これは実行後、ユーザから自身の存在のあらゆる痕跡も隠すための、手早くシンプルな方法として、ZeroAccessが自身を削除するのに使用されるシンプルなWindowsバッチファイルだ(クリックすると拡大):

zeroaccess_selfdelete (11k image)

  他の多くのマルウェアが、このバッチファイル自己削除メソッドを使用している。しかし最近、ZeroAccessは変貌しようとしており、アナリストの作業がより複雑になっているようだ。そのため、以下のコードが使用されている(コメント無しで表示):

zeroaccess_selfdelete_nocomments (20k image)

  現在、ZeroAccessは他のプロセスのコンテクストで、ひねりをきかせてコードを実行するため、Win32 EXEのダイナミックフォーキングを使用する。Win32 EXEを他のプロセスのメモリスペースにロードする代わりに、ZeroAccessは基本的に、カスタマイズしたスタックを準備して、それを他のプロセスのコンテクストに挿入し、そこでスタックスタックのシーケンスに従って実行される。

  以下のコメント付きコードは、ZeroAccessが使用する方法と従来の方法との違いを示している:

zeroaccess_selfdelete_commented (40k image)

  これが上手くいくには、ZeroAccessはWindowsのネイティブAPI「ZwWaitForSingleObject」を示すよう、命令ポインタレジスタの修正も行う。修正とカスタマイズしたスタックが整うと、同マルウェアは悪事を働きはじめ、消え去る。

  ResumeThreadがコールされ、リモートプロセスが実行されると、最初に修正された命令ポインタレジスタにより示されたZwWaitForSingleObjectを実行する。

  このファンクションは、コーラプロセスが停止するまで待たれ、リモートプロセスで実行を再開する。それは停止したプロセスハンドルを閉じるため、スタックのトップで次のインストラクションを実行し、スタックが増大すると次のファンクションを実行する。

  最終的にこれはZwSetInformationFileにFileDispositionInformationパラメータを用いて、自身を削除するファンクションを実行する。以下の図はカスタムスタックのオペレーションをまとめたものだ(クリックすると拡大):

zeroaccess_selfdelete_customized_stack (64k image)

  ちなみに最新のZeroAccessは以前のルートキット対応亜種と互換性を持つ。我々はどちらにも類似したコードを見つけており、これはルートキットデバイスオブジェクト「\??\ACPI#PNP0303#2&da1a3ff&0」をチェックする:

zeroaccess_selfdelete_check_existence (21k image)

  ZeroAccessルートキットがインストールされたマシンでは、特別に作成された値「STATUS_VALIDATE_CONTINUE」が返される。そうでない場合は「STATUS_OBJECT_NAME_NOT_FOUND」が返される。このチェックにより、マシンが既に以前のルートキット対応の亜種に感染していることを発見した場合、最新の亜種はルーチンの一部をスキップすることが可能になる。

  最後に、我々のカスタマはさまざまなシグネチャ、ヒューリステックおよびクラウドベースの検出により、新旧双方のZeroAccess亜種から保護されている。



Post by — Wayne