2012年9月11日火曜日

Rovnix.D : コードインジェクションの話

  • このエントリーをはてなブックマークに追加
以前、Rovnix.Dサンプルで変更に含まれていることを発見したbootkitの機能をご紹介しました。しかし、さらなる詳細な解析によって、採用されたコードインジェクション技術にいくつかの興味深い更新が明らかになりました。

Rovnix.Dコード分析プロセス中に、我々は動作(ペイロード)の範囲での複数のコードのインジェクション(挿入)のアルゴリズムを発見しました。

以前のバージョンではRovnixは単一動作をし、そしてRovnixの開発者はその特定の動作のための販売体制づくりに集中しました。新しいバージョンでは、ボットネットをより多くの方法でリースできるように開いている隠された記憶域から、起動したユーザモードプロセス中での複数のコードインジェクションを確認できます。

しかし、今、我々はRovnix.Dをベースとした大規模なボットネットは確認しておらず、C&Cは現在アクティブなボットの数が8,417個であることを示しています。

Rovnix.Dをベースとしたアクティブボット数:ESETセキュリティブログ


このC&Cは、bootkitの機能をもつCarberpバージョンのテストパネルとほぼ同じように見えます。このアクティブなボット数の少なさは、ボットマスターは現在新しいRovnix.Dの更新版を配布するための効果的なスキームを使用していなく、買い手を探していたり、将来のリースのためにボットネットをテストしていることを示唆しています。

感染したマシンとの通信インタフェースには2つのオプションがあります。

1つはコンフィグレーションファイルを更新するため、もう1つは感染したマシンに新しい動作を送るためです。コントロールパネルの中では、この機能は以下の図のように表示されます。

Rovnixコントロールパネル:ESETセキュリティブログ

このコントロールパネルのインタフェースは簡素で不完全のように思われます。なぜならこの時点ではボットをコントロールするために必要最小限の機能しか実装されていないからです。

本記事の次の節では、コードインジェクションのプロセスに関する技術的な詳細をより深く見ていきたいと思います。


■ コードインジェクションの技術

_PAYLOAD_CONFIGURATION_BLOCKの構造はすでにRovnixのbootkitについての我々の以前の刊行物のひとつに記載されています。ペイロード・コンフィグレーション・ブロックは悪意のあるドライバモジュールの中でセクションヘッダのすぐ後に格納されています。Rovnix.Dの中でペイロード・コンフィグレーション・ブロックの先頭のマーカーは"JFA"から"JF"に変更されました。

[図:Rovnix.Dの亜種]
Rovnix.Dの亜種:ESETセキュリティブログ

[図:Rovnix.Bの亜種]
Rovnix.Bの亜種:ESETセキュリティブログ

新規または追加の動作を入れる前に、最初のステップとして悪意のあるドライバはペイロード・コンフィグレーション・ブロックをパースします。このアクションのコードは次の図のとおりです。

不正ドライバーの動作:ESETセキュリティブログ


悪意のあるドライバから動作のルーチンを抽出するための完全なコールグラフを以下に示します。

コールグラフ:ESETセキュリティブログ

ExtractPayloads()のルーチンは、ドライバの初期化段階の後に動作を抽出しますが、悪意のあるドライバの中に既に格納された暗号化された動作と共に動きます。Rovnix.Dは他の動作をダウンロードし、ユーザモードプロセス内に複数のインジェクションを行うためにそれらを隠された記憶域にインストールすることができます。

Rovnix.Dの複数のコードインジェクション:ESETセキュリティブログ

インジェクションのための動作のリスト隠された記憶域のパーティションにあるINJECTS.SYSのコンフィグレーションファイルに保持されます。悪意のあるドライバの現在のバージョンから、隠されたファイルシステム(FAT16を改変したもの)を使ったオペレーションのフルサイクルをサポートしたリリースを確認できます。

・ファイルの作成
・ファイルの読み書き
・ファイル情報(サイズ、作成日時、など)の要求
・ファイルアクセス情報の要求

この時点ではディレクトリを操作する機能はサポートされておらず、常にSTATUS_NOT_IMPLEMENTEDのステータスを返します。

この動作は、以下のコードと共にDeviceloControl()を使う際に、悪意のあるドライバへリクエストを送る事ができます。

・0x8E040 - ファイルシステムに関する情報を要求
・0x8E0C0 - 隠された記憶域に新しい動作を追加
・0x8E100 - アクティブなユーザモードプロセスのコンテキストに(から)動作を挿入(削除)
・0x8E080 - 隠された記憶域から悪意のある他のドライバを実行

動作の入った再構築された二重リンクリストは次のような構造体を持っています。


リストの構造体:ESETセキュリティブログ


動作のインジェクションのために、非同期プロシージャコールのキューをベースとしたメカニズムが使われ、新しいプロセス(PsSetCreateProcessNotifyRoutine()のコールバックをベースとしたコードインジェクションの技術)を作るときに動作のリストを見ます。プロセスインジェクションのワークフロー内の関数のコールグラフは以下のフローグラフで表現されます。

コールグラフ:ESETセキュリティブログ


悪意のあるドライバからデコンパイルしたQueueAPC()関数のコードは以下の図のとおりです。

QueueAPC()関数のコード:ESETセキュリティブログ

従って、悪意のある動作はカーネルモードのコンポーネントと通信でき、ユーザモードプロセスへ続けてインジェクションするため、もしくは新しい未署名のドライバをロードするため隠されたファイルストレージに新しいコンポーネントとバッファを送信できます。

カーネルモードとユーザーモードの流れ:ESETセキュリティブログ


ユーザモードの動作から受信したバッファを使った悪意のあるドライバから挿入されたコードを実装しているコードをデコンパイルしたものは以下の図のとおりです。

デコンパイルしたコード:ESETセキュリティブログ

インジェクションのためのアルゴリズムは、異なった動作の、続けて使う異なったプロセス名のインジェクションのためにプロセスの名前をチェックできます。

Rovnixは本当に興味深いbootkitですが、今回がこの話題の終わりではありません。我々は、新しいサンプルの追跡と、Rovnixコンポーネントのリバースエンジニアリングを続けています。


出典:blog.eset.com
  • このエントリーをはてなブックマークに追加

ページの先頭に戻る