複数の脅威アクターによって悪用される EPS 処理のゼロデイ

Pseudo code for the exploit news

2015 年、FireEye は、Microsoft Office の Encapsulated PostScript (EPS) の脆弱性を悪用する 2 つの攻撃に関する詳細を公開しました。 1 つはゼロデイで、もう 1 つは攻撃が開始される数週間前にパッチが適用されました。

最近、FireEye は、実際に悪用されている Microsoft Office 製品の 3 つの新しいゼロデイ脆弱性を特定しました。

2017 年 3 月末に、EPS の未知の脆弱性と最近パッチが適用された Windows Graphics Device Interface (GDI) の脆弱性を悪用してマルウェアを投下する別の悪意のあるドキュメントを検出しました。 Microsoft が EPS を無効にした 2017 年 4 月の月例パッチに続いて、FireEye は EPS に 2 つ目の未知の脆弱性を検出しました。

FireEye は、 Turlaと未知の金銭目的の攻撃者の 2 人の攻撃者が最初の EPS ゼロデイ ( CVE-2017-0261 ) を使用し、 APT28が 2 番目の EPS ゼロデイ ( CVE-2017-0262 ) を使用していたと考えています。新しい権限昇格 (EOP) ゼロデイ ( CVE-2017-0263 )。 Turla と APT28 はロシアのサイバー スパイ グループであり、これらのゼロデイをヨーロッパの外交および軍事組織に対して使用しています。正体不明の金融グループは、中東にオフィスを持つ地域およびグローバルな銀行を標的にしました。以下は、EPS ゼロデイ、関連するマルウェア、および新しい EOP ゼロデイの説明です。各 EPS ゼロデイには EOP エクスプロイトが伴います。EOP は、EPS 処理に使用される FLTLDR.EXE インスタンスを実行するサンドボックスをエスケープするために必要です。

悪意のあるドキュメントは、3 つの異なるペイロードを配信するために使用されています。 CVE-2017-0261 は SHIRIME (Turla) と NETWIRE (未知の金銭目的の攻撃者) の配信に使用され、CVE-2017-0262 は GAMEFISH (APT28) の配信に使用されました。 CVE-2017-0263 は、GAMEFISH ペイロードの配信中に権限をエスカレートするために使用されます。

FireEye の電子メールおよびネットワーク製品は、悪意のあるドキュメントを検出しました。

FireEye は、この情報の責任ある開示について Microsoft Security Response Center (MSRC) と連携しています。マイクロソフトは、すべてのお客様に、EPS フィルターの脆弱性に対する多層防御の手段として、セキュリティ アドバイザリ ADV170005のガイダンスに従うことをお勧めします。

CVE-2017-0261 – EPS 「復元」 Use-After-Free

Office ドキュメントを開くと、FLTLDR.EXE を利用して、エクスプロイトを含む埋め込み EPS 画像がレンダリングされます。 EPS ファイルは PostScript プログラムであり、「 restore 」オペランドの Use-After-Free 脆弱性を利用しています。

PostScript マニュアルから: 「ローカル VM での割り当てと、ローカル VM の既存のオブジェクトへの変更は、それを呼び出すオペレーターにちなんで名付けられた、保存および復元と呼ばれる機能の対象となります。ローカル VM アクティビティがカプセル化される PostScript 言語プログラムのセクションを保存および復元します。 restoreは、新しいオブジェクトの割り当てを解除し、対応する保存以降に行われた既存のオブジェクトへの変更を元に戻します。」

マニュアルで説明されているように、 restoreオペレーターは、 saveオペレーター以降に割り当てられたメモリを再利用します。これは、 forall演算子と組み合わせると、Use-After-Free の完全な状態になります。図 1 は、保存および復元操作を活用するための疑似コードを示しています。

Pseudo code for the exploit
図 1: エクスプロイトの疑似コード

次の操作により、擬似コードがメタデータをリークして、読み取り/書き込みプリミティブを有効にすることができます。

  1. forall_proc 配列は、restore proc の 1 つの要素で作成されます
  2. EPS 状態は eps_state に保存されます
  3. 保存後に uaf_array が作成される
  4. forall 演算子は、要素ごとに forall_proc を呼び出す uaf_array の要素をループします。
  5. uaf_array の最初の要素は、forall_proc に含まれるプロシージャである restore_proc の呼び出しに渡されます。
  6. restore_proc
    • uaf_array を解放して初期状態を復元します
    • alloc_string プロシージャは、解放された uaf_array を再利用します。
    • forall_proc が更新され、leak_proc を呼び出すようになりました
  7. forall 演算子による後続の呼び出しは、解放された uaf_array の各要素に対して、leak_proc を呼び出します。これらの要素には、alloc_string プロシージャの結果が含まれています。

図 2 は、再利用された後に使用されている uaf_array のデバッグ ログを示しています。

uaf_array 再利用されたデバッグ ログ
図 2: uaf_array が再利用されたデバッグ ログ

攻撃者は、保存演算子の後の操作を操作することで、メモリ レイアウトを操作し、Use-After-Free を変換して読み取り/書き込みプリミティブを作成できます。図 3 は、長さが 0x7fffffff、基数が 0 に設定された偽の文字列を示しています。

偽の文字列オブジェクト
図 3: 偽造された文字列オブジェクト

EPS プログラムは、任意のユーザー メモリを読み書きする機能を利用して、引き続きガジェットを検索して ROP チェーンを構築し、ファイルオブジェクトを作成します。図 4 は、メモリ内の偽造されたファイル オブジェクトを示しています。

ROP を使用した偽のファイル オブジェクト
図 4: ROP を使用した偽のファイル オブジェクト

偽のファイル オブジェクトでclosefileオペランドを呼び出すことにより、エクスプロイトは ROP に移行し、シェルコードを開始します。図 5 に、 closefileオペランド ハンドラの逆アセンブラの一部を示します。

closefile の Stack Pivot 逆アセンブラ
図 5: closefile の Stack Pivot 逆アセンブラー

実行が完了すると、マルウェアは ROP チェーンを使用して、シェルコードを含むメモリ領域の実行保護を変更します。この時点で、シェルコードは FLTLDR.EXE を実行していたサンドボックス内で実行されており、そのサンドボックスをエスケープするには権限のエスカレーションが必要です。

FireEye は、この脆弱性を悪用する EPS プログラムの 2 つの異なるバージョンを検出しました。最初の st07383.en17.docx は、引き続き CVE-2017-0001 の 32 ビットまたは 64 ビット バージョンを利用して権限を昇格させた後、SHIRIME として知られるマルウェア インプラントを含む最終的な JavaScript ペイロードを実行します。 SHIRIME は、Turla がターゲット システムの初期プロファイリングを実行し、コマンド アンド コントロールを実装するための第 1 段階のペイロードとして使用する複数のカスタム JavaScript インプラントの 1 つです。 2016 年の初め以来、SHIRIME の複数の反復が実際に使用されていることを確認しており、このゼロデイでは最新バージョン (v1.0.1004) が使用されています。

2 つ目のドキュメント Confirmation_letter.docx は、CVE-2016-7255 の 32 ビットまたは 64 ビット バージョンを利用して権限を昇格させた後、NETWIRE マルウェア ファミリの新しい亜種をドロップします。このドキュメントのいくつかのバージョンは、同様のファイル名で確認されました。

これらのドキュメントに含まれる EPS プログラムには、ROP チェーンの構築とシェルコードの構築を実行するさまざまなロジックが含まれていました。 1 つ目は、図 6 に示す単純なアルゴリズムを使用して、シェルコードのセクションを難読化するという追加の手順を実行しました。

シェルコード難読化アルゴリズム
図 6: シェルコードの難読化アルゴリズム

CVE-2017-0262 – EPS の型の混乱

2 番目の EPS の脆弱性は、forall 演算子のタイプが混乱したプロシージャ オブジェクトであり、実行フローを変更して、攻撃者がオペランド スタックの値を制御できるようにする可能性があります。この脆弱性は、「Trump’s_Attack_on_Syria_English.docx」という名前のドキュメントで発見されました。

脆弱性を引き起こす前に、EPS プログラムはメモリに事前定義されたデータをスプレーして特定のメモリ アドレスを占有し、悪用を容易にします。図 7 は、メモリに文字列をスプレーする PostScript コード スニペットを示しています。

スプレーの PostScript コード スニペット
図 7: スプレーの PostScript コード スニペット

実行後、文字列のコンテンツがアドレス 0x0d80d000 のメモリを占有し、図 8 に示すようなメモリ レイアウトになります。エクスプロイトは、このレイアウトとコンテンツを利用してプロシージャ オブジェクトを偽造し、コード フローを操作して事前定義された値 (黄色) を格納します。 、オペレータ スタックに。

スプレーされたデータのメモリ レイアウト
図 8: スプレーされたデータのメモリ レイアウト

ヒープをスプレーした後、エクスプロイトは次の形式のコード ステートメントを呼び出します: 1 array 16#D80D020 forall . Array オブジェクトを作成し、プロシージャを 16 進数 0xD80D020 として設定し、 forall演算子を呼び出します。 forall演算子内で偽造されたプロシージャの操作中に、実行フローを正確に制御して、攻撃者の選択した値をオペランド スタックに格納します。図 9 は、偽造されたプロシージャを使用する主要なコード フローを示しています。

偽造手続きの消費
図 9: 偽造されたプロシージャの使用

forallの実行後、スタックの内容は攻撃者の制御下にあります。これを図 10 に示します。

forall 実行後のスタック
図 10: forall 実行後のスタック

オペランド スタックが操作されているため、 exchの後続の操作では、図 11 に示すように、操作されたスタックからのデータに基づいてオブジェクトが定義されます。

スタックからデータを取得するための後続のコード
図 11: スタックからデータを取得するための後続のコード

A18 は文字列型のオブジェクトで、長さフィールドは 0 から始まる 0x7ffffff0 です。メモリ内では、図 12 に示すようなレイアウトになります。

A18 文字列オブジェクト
図 12: A18 文字列オブジェクト

A19 は配列型オブジェクトであり、メンバー値はすべて意図的に作成されています。このエクスプロイトは、別の配列オブジェクトを定義し、それを偽造配列 A19 に配置します。これらの操作を実行することにより、新しく作成された配列オブジェクト ポインターが A19 に配置されます。次にエクスプロイトは、予測可能なアドレス 0xD80D020 + 0x38 から値を直接読み取り、その vftable をリークして、EPSIMP32.flt のモジュール ベース アドレスを推測します。図 13 は、EPSIMP32 ベース アドレスの漏洩のコード スニペットを示しています。

漏れているモジュール ベースのコード スニペット
図 13: リークしているモジュール ベースのコード スニペット

図 14 は、 put操作の呼び出しのオペランド スタックと、 put操作の終了後の偽造された配列 A19 を示しています。

put 操作後の配列 A19
図 14: put 操作後のアレイ A19

RW プリミティブ文字列と漏洩した EPSIMP32 のモジュール ベースを利用することで、エクスプロイトは ROP ガジェットを検索し、偽のファイル オブジェクトを作成し、 bytesavailable演算子を介してシェルコードにピボットします。図 15 は、偽造されたファイル タイプ オブジェクトと、ROP およびシェルコードへのピボットの逆アセンブルを示しています。

ROP とシェルコードにピボット
図 15: ROP とシェルコードへのピボット

シェルコードは、未知の EOP である CVE-2017-0263 を使用して権限をエスカレートし、FLTLDR.EXE を実行しているサンドボックスをエスケープし、GAMEFISH ペイロードをドロップして実行します。 CVE-2017-0263 の 32 ビット バージョンのみがシェルコードに含まれています。

CVE-2017-0263 – win32k!xxxDestroyWindow Use-After-Free

図 16 に示すように、EOP エクスプロイトのセットアップは、現在のスレッド以外のすべてのスレッドを中断し、スレッド ハンドルをテーブルに保存することから始まります。

スレッドの中断
図 16: スレッドの中断

次に、エクスプロイトは OS のバージョンをチェックし、その情報を使用して、トークン オフセット、syscall 番号などのバージョン固有のフィールドにデータを入力します。実行可能なメモリ領域が割り当てられ、カーネル モードのシェルコードと、シェルコードに必要なアドレス情報が入力されます。脆弱性をトリガーし、悪用をさらに制御するために、新しいスレッドが作成されます。

エクスプロイトは、図 17 に示すように、3 つの PopupMenus を作成し、それらにメニューを追加することから始まります。エクスプロイトは、ランダムなクラス名を持つ 0x100 ウィンドウを作成します。 User32!HMValidateHandle トリックは、エクスプロイト全体でカーネル情報漏えいとして使用される tagWnd アドレスを漏らすために使用されます。

ポップアップメニューの作成
図 17: ポップアップ メニューの作成

次に、RegisterClassExW を使用して、関数を指す WndProc にウィンドウ クラス「Main_Window_Class」を登録します。この関数は、ブログで後述するように、EventHookProc によって作成されたウィンドウ テーブルで DestroyWindow を呼び出します。この関数は、以前に作成された最初のポップアップ メニューも表示します。

クラス名が「Main_Window_Class」の 2 つの追加ウィンドウが作成されます。 SetWindowLong は、2 番目のウィンドウ wnd2 の WndProc をシェルコード アドレスに変更するために使用されます。アプリケーション定義のフック WindowHookProc とイベント フック EventHookProc は、それぞれ SetWindowsHookExW と SetWinEventHook によってインストールされます。 PostMessage は、最初のウィンドウ wnd1 に 0xABCD をポストするために使用されます。

EventHookProc は EVENT_SYSTEM_MENUPOPUPSTART を待機し、ウィンドウのハンドルをテーブルに保存します。 WindowHookProc はSysShadowクラス名を探し、対応するウィンドウに新しい WndProc を設定します。この WndProc 内で NtUserMNDragLeave syscall が呼び出され、SendMessage を使用して 0x9f9f が wnd2 に送信され、図 18 に示すシェルコードが呼び出されます。

シェルコードのトリガー
図 18: シェルコードのトリガー

Use-After-Free は、カーネルの WM_NCDESTROY イベント内で発生し、bServerSideWindowProc フラグを設定する wnd2 の tagWnd 構造を上書きします。 bServerSideWindowProc が設定されている場合、ユーザー モード WndProc はカーネル コールバックと見なされ、カーネル コンテキストから呼び出されます。この場合、wnd2 の WndProc はシェルコードです。

シェルコードは、コード セグメントがユーザー モードのコード セグメントではないかどうかを確認することで、メモリの破損が発生したかどうかを確認します。また、送信されたメッセージが 0x9f9f であるかどうかもチェックします。検証が完了すると、シェルコードは現在のプロセスの TOKEN アドレスとシステム プロセス (pid 4) の TOKEN を見つけます。次に、シェルコードはシステム プロセスのトークンを現在のプロセスにコピーし、現在のプロセスの特権を SYSTEM に昇格させます。

結論

EPS 処理は、攻撃者にとって熟達した悪用スペースになっています。

FireEye は、2017 年 4 月のパッチ チューズデーで Microsoft が EPS 処理を無効にする前後に見られたこれらの最近の EPS ゼロデイのうちの 2 つを発見し、分析しました。調査されたドキュメントは、さまざまな EPS エクスプロイト、ROP 構築、シェルコード、EOP エクスプロイト、および最終的なペイロードを利用しています。これらのドキュメントは FireEye アプライアンスによって検出されますが、FLTLDR.EXE は EMET によって監視されないため、ユーザーは注意を払う必要があります。

ロシアのサイバースパイ活動はリソースが豊富で動的な脅威です

Turla Group と APT28 によるゼロデイ エクスプロイトの使用は、必要に応じて技術的に高度で費用のかかる方法を適用する能力を強調しています。ロシアのサイバー スパイ アクターは、それほど複雑ではない手段に加えて、ゼロデイ エクスプロイトを使用しています。これらの攻撃者は、以前は資格情報のフィッシングとマクロに依存して操作を実行していましたが、これらの方法の使用はリソースの不足を反映していません。むしろ、技術的に洗練されていない方法を使用することは、運用上の成熟度と、必要になるまでコストのかかるエクスプロイトを保護するための先見性を反映しています。

活気に満ちた脅威のエコシステム

複数のアクターによる CVE-2017-0261 の使用は、サイバー スパイ活動と犯罪活動が共有エコシステムに存在することのさらなる証拠です。 CVE-2017-0199 を利用して FINSPY を配布するような国家のアクターは、多くの場合、犯罪アクターと同じ情報源を利用してエクスプロイトを行います。この共有エコシステムは、いずれかのタイプの脅威に関心を持つ防御側にとって拡散の問題を引き起こします。

CVE-2017-0261 は、国家とサイバー犯罪者の両方によってゼロデイとして使用されており、両方の攻撃者が共通のソースから脆弱性を入手したと考えられます。これは、 CVE-2017-0199に続いて、スパイ活動と犯罪の両方に使用された 2 番目の重大な脆弱性です。

MD5

ファイル名

C2 ホスト

2abe3cc4bff46455a945d56c27e9fb45

Confirmation_letter.docx.bin

(ネットワーク)

84.200.2.12

e091425d23b8db6082b40d25e938f871

確認書.docx

(ネットワーク)

138.201.44.30

006bdb19b6936329bffd4054e270dc6a

Confirmation_letter_ACM.docx

(ネットワーク)

185.106.122.113

15660631e31c1172ba5a299a90938c02

st07383.en17.docx

(しりめ)

tnsc.webredirect.org

f8e92d8b5488ea76c40601c8f1a08790

Trump’s_Attack_on_Syria_English.docx

(ゲームフィッシュ)

wmdmediacodecs.com

表 1: ソース エクスプロイト ドキュメント

これらの攻撃に関連する CVE
表 2: これらの攻撃に関連する CVE

謝辞

iSIGHT インテリジェンス チーム、FLARE チーム、FireEye Labs、マイクロソフト セキュリティ レスポンス センター (MSRC)。

参考: https ://www.mandiant.com/resources/blog/eps-processing-zero-days

Comments

タイトルとURLをコピーしました