標的型攻撃で悪用されるWindowsのゼロデイ脆弱性(CVE-2019-1132)

2019年6月、ESETの研究者は、東ヨーロッパにおける標的型攻撃で使用されているゼロデイエクスプロイトを検出しました。

2019年6月、ESETの研究者は、東ヨーロッパにおける標的型攻撃で使用されているゼロデイエクスプロイトを検出しました。

このエクスプロイトは、Microsoft Windowsに存在するローカル権限昇格の脆弱性、具体的には、win32k.sysコンポーネントにあるNULLポインタの逆参照を悪用します。このエクスプロイトは検出および分析され、Microsoftのセキュリティレスポンスセンターに報告されました。Microsoftセキュリティレスポンスセンターは速やかにこの脆弱性を修正し、パッチをリリースしました。

この脆弱性は次のバージョンのWindowsに影響します。

  • Windows 7 for 32-bit Systems Service Pack 1
  • Windows 7 for x64-based Systems Service Pack 1
  • Windows Server 2008 for 32-bit Systems Service Pack 2
  • Windows Server 2008 for Itanium-Based Systems Service Pack 2
  • Windows Server 2008 for x64-based Systems Service Pack 2
  • Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1

このブログでは、この脆弱性とエクスプロイトの技術的な詳細について主に説明します。次回のブログでは、このマルウェアの検体とマルウェアによる広範な影響について詳しく説明します。

攻撃手法

この数年公開された他の多くのMicrosoft Windowsのwin32k.sys脆弱性と同様に、このエクスプロイトはポップアップメニューオブジェクトを使用します。たとえば、2017年にESETが分析したSednitグループのローカル権限昇格のエクスプロイトでは、今回のエクスプロイトと非常によく似たメニューオブジェクトと攻撃手法が使用されています。

このエクスプロイトは2つのウィンドウを作成します。攻撃の最初の段階と2番目の段階で1つずつウィンドウを作成します。最初のウィンドウでは、CreatePopupMenu関数とAppendMenu関数を使用してポップアップメニューオブジェクトを作成し、メニュー項目を追加します。さらに、このエクスプロイトは、WH_CALLWNDPROCとEVENT_SYSTEM_MENUPOPUPSTARTフックを設定します。

次に、このエクスプロイトはTrackPopupMenu関数を使ってメニューを表示します。この時点で、EVENT_SYSTEM_MENUPOPUPSTARTにフックされたコードが実行されます。このコードは、MN_SELECTITEM、MN_SELECTFIRSTVALIDITEM、およびMN_OPENHIERARCHYの一連のメッセージをメニューに送信し、メニューで最初の利用可能なアイテムを開きます。

次のステップは、この脆弱性をトリガーするために非常に重要です。最初のメニューが作成された後に、サブメニューが作成されようとしている瞬間をこのエクスプロイトは捉える必要があります。そのために、このエクスプロイトには、WH_CALLWNDPROCフックでWM_NCCREATEメッセージを処理するコードが存在します。エクスプロイトのコードによって、システムがこのような状態にあることが検出されると、最初のメニューにMN_CANCELMENUS(0x1E6)メッセージが送信され、最初メニューはキャンセルされますが、そのサブメニューはまだ作成されようとしています。

このサブメニューオブジェクトをカーネルモードで確認すると、
tagPOPUPMENU >ppopupmenuRootは0になっていることがわかります。この状態では、攻撃者はこのカーネル構造にあるこの要素をNULLポインタの逆参照として使用できます。このエクスプロイトはアドレス0x0に新しいページを割り当てます。このアドレスはカーネルによってtagPOPUPMENUオブジェクト(図1参照)として扱われます。

この時点で、攻撃者は2番目のウィンドウを使用します。このエクスプロイトの主な目的は、2番目のウィンドウのtagWND構造のbServerSideWindowProcビットを反転させることです。これにより、カーネルモードでWndProcプロシージャを実行できるようになります。

WndProcプロシージャを実行するために、攻撃者はuser32.dllライブラリでエクスポートされていないHMValidateHandle関数を呼び出して、2番目のウィンドウのtagWND構造のカーネルメモリアドレスをリークします。次に、このエクスプロイトはNULLページで偽のtagPOPUPMENUオブジェクトを作成し、サブメニューにMN_BUTTONDOWNメッセージを送信します。

その後、カーネルは最終的にwin32k!xxxMNOpenHierarchy関数を実行します。

この関数はNULLページで細工されたオブジェクトをwin32k!HMAssignmentLockに渡します。bServerSideWindowProcビットがwin32k!HMAssignmentLock関数で設定されています。この関数は、win32k!HMDestroyUnlockedObjectの深層にあるいくつかの呼び出しに存在します。

これですべて完了です。このエクスプロイトは、2番目のウィンドウに特殊なメッセージを送信して、WndProcをカーネルモードで実行できるようになりました。

このエクスプロイトは、最後のステップとして、現在のプロセストークンをシステムトークンに置き換えます。

結論

Windows 8以降ではユーザープロセスをNULLページにマッピングすることが許可されないため、この攻撃は古いバージョンのWindowsに対してのみ機能します。Microsoftは、この対策をWindows 7 for x64-based systemsにバックポートしています。

Windows 7 for 32-bit systems Service Pack 1をまだ使用しているユーザーは、2020年1月14日にWindows 7 Service Pack 1の延長サポートが終了するため、新しいオペレーティングシステムにアップデートすることを検討してください。Windows 7の延長サポートが終了すると、Windows 7のユーザーに緊急のセキュリティアップデートは提供されなくなり、このような脆弱性の修正パッチは永久に適用されません。

IoC(セキュリティ侵害の痕跡情報)

SHA-1ファイル名
CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321Win32/Exploit.CVE-2019-1132.A