ブログ(脅威調査)

「Operation Clandestine Wolf」 APT3のフィッシング・キャンペーンで Adobe Flash Playerのゼロデイ攻撃を特定

本コンテンツは、2015年6月23日(米国時間)にFireEye, Inc.のブログで公開された内容の抄訳です。
本内容は予告なく更新されている可能性があることをご了承ください。

米国カリフォルニア州ミルピタス発
ファイア・アイは6月、Adobe Flash Playerの脆弱性(「CVE-2015-3113」)を悪用したフィッシング・キャンペーンを発見しました。攻撃者からの電子メールには、感染したWebサーバーへのリンクが記載されており、その先は無害なコンテンツだけでなく、CVE-2015-3113を悪用した悪意あるAdobe Flash Playerファイルもありました。

アドビ社はすでに、定例外のセキュリティ情報
を発表し、CVE-2015-3113用のパッチを公開しています。Adobe Flash Playerユーザーの皆様には、早急に最新版へアップデートすることをお勧めします。

ファイア・アイのIPSエンジンである「FireEye MVX」は、このゼロデイ攻撃をWeb感染として検知し、CVE-2015-3113として報告しました。また、バックドアである「SHOTPUT」は「Backdoor.APT.CookieCutter」として報告されています。

APT3
今回の脆弱性攻撃に関与しているのは、ファイア・アイが追跡中の中国の脅威グループ、「APT3」(別名:「UPS」)であり、その活動は当社の過去のブログ記事「Operation Clandestine Fox」で特定されています。APT3は、ファイア・アイの脅威インテリジェンスチームが追跡する組織の中でも特に洗練された脅威グループであり、ブラウザベース(例:Internet Explorer、Firefox、Adobe Flash Player)の複数のゼロデイ脆弱性を初めて悪用したグループです。同グループは、標的とするホストへの侵入に成功すると、認証情報を素早く流出させ、他のホストへと横に展開して、専用のバックドアをインストールします。この一連の組織的な作戦行動には重複がないため、APT3のコマンド&コントロール(C&C)インフラストラクチャを追跡することは困難です。

活動の概要
APT3は、この数週間で大規模で組織的なフィッシング攻撃を展開しています。標的となった業種は次の通りです。

  • 航空宇宙・防衛
  • l建設・土木
  • ハイテク
  • l通信
  • 運輸

フィッシングメールに記載されているURLをクリックすると、JavaScriptのプロファイルスクリプトが仕込まれた感染サーバーへとリダイレクトされます。標的とするホストのプロファイリングが完了すると、Adobe Flash Playerの悪意あるSWFファイルとFlash Video(FLV)ファイル(以下で詳述)がダウンロードされ、最終的には専用のバックドアであるSHOTPUTが被害者のシステムに送り込まれます(ファイア・アイでは「Backdoor.APT.CookieCutter」として検知)。

ペイロードはXORエンコードを用いて難読化されており、有効なGIFファイルに付与されます。

攻撃の方向性
APT3が今回のキャンペーンで使用したフィッシングメールは、極めて自然で一見しただけではスパムメールには見えません。メール本文の一例を以下に紹介します。

Save between $200-450 by purchasing an Apple Certified Refurbished iMac through this link. Refurbished iMacs come with the same 1-year extendable warranty as new iMacs. Supplies are limited, but update frequently.

 

Don't hesitate . . .>Go to Sale

 

【訳】下記リンクからApple認定の整備済みiMacを購入し、200~450ドルを節約しましょう。整備済みiMacには、新品iMacに同じく延長可能な1年保証が適用されます。サプライ用品には限りがありますが、在庫は頻繁に更新されます。

 

今すぐお求めを。   >Go to Sale

「>Go to Sale」の箇所には、以下のURL構造を持つリンクが設定されていました。

hxxp://<subdomain>.<legitdomain>.<TLD>/<directory>/<alphanumericID>.html

脆弱性の詳細
今回の攻撃で悪用されているのは、Adobe Flash PlayerがFLVファイルを解析する際のゼロデイ脆弱性です。脆弱性を悪用した攻撃は、一般的なベクトル破壊手法を用いてアドレス空間配置のランダム化(ASLR)機能を迂回し、リターン指向プログラミング(ROP)を用いてデータ実行防止(DEP)機能を迂回します。ROP手法の巧妙なトリックにより、脆弱性の攻撃は容易になっており、一定のROP検知手法も回避できます。

シェルコードは、復号時に使用する鍵と一緒にパックされたAdobe Flash Playerのエクスプロイト内に保存されています。ペイロードはXORで暗号化され、画像内に隠されています。

エクスプロイトのパッケージング
Adobe Flash Playerのエクスプロイトは、シンプルなRC4パッカーでパックされています。RC4の鍵と暗号データは、BinaryDataブロブに格納されており、パッカーがレイヤー2のAdobe Flash Playerファイルを復号するのに使用します。復号が完了すると「loader.loadBytes」によってレイヤー2が実行されます。

ベクトルの破壊
レイヤー2は、古典的なAdobe Flash Playerのベクトル破壊手法を用いて、ヒープ破壊の脆弱性を利用し、ActionScript3のメモリ空間を読み書きします。この手法では、攻撃者はAdobe Flash Playerのベクトルにヒープ・スプレー攻撃を行い、ActionScript3に書き込み可能な脆弱性を利用することで、ベクトルの1つについてサイズの変更を行います。攻撃者は次に、破壊したベクトル・オブジェクトに対して当初割り当てられていたメモリの境界外に、ActionScript3経由でその後の読み書きを行います。この手法に関する詳細は「Flash in 2015」をご覧ください。

攻撃者は、メモリへの制限付き読み書きアクセスを得ると、第2ベクトルを破壊しアクセスする範囲を0x3fffffffバイトへ拡げます。この第2ベクトルは、その後のエクスプロイトで使用されます。

リターン指向プログラミング
攻撃者はROPチェーンを用いてkernel32!VirtualAllocを呼び出し、自らのシェルコードを実行可能にした後、シェルコードにジャンプします。

その際、シェルコードやペイロードと一緒にROPチェーンをヒープに書き込むのではなく、別の手法が用いられています。エクスプロイトの開発者は、これまでSoundオブジェクトなどAdobe Flash Playerの組み込みオブジェクトを破壊させるのが一般的でした。最近ではByteArrayオブジェクトを用いControl Flow Guard (CFG) をバイパスすることもあります。しかし、今回の攻撃者は、以下のように多数の引数を持つ関数を使用し、ActionScript3内で自らのクラスを定義する方法を選んでいます。

class CustomClass

{

    public function victimFunction(arg1:uint, arg2:uint, …, arg80:uint):uint {…}

}

スタック・ポインタを加算し、ROPへとリターンするガジェットにより、攻撃者は関数ポインタを簡単に上書きできるようになります。その際、ROPチェーンの絶対アドレスを特定し、一般的なxchg reg32, espピボット用にレジスタに保存する必要はありません。さらに、スタック上にROPチェーンを保存することで、スタック・ポインタがスレッドのスタック領域外を指定する際の検知に関するROPの検知メカニズムを回避できます。

this.customObj.victimFunction(

            6f73b68b, // ret; (ROPsled)

            …,

6f73b68a, //pop eax

1f140100,

6fd36da1, //call Kernel32!VirtualAlloc(0x1f140000, 0x10000, 0x1000, 0x40)

1f140000, // Address

00010000, // Size

00001000, // Type

00000040, // Protection = RWX

6f73b68b*9 // ret (ROPsled)

6fd36da7*2 // ret

6f73aff0 pop ecx

6fd36da7

6fd36da7 jmp [eax]

)

 

this.customObj.victimFunction pointer modified to:

00000000`6de533dc 5e              pop     rsi

00000000`6de533dd 83c448      add     esp,48h

00000000`6de533e0 c3               ret

最後に、VirtualAlloc呼び出し後のROPチェーンにはROPsledが含まれます。これは、開発時の単なる中間生産物の可能性もあれば、VirtualAllocの呼び出し時に、限られた深さでリターンアドレスの有効性を検証する検知メカニズムを迂回するために作られた可能性もあります。

脆弱性を悪用した攻撃の全体的な流れ

1.     新しいVideoオブジェクトを作成

2.     ペイロードをフェッチ

3.     新しいNetStreamに動画を追加

4.     Adobe Flash Playerベクトルを通じ、ヒープ・スプレー攻撃を実施

          a.     1,022のuintを含む98,688のベクトルを持ったベクトルを作成

          b.     各ベクトル<uint>の最初の2つのダブルワードを「0x41414141」
                  「0x42424242」に設定

5.     コントロールされたFLVオブジェクト用にメモリ空間を空ける

          a.     スプレー内でおよそ3つに1つのベクトルを解放

6.     後のコントロール移行のために、カスタムクラスのオブジェクトをスプレー

          a.     新しいクラスCustomClassを定義

                   i.     多数の引数を持つ関数victimFunctionを定義

          b.     CustomClassインスタンスへの参照が1,007件の、0x100のベクトルを含むベ
                  クトルを作成

7.     FLVのエクスプロイトをフェッチし、再生

         a.     FLVファイルは、攻撃者がコントロールするオブジェクトを、ステップ5で用意したメモリ空間の1つに割り当て

         b.     攻撃者がコントロールするオブジェクトが、隣接ベクトルの長さフィールドを上
                 書き

8.     ステップ4のベクトルで、ステップ5のメモリ空間を埋める

9.     破壊したベクトルを見つける

          a.     ステップ4のベクトルを検索

          b.     各ベクトルの長さを確認し、異常に大きいベクトルを見つける

10.  第2ベクトル(Vector2)を破壊

          a.     ステップ9の破壊ベクトルを使用し、相対メモリアドレスを変更

                   i.     隣接ベクトル用にメモリを検索

                   ii.     長さフィールドを0x3fffffffで上書き

                   iii.     長さ0x3fffffffの破壊ベクトルが、現在スプレー内に存在しているかを確
                          認

                             1.     存在しない場合、破壊を取り消し、次のベクトルの破壊を試みる

11.  シェルコードを復号し、シェルコードとペイロードをヒープ上に保存

12.  CustomClass.victimFunction関数ポインタを上書き

          a.     ステップ6でスプレーされたCustomClassオブジェクトのインスタンス参照を
                  見つける

          b.     新たな関数は、攻撃者にコントロールを移す「ピボット」の形式

13.  スタック上にROPチェーンを構築、呼び出し

          a.     Vector2を使用し、メモリ内のROPガジェットを見つける

                   i.     kernel32!VirtualAllocの呼び出しを含める

          b.     ステップ6.a.iの破壊したCustomClass.victimFunctionを呼び出し

                   i.     関数の引数は、ROPチェーンのガジェット

                   ii.     これらはスタック上にプッシュされる

                   iii.     ステップ12の破壊したvtableがピボットを呼び出し

                             1.     ROPチェーンがスタック上にあるため、「ピボット」はス
                                     タック・ポインタを加算し、リターンするだけ

14.  ROPチェーンがシェルコードを呼び出し

          a.     kernel32!VirtualAllocを呼び出し

          b.     シェルコードへジャンプ

15.  シェルコードがペイロードを呼び出し

          a.     画像内に保存されているペイロードを探し、シェルコードがメモリを検索

          b.     各バイト(0、0x17以外)を0x17でXOR演算し、シェルコードがペイ
                  ロードを復号

結論
標的とするネットワークのアクセス権を得ると、APT3は迅速に行動し、アクセス権を維持するために横展開に非常に効率よく実施します。さらに、同グループはゼロデイ脆弱性、継続的に更新される専用のバックドア、使い捨てのC&Cインフラストラクチャを悪用することで、組織的な作戦行動の追跡を困難にしています。