架空のメモリーを作成し検出を避ける、新種のトロイの木馬

2011/05/06

Trojan.DownLoader (TDL)は、新たなマルウェアをダウンロードするトロイの木馬です。先日、McAfee Labsでは、新たな亜種を発見しました。この亜種は、昨年発見されたTDL3に近い特徴を持っています。このルートキットは、TDL3と同様、実行ファイルのリソースフォルダーにコードを挿入することにより、ドライバーに寄生して感染していきます。その中で、架空のメモリーを作成しセキュリティソフトの検出を避けようとする新種を確認しましたので、ご報告します。

今回新たに発見したケースでは、感染したファイルはvolsnap.sysという名前にハードコード化されていました。また、TDL3の初期の亜種と同様、このルートキットも、ハードディスクのデバイススタックのディスクの下にあるドライバーの、ディスパッチテーブル(IRPフック)のポインターにフックしました。しかし、非常に興味深いことに、一部のセキュリティソフトでは、通常ならば容易に特定できるディスパッチテーブルのフックが検出されませんでした。また、外部のデバッガー(WinDbg)で破壊することもできませんでした。

フックが報告されなかった理由は、セキュリティソフトが読み取ったメモリーが現実のメモリーではなかったためです。実際にはフックされていましたが、セキュリティソフトが「確認」したディスパッチテーブルはフックされていないよう偽装されていました。興味深いことに、メモリーはmov命令では正しいアドレスで読み取られましたが、フックされた可能性があるシステムAPIは使用されていませんでした。

マルウェアの作者がこのような技法を用いるのは、セキュリティソフトがフックを検出できないようにして、管理者に疑わしい活動を警戒させないためであることは明らかです。では、どのようにして読み取りアクセスを行うメモリーを作成するのでしょうか。このルートキットは、ハードウェアブレークポイント(DRXレジスター設定)を使用して、修正したカーネルのメモリー領域へのアクセスを監視します。DR0レジスターの改変に加えて、KiDebugRoutineポインターにフックして、メモリーアクセス時にハードウェアブレークポイントが見つかると通知を受けられるようにします。このルートキットはIRPフックをインストールし、DR0レジスターをIRPフックがインストールされているメモリーアドレスに設定します。そのため、ディスパッチテーブルのメモリーが読み取られると、フックされていない「偽の」イメージが、マルウェアのKiDebugRoutineフックによって提示されます。以下は、KiDebugRoutineフックコードの概要です。

これは、マルウェアのKiDebugRoutineハンドラーコードの先頭部分です。ブレークポイントが見つかると、例外が発生したスレッドの命令ポインターをインクリメントし、処理済みとして返します。そうでなければ、ジャンプします。

KiDebugRoutineハンドラー:スニペット1

次に来るのは、上記loc_403BCCのジャンプ先です。カーネルモードアドレスで例外が発生した場合、loc_404026にジャンプします。

KiDebugRoutineハンドラー:スニペット2

通常、上記のジャンプ先では、まず、アクセスフラグの確認、DR6レジスターの消去などにより、例外が処理されます。次に、以下のコードを使って、これが保護されたメモリーへの読み取りアクセスかどうか、このアクセスをブロックしたいかどうか確認します。これら2つの条件が真の場合、マルウェアが作成したいコンテンツを含むメモリー領域に読み取り位置が改変されます。このように、マルウェアに嫌われた人は、架空のメモリーを読み取ることになります。以下のコードのコメントで詳細が説明されていますが、コードのESIの仮説は興味深いものです。

KiDebugRoutineハンドラー:スニペット3

このように、セキュリティソフトに架空のメモリーを読み込ませ、検出を避けるという技法は以前から論じられてきましたが、実際の脅威で確認したのは初めてです。

今回の例は、最近のルートキットが新たな技法を導入し、急速に進化していることを改めて示しているといえるでしょう。実際、このマルウェアの後にも、マスターブートレコードに感染する最新のマルウェアも確認されており、これらは、ハードディスクのデバイススタックに偽のデバイスオブジェクトを作成します。McAfee Labsでは、今後も引き続きこのような脅威を調査し、対策を提供していきます。