Symantec Security Response Weblog
All-in-One Malware: An Overview of Sality」より
May 7、2010 Posted by Nicolas Falliere

 「W32.Sality」はファイルに感染するタイプのマルウエア(寄生型ウイルス)で、かなり以前から亜種が出回っている(関連記事:「メモ帳」を改ざんし,リムーバブル・ドライブ経由で感染するウイルス)。2003年にロシアから発生したらしい。登場した当時のSalityは、パソコンにウイルスコードを感染させ、バックドアを仕掛け、キーボード入力を取得する機能を備えていた。

 Salityは今もウイルスおよびトロイの木馬に分類されていて以前と同じ「シグネチャー」のままだが、機能拡張されて感染拡大と生存の能力が向上し、いろいろと悪事を働くようになった。追加された機能の中には、Sality感染パソコンで構成する分散型P2Pネットワークがある。これについては後で紹介しよう。

 Salityはエントリーポイント難読化(EPO)を行ってファイルに感染する。感染ファイルは本来のコードが複雑なコードに書き換えられ、ウイルス機能の実行という最終目的を実現するために使われてしまう。このウイルスコードはファイルの最終セクションにあり、暗号化されている。コードを復号して動かすと新たなスレッドが作られ、ウイルス用ペイロードのメモリー配置と実行を担当する。このペイロードがSality本体である。どのような機能を持っているのか見ていこう。

 ペイロードは五つあるコンポーネントをそれぞれ別のスレッドとして実行する。1番目はプロセスにコードを挿入するコンポーネントだ。パソコン上の全プロセス(ユーザーの「LocalService」「NetworkService」「System」は除く)にSalityのコピーを挿入し、Salityの活動を確実に続けられるようにする。

 2番目のコンポーネントは、パソコンが通常備えているセキュリティ機能を低下させる、もしくは無効化する役割を担っており、ウイルス対策ソフトやパーソナルファイアウォールをはじめ、セキュリティに関連する各種のプロセスとサービスを停止させる。レジストリも変更し、SafeBootキーのエントリーを削除する。Windowsの「regedit.exe」を使ったレジストリ編集や、タスクマネージャも起動できなくしてしまう。そのうえ、「Salityにネットワークアクセスを許可する」というルールをファイアウォールに追加し、セキュリティセンターの起動を阻止するほか、様々な工作を行う。

 そしてSalityは「%System%\drivers」フォルダ以下のその都度違う場所にカーネルドライバーを入れ、「amsint32」という名前のサービスを作る。このドライバーはルートキットであり、二つの機能を持っている。まずSalityのユーザーモードからの命令に従ってプロセスを止め、通常の「TerminateProcess()」関数呼び出しを失敗させる。なお狙ったプロセス上で任意のコードを実行する機能も備えているが、今のところプロセスの停止しか行っていない。

 カーネルドライバーの第2の機能は先のプロセス停止より興味深い。「IpFilter」にコールバック関数を設定し、ネットワークパケットの処理を行おうとするのだ。Ipfltdrv.sysはWindowsの標準ドライバーで、「IpFilterDriver」サービスを動かすとロードできる。コールバック関数を設定したカーネルドライバーは、IPパケットの送受信時に必ずIpFilterから呼び出されるようになる。パケットを捨てるかどうかは、コールバックされた側で決められる。つまりIpFilterを使えば、Windows上で容易にファイアウォールを作ることができる。SalityはIpFilterでIPパケットを見張り、セキュリティベンダーのURLを暗号化したリストと関連するキーワードを探し、該当パケットをすべて捨ててしまう。SalityのユーザーモードはこのカーネルドライバーにSMTPパケットを捨てるよう命じ、メールのやり取りを邪魔することもできる。

 コンポーネントの説明に戻ろう。Salityは、第3のコンポーネントでパソコンのハードディスクとWindowsの共有フォルダにあるファイルに感染する。レジストリキー「HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache」から参照されている使用頻度の高いファイルと、「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run」および「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run」に記載された実行可能(.exe)ファイルにも感染する。なお、この感染ルーチンはとても用心深く、狙ったファイルがWindowsのファイル保護機構(SFC)で守られていないことを確認してから感染を試みる(関連記事:システム・ファイル・チェッカー )。

 Salityの最終目的はほかのマルウエアや攻撃ツールをダウンロードして実行することであり、これが4番目のコンポーネントの役目だ。感染パソコンには、ダウンロード/復号/実行するリソースのありかを示すURLがリスト化されて入っている。このリソースを辿るとさらに多くのURLにアクセスできる。暗号化の方式はRC4で、感染パソコン内に記録されている鍵を使う。ところでSalityは、リスト内のURLにアクセスできなくなった場合や、当初と違うものをダウンロードしたくなった場合、どのようにしてURLリストを更新するのだろうか。

 答えは5番目の最終コンポーネントを調べると分かる。このコンポーネントにはP2Pのクライアントとサーバーのコードが入っていて、感染パソコンはP2Pボットネットのボットとして動く。

 このP2Pネットワークで使われているプロトコルはかなり単純なもので、恐らくSalityの関係者が自作したのだろう。通信用パケットは暗号化されており、UDPで通信する(暗号可能方式はURLリストと同じRC4だがこちらは動的鍵を使っていて、パケットにはペイロードデータのハッシュ値とサイズが記載されている)。

 まずSalityは、感染パソコンで2201番以上のポートを疑似乱数で選ぶ。P2Pサーバーはこのポートを監視することで、クライアントからクエリーが送られてきたことを知る。感染パソコンが最初に通信する相手は、Salityに埋め込まれたブートストラップリストに書かれている。このリスト内には最大で1000個の項目があり、最低でも1個は通信ノードを見つけられるようチャンスをできるだけ大きくしている。

 このP2Pネットワークの目的は、ダウンローダーに渡すURLリストを交換することだ。通信プロトコルには、目的達成に必要な数少ない以下のコマンドしか実装されていない。

・URLリスト(URLパッケージ)を送るよう通信中のノードに要求する

・自分のURLパッケージを通信中のノードに送る

・ボットネット内にある別の通信ノードのIPアドレスとポート番号を送るよう通信中のノードに要求する。こうすることで、常に通信ノードのリストを最新状態に保つ

 ボットネットの通信ノードにはSalityのサーバーが隠されていて、新しいURLパッケージを定期的に供給しているのだろう。URLパッケージには連番ID付きのメタデータが入っていて、感染パソコンは既に持っているURLパッケージより大きなIDの付いたものだけを「インストール」する。URLパッケージには1024ビット長のRSAデジタル署名も施してある。これは、ボットネットが偽物のURLパッケージで攻撃されたり、セキュリティ研究者やほかのマルウエア作者に乗っ取られたりすることを避けるためだ。