以前のブログでは、W32.Stuxnet が用いるインストールの制御フローについて説明しました。今回のブログでは、この脅威がどれほど複雑なのかをもう少し詳しく紹介し、特にこの脅威が利用するさまざまなファイルと各ファイルの目的、ファイルごとの署名の有無について説明します。
Stuxnet のメインのペイロードは UPX 圧縮された .dll ファイルであり、感染したリムーバブルドライブに存在するファイルの 1 つに、エンコードされた形で格納されています。UPX 圧縮されたこの .dll ファイルをデコードして圧縮解除すると、その中には以下のように多くのファイルが含まれていることがわかります。
UPX 圧縮された .dll ファイルには 13 種類のリソースがあり、それらのリソースファイルの種類もさまざまです。この中には、実行可能ファイルやデータファイル、エンコードされているファイルやエンコードされていないファイルもあります。
13 個のリソースのうち、8 個はエンコードされた実行可能ファイルです。これ以外にも、別の実行可能ファイルを含むエンコードされたキャビネットファイルが 1 個、エンコードされていない実行可能ファイルが 1 個、リムーバブルドライブ上に .lnk ファイルを作成するためのテンプレートとなる .lnk ファイルが 1 個あり、残り 2 つのリソースはデータファイルで構成されています。
各ファイルは、以下のカテゴリに分けられます。
- 2 つの .sys ファイル。カーネルモードのルートキット機能に使われます(実際に、リソースには 1 つの .sys ファイルしかありませんが、それが 3 つ組み込まれた形になっています。ルートキットに利用されるもうひとつの .sys ファイルは UPX 形式 .dll ファイルの別の場所に組み込まれています)。
- 1 つの ~WTR4141.tmp のコピー。リムーバブルデバイスに感染するとき使われます。
- 2 つの .dll ファイル。正規のソフトウェアとの対話に使われます。
- 1 つの .exe スタブ。他のプロセスへのインジェクト時にテンプレートとして使われます。
- 1 つの .lnk テンプレート。リムーバブルデバイス上にカスタムの .lnk ファイルを作成するときに使われます。
- 2 つの .dat ファイル。
.sys ファイル
.sys ファイルは、カーネルモードのルートキットに使われるデバイスドライバで、Stuxnet はこれを利用して自身のファイルを隠蔽することができます。どちらの .sys ファイルにも正規の署名があり、Microsoft のバージョン情報も含まれています。
1 つのファイルに、ある会社の署名があり、別の会社のバージョン情報もあるというのは珍しいことですが、以前にもこのような正規のファイルが確認されたことがあります。しかし、ここで問題になっているファイルは悪質なものでありながら署名されており、きわめて異例です。
2 つの .sys ファイルは、%System% ディレクトリに Mrxcls.sys および Mrxnet.sys として投下されます。その目的は、「.lnk」拡張子の付いたファイル、または「~WTR」で始まり「.tmp」で終わるファイルを隠蔽することにあります。Stuxnet は、このようなファイル名をリムーバブルドライブに感染するときに使います。.sys ファイルは、これらのファイルを隠蔽する機能を果たします。
~WTR4141.tmp のコピー
リソースの 1 つに ~WTR4141.tmp のコピーがあります。~WTR4141.tmp は感染時にリムーバブルドライブに投下されるローダーファイルです。このファイルで注目に値するのは、リソース内にあるときだけ有効な署名を持っているという点です。
このファイルがリソースから抽出されてリムーバブルデバイスに投下されると、ヘッダーの 1 バイトが以下のように変更されます。変わるのは、TimeDateStamp の 1 バイトです。
この変更によって署名が無効になるため、リムーバブルデバイスに投下されたファイルを調べると、署名がないことがわかります。
偽装された .dll ファイル
リソースのうち 2 ファイルには、自身を正規のファイルとして報告する情報が含まれています。
もちろん、どちらのファイルも正規のものではなく、いずれも署名されていません。2 つとも .dll ファイルで、小さい方の .dll ファイルは Ntdll.dll の API をフックして別の悪質な .dll ファイルをロードし、その .dll ファイルから特定のエクスポートを呼び出します。これは、Stuxnet に関する私のブログで以前に紹介した手口と同じです。
大きい方の .dll ファイルは、正規の .dll ファイルのラッパーであり、そのラッパー .dll ファイルは s7otbxsx.dll と同じ関数をすべてエクスポートします。
このラッパー .dll を使って正規の .dll ファイルに対する呼び出しを傍受し、対象の関数をすべてフックしたうえで、この呼び出しを正規の .dll ファイルに渡します。こうすると、アプリケーションによってアクセスまたは要求されているどのようなデータも改変できます。これがどのように動作するか、ラッパー .dll ファイルのエントリポイントを見てみましょう。
上のスクリーンショットでわかるように、ラッパー .dll が最初に実行するアクションは、エンコードされた文字列をデコードし、その文字列を使って LoadLibrary を呼び出すことです。デコードされた文字列は「s7otbxsx.dll」です。ラッパー .dll ファイルが、対象とする任意のデータを変更した後で正規の .dll ファイルに呼び出しを渡すには、正規の .dll ファイルをロードする必要があります。
ラッパーの動作をさらに詳しく理解するために、ラッパー .dll ファイルからのエクスポートの 1 つを調べてみます。
ここで調べるのは、ラッパー .dll ファイルで s7H_start_cpu というエクスポートが呼び出されるときに実行されるコードです。次のスクリーンショットに、このエクスポートのコードを示します。
このエクスポートのコードが、0x0Fh をスタック上にプッシュして別の関数を呼び出します。その関数を次に示します。
正規の .dll ファイルからのエクスポートは、アドレス 1000BE56 で呼び出されていることがわかります。ラッパー .dll ファイルは、このエクスポートのデータを傍受も変更もしておらず、単に要求を受け取って実際の .dll ファイルに渡しているだけです。
ラッパー .dll ファイルからのエクスポートをそれぞれ調べたところ、フックされるエクスポートとフックされないエクスポートを特定することができました。シマンテックでは、フックされるエクスポートを識別し、現在は攻撃者の意図を探るために解析を進めているところです。フックされるエクスポートの一部は、ブロックの読み取り、書き込み、検出、削除に関係しているようです。これらは、攻撃者が正規のユーザーからデータの一部を隠蔽しようとするときにフックする典型的な関数です。この点についての詳しい情報は、間もなくお届けできる予定です。フックされる可能性があるエクスポートは、次のとおりです。
- s7_event
- s7ag_bub_cycl_read_create
- s7ag_bub_read_var
- s7ag_bub_write_var
- s7ag_link_in
- s7ag_read_szl
- s7ag_test
- s7blk_delete
- s7blk_findfirst
- s7blk_findnext
- s7blk_read
- s7blk_write
- s7db_close
- s7db_open
- s7ag_bub_read_var_seg
- s7ag_bub_write_var_seg
この点については現在まだ解析中です。
.exe スタブ
リソースには、他のプロセスへのインジェクトに利用されるテンプレートも含まれています。このテンプレートを使って、正規のプロセスのメモリが上書きされます。次に、攻撃者がインジェクトしようとするデータがテンプレートに埋め込まれ、インジェクトされた exe に制御が渡されます。
.lnk テンプレート
リソースには、リムーバブルデバイスから初期段階で脅威をロードする際に必要な .lnk ファイルのテンプレートも含まれています。リムーバブルドライブに追加される各 .lnk ファイルは、そのドライブに合わせてカスタマイズされます。そのため、リソースにはテンプレートの .lnk ファイルが含まれており、Stuxnet はそのテンプレートを改変して、感染するリムーバブルデバイスに適した固有の .lnk ファイルを作成します。
以上のように、この脅威にはさまざまなファイルが含まれています。各ファイルはまだ解析の途中ですが、解析の進行に応じて引き続きこのブログで情報を公開していきます。今回の記事では、関連するファイルとその目的に焦点を当てました。まだ解明できていない点はたくさんありますが、今後のブログでは、動作の細目がわかり次第、Stuxnet の機能をさらに詳しくご報告します。
W32.Stuxnet について詳しくは、こちらをクリックしてください。
このブログに掲載した解析結果を提供してくれた、Nicolas Falliere 氏と Karthik Selvaraj 氏に感謝します。
* 日本語版セキュリティレスポンスブログの RSS フィードを購読するには、http://www.symantec.com/connect/ja/item-feeds/blog/2261/feed/all/ja にアクセスしてください。