
Windows の UAF に対する LPE エクスプロイト (CVE-2021-40449).
CVE-2021-40449 のエクスプロイトです。win32kfull!GreResetDCInternal の UAF を介した Windows LPE です。
UAF の脆弱性に加えて、このエクスプロイトを可能にするために他のプリミティブが使用されています。
SystemHandleInformation パラメータを使用した NtQuerySystemInformation() 関数を介して、ring0 でエクスプロイトの access token のアドレスを漏洩します。rtlSetAllBits() を使用し、エクスプロイトの access_token.privileges を 0xFF で上書きします。EnumDeviceDrivers() 関数を介して ntoskrnl.exe モジュールのベースアドレスを漏洩し、ring0 上の rtlSetAllBits() のアドレスを漏洩します。BitMapHeader を、エクスプロイトの access_token.privileges を上書きできるように細工します。NtSetInformationThread() プリミティブを介して細工した BitMapHeader を割り当て、SystemBigPoolInformation パラメータを使用した NtQuerySystemInformation() 関数を介してビッグプール内の割り当てアドレスを漏洩します。EnumPrinters() を介してシステム上のプリンターを列挙し、そのうちの1つのドライバをロードし、ユーザーモードコールバック関数 DrvEnablePDEV() への呼び出しをフックします。DrvEnablePDEV() 関数への呼び出しをプロキシし、エクスプロイト処理を実行してから、プロキシされた呼び出しから返されたものを GDI に返します。DrvEnablePDEV() 内での ResetDC() への2回目の呼び出しを介して UAF をトリガーします。CreatePalette() プリミティブを使用して同じサイズの細工されたオブジェクトをスプレーすることで、解放された PDC オブジェクトを再利用します。SeDebugPrivilege 特権を悪用し、winlogon.exe プロセスにシェルコードを注入して NT AUTHORITY\SYSTEM を取得します。詳細は、Kaspersky によるこの記事を参照してください。
Win10 Redstone (ビルド 14393) でテスト済み。