JPCERT コーディネーションセンター

安全・安心なIT社会のための、国内・国際連携を支援する

お問い合わせ 採用情報 サイトマップ English

Home > ラーニング > ライブラリ > 分析センターだより > Poison Ivyのコードを取り込んだマルウエアPlugX(2017-01-12)

最終更新: 2017-01-12

Poison Ivyのコードを取り込んだマルウエアPlugX(2017-01-12)


Poison Ivyのコードを取り込んだマルウエアPlugX

PlugXは標的型攻撃で悪用されるマルウエアです。このマルウエアについては、2015年1月22日の分析センターだより「マルウエアPlugXの新機能」で新機能が追加されたことを紹介しました。今回は、2016年4月以降に確認されたPlugXに見られた構造的な変更について解説します。今回解説する構造的な変更とは次の2つです。

  •  API呼び出し方法の変更
  •  メインモジュールがPE形式からコード形式に変更

なお以降では、2016年4月から確認されるようになったPlugXを新PlugXと記し、それ以前のものを旧PlugXと記します。

API呼び出しの変化

旧PlugXは、メモリロード時に通常のPEファイルと同じように、API名を示す文字列をキーとして対応するライブラリをメモリ上にロードし、そのアドレスを基にWindows APIを呼び出していました。そのため、旧PlugXのコード中には呼び出されるWindows API名を表す文字列が含まれていました。
これに対して、新PlugXでは、API名を表す文字列がコード中に含まれず、代わりにAPI名をハッシュ値として持っています。APIを呼び出す際はWindowsの機能を利用してAPI名のリストを取り出し、1つずつハッシュ計算を行って、指定されたハッシュ値と計算したハッシュ値が一致するAPI名をキーとしてAPIを呼び出します。この手法は、IAT (Import Address Table) を持たない、すなわちPE形式ではないコードがWindows APIを呼び出す際に使う手法であり、シェルコード内で利用されます。また、この手法は一部のマルウエアでもAPI名を隠蔽する目的で使用されます。
図1は新PlugXがGetSystemInfoを呼び出す際のコードです。「86AA8709h」はGetSystemInfoという文字列をハッシュ化した値で、これを基にアドレス解決を行い「jmp eax」でGetSystemInfoのアドレスへジャンプします。

acreport-plugx2_01.png
図 1:GetSystemInfoを呼び出す関数

原理的には、API名をハッシュ化する計算アルゴリズムは、Windows APIの名前に対してハッシュ値の衝突がない任意のアルゴリズムを採用できるはずですが、新PlugXはPoison Ivyのハッシュ計算と同じアルゴリズムを使用しています。図2は新PlugXとPoison Ivyのハッシュ計算関数を対比して示しています。

acreport-plugx2_02.png
図 2:新PlugX(左)とPoison Ivy(右)のWindows APIハッシュ関数
     (一致している部分を青で表示している)
PE形式からコード形式に変更

旧PlugXのファイルにはPE形式(DLL)でマルウエアが格納されていましたが、新PlugXのファイルには単にコード部分だけが格納され、ヘッダーを持たないように変更されました。旧PlugXの場合には、エンコードされた状態のPlugXが、それをデコードするためのコード(図3のDecoding code)と共に、1つの検体(図3のPlugX Data)を構成していました。検体が実行されると、PlugXのメインモジュール(図3のPlugX main module)がデコードされ、これが自らを他のプロセスにインジェクトし、その後にプロセスの中で動作するようになります。このような旧PlugXが実行されるまでの流れを図3に示します。

acreport-plugx2_03.png
図 3:旧PlugXが実行されるまでの流れ

図4はエンコードされた新PlugXが実行されるまでの流れです。メインモジュールがエンコードされており、メインモジュールがプロセスに自らをインジェクトし、その後にプロセスの中で実行されることは旧PlugXと同様です。大きな違いは、これまでのPlugXのメインモジュールはPE形式(DLL)でしたが、新PlugXはコード形式に変更されたことです。

acreport-plugx2_04.png
図 4:新PlugXが実行されるまでの流れ

図5はPlugXのデコードされたメインモジュールの先頭部分です。旧PlugXはPE形式と同等のヘッダーを持っていますが、新PlugXは先頭がコードから始まっており、PEヘッダーが存在しないことが分かります。

acreport-plugx2_05.png
図 5:デコード後の旧PlugX(上)と新PlugX(下)
おわりに

PlugXの開発者は、旧PlugXから新PlugXへの改造に際して、やはり標的型攻撃に使われているPoison Ivyを参考にしたと考えられます。API呼出しの際に使われるハッシュ関数として同じものを利用していることは既に述べたとおりですが、新PlugXのようなコード形式もPoison Ivyで以前から採用されている手法です。こうした改造の目的は、マルウエア分析を難しくすることにより、マルウエアを有効に使える期間を長引かせることにあると考えられます。

PlugXはまだ進化中で、現在でも標的型攻撃に使われているため注意が必要です。現段階では、新PlugXを使っている攻撃者も、旧PlugXを使っている攻撃者もともに存在しています。
なお、以前の分析センターだよりで説明したPlugXの設定情報や通信方法、エンコード方式などについては新PlugXにおいても変化していませんので、以前の記事も併せてご一読ください。

分析センター 朝長 秀誠



Topへ

CSIRTマテリアル
STOP!!パスワード使い回し!!キャンペーン2016
JPCERT/CCって何をやっているのですか?
Follow jpcert on Twitter
blog_banner_english