今回は、W32.Stuxnet の制御フローについて説明します。この脅威はリムーバブルドライブを経由して感染を広げますが、現時点でMicrosoft から脆弱性の修正パッチが提供されていないこともあって、大きな注目を集めています。ただし、それ以外にもいくつか新しい興味深い事実がありますので、ここではそれらの点について少し紹介してみたいと思います。
この脅威に感染したリムーバブルドライブには、次のようなファイルが存在します。
-
Copy of Shortcut to.lnk(コピー~へのショートカット.lnk)
-
Copy of Copy of Shortcut to.lnk(コピー~コピー~へのショートカット.lnk)
-
Copy of Copy of Copy of Shortcut to.lnk(コピー~コピー~コピー~へのショートカット.lnk)
-
Copy of Copy of Copy of Copy of Shortcut to.lnk(コピー~コピー~コピー~コピー~へのショートカット.lnk)
これらのファイルは、"
Microsoft Windows のショートカットLNK ファイルでファイルが自動実行される脆弱性" (BID 41732)を利用していますが、この脆弱性の修正パッチは現時点で提供されていません。
感染したリムーバブルドライブには次のファイルも含まれます。
-
~WTR4141.tmp(約25KB)
-
~WTR4132.tmp(約500KB)
これらのファイルはいずれも.dll ファイルで、ファイル名はハードコードされています。
この脅威がコンピュータ上で活動を開始すると、脅威のルートキット部分によってこれらのファイルが隠蔽されます。
感染したリムーバブルドライブをシステムに接続し、アイコン表示機能を備えたアプリケーション(Windows エクスプローラなど)でこのドライブの内容を表示すると、上記の.lnk ファイルがまず1 番目の.dll ファイル(~WTR4141.tmp)をメモリにロードし、この.dll ファイルに制御を渡します。本来、このような動作は不可能ですが、上記の脆弱性によって可能になっています。1 番目の.dll ファイルは約25KB とサイズが小さく、機能も限られています。事実、このファイルの主な役割は、サイズの大きい2 番目の.dll ファイル(約500KB の~WTR4132.tmp)をメモリにロードし、このファイルに制御を渡すことにあります。
この脅威に感染したリムーバブルドライブをクリーンなシステムに接続した場合を考えてみましょう。この場合、リムーバブルドライブにあるファイルはすぐには隠蔽されません。クリーンなマシンには、この脅威に含まれるルートキットがインストールされていないためです。脅威としては、感染プロセスのなるべく早い段階でリムーバブルドライブ上のファイルを隠蔽する必要があります。1 番目の.dll ファイルは、2 番目の.dll ファイルをロードする以外にも、このファイル隠蔽の役割も担っています。
脅威に関連するファイルを隠蔽する手口として、1 番目の.dll ファイルはkernel32.dll とNtdll.dll から次のAPI をフックします。
Kernel32.dll から:
-
FindFirstFileW
-
FindNextFileW
-
FindFirstFileExW
Ntdll.dll から:
-
NtQueryDirectoryFile
-
ZwQueryDirectoryFile
そして、これらAPI の本来のコードを、次の属性を持つファイルをチェックするコードで置き換えます。
-
ファイル名が「.lnk」で終わるファイル
-
ファイル名が「~WTR」で始まり「.tmp」で終わるファイル(この理由から、リムーバブルドライブに置かれているファイル名は変更できないようになっています)
上記の属性を持つファイルの一覧情報を取得するようなリクエストがあると、これらAPI からの応答が改ざんされ、ファイルが存在しないという応答が返されます。こうして、上記の属性を持つファイルは結果的にすべて隠蔽されることになります。
kernel32.dll のAPI をフックした後、1 番目の.dll ファイルはサイズの大きい2 番目の.dll ファイルをロードします。しかし、これは通常の方法では行われません。通常、プログラムが.dll ファイルをメモリにロードするには、対象となる.dll ファイルのファイル名を指定してLoadLibrary API を呼び出します。しかしW32.Stuxnet は特別な方法で.dll ファイルをロードします。これは、1 番目の.dll ファイルに限らず、この脅威のいくつかのコードで使われている手法です。
その手法とは、まずNtdll.dll の特定の関数をフックした上で、特別に細工をしたファイル名を指定してLoadLibrary を呼び出します。指定したファイルはディスク上に存在しないため、通常ならLoadLibrary は失敗します。しかしW32.Stuxnet はNtdll.dll をフックしており、特別に細工をしたファイル名をロードするリクエストを待ちます。そして、特別に細工をしたファイル名が見つかると、Ntdll.dll のフックされた関数はW32.Stuxnetが指定した別のアドレスから.dll ファイルをロードします。このメモリアドレスには、W32.Stuxnet があらかじめ.dll ファイルを復号化したものが格納してあります。
ここでフックされるNtdll.dll の関数は、次のとおりです。
-
ZwMapViewOfSection
-
ZwCreateSection
-
ZwOpenFile
-
ZwCloseFile
-
ZwQueryAttributesFile
-
ZwQuerySection
上記の手口で.dll ファイルをロードしたら、GetProcAddress を使用して.dll ファイルの特定のエクスポート関数のアドレスを取得して呼び出し、この新しい.dll ファイルに制御を渡します。
ここまで説明してきたのは、不正な.dll ファイルをロードする手順です。しかし、この脅威の本当の機能は、これから説明するインストールコードにあります。
1 番目の.dll ファイルは、脅威に関連するファイルを隠蔽した後、サイズの大きい2 番目の.dll ファイル(~WTR4132.tmp)に制御を渡します。2 番目の.dll ファイルは、3 番目の.dll ファイルのラッパーに過ぎません。下の図に示すように、~WTR4132.tmp のデータ部には暗号化した.dll ファイルが格納されています。図の左端にわずかに見える青色の部分がコードを表し、右に広がる緑の部分がデータ(この場合は暗号化された.dll ファイル)を表しています。ここからも分かるように、サイズの大きい2 番目の.dll ファイルは、そのほとんどが実際にはコードではなくデータで構成されています。
比較のために、1 番目の.dll ファイルの構成を次に示してみます。この.dll ファイルはほとんどがコード(青色)で、それ以外のデータ部はごくわずかしかありません。
~WTR4132.tmp に含まれるサイズの小さなラッパーコード部(最初のスクリーンショットにわずかに見える青色の部分)は、実は1 番目の.dll ファイルのコードと酷似しており、共通したコードが数多く見られます。たとえば次に示すコードは、どちらの.dll ファイルもまったく同じコードを使用しており、まったく同じ順番でAPI のアドレスを解決しています。
サイズの大きい2 番目の.dll ファイルは、このラッパーコードを使用してデータ部にUPX 圧縮してある.dll ファイルを復号化し、先に述べたのと同じ手口でこの.dll ファイルをメモリにロードしてこの.dll ファイルに制御を渡します。このUPX 圧縮した.dll ファイルを復号化したものこそ、悪質なペイロード機能を持つ脅威の本体なのです。
このUPX 圧縮されたファイルには、次に示す21 種類の関数がエクスポートされています。
これらのエクスポート関数にはそれぞれ異なるコードが含まれており、これらが組み合わさってこの脅威の機能が構成されています。たとえば、次のようなエクスポート関数があります。
-
脅威が使用するコンフィグレーションデータを復号化する
-
2 つの.sys ファイルを投下し、これらをカーネルレベルのルートキットとしてインストールする
-
Siemens Step 7 ソフトウェアで作成されたファイルにアクセスする
-
自己アップデートを実行する
-
さらにいくつかの.dll および.dat ファイルを投下する
-
リムーバブルドライブにカスタムの.lnk ファイルを置いて感染を広げる
-
lsass.exe プロセスへのインジェクションを行い、カスタムコードを実行する
-
iexplore.exe プロセスへのインジェクションを行う
-
特定のウイルス対策ソフトウェアが動作しているかどうかをチェックする
-
ネットワークをスキャンしてサーバーを検出する
-
自分自身を削除する
-
C&C サーバーと通信する
これら機能の多くは単純に実行されるのではなく、まずコードをシステム上の別のプロセスにインジェクトして、そのインジェクトしたプロセスから関数を呼び出すという形をとっています。たとえばUPX 圧縮された.dll ファイルは、まず最初にlsass.exe という正当なプロセスを新規作成し、このプロセスのコードを脅威自身のローダーコードで上書きします。このローダーコードを利用してUPX 圧縮したファイルをlsass.exe のアドレス空間にロードした後、上記のいずれかの関数を実行します。
上記のリストを見ると分かるように、この脅威は多くの機能がSCADA ソフトウェア製品に関係しています。私たちの解析結果でも、この脅威は特にSCADA ソフトウェアをインストールしてあるシステムを標的としていることが確認されました。この脅威はSiemens のソフトウェア製品「Step7」で使用するDB に対して多くのDB クエリを実行し、Step 7 の.dll ファイルと通信します。そして、データベースから特定のデータを取得して、そのデータに基づいた処理を実行しようとします。たとえば、Step 7 が作成したファイルのうち、次の文字列を含むファイルへのアクセスを試みます。
-
GracS\cc_tag.sav
-
GracS\cc_alg.sav
-
GracS\db_log.sav
-
GracS\cc_tlg7.sav
-
*.S7P
-
*.MCP
-
*.LDF
この脅威については現在も解析を続けており、24 時間以内にこのブログに続報を投稿する予定です。それまで、もう少しお待ちください。