
SdoKeyCrypt.sys は、中国の Shanda Group が運営する MapleStory Online と呼ばれる MMORPG(Massively-Multiplayer-Online-Role-Playing-Game)用のキーボード保護ドライバです。
ゲーム公式サイト: http://mxd.sdo.com. (言語: 中国語)
このドライバは、ゲームが初回起動時に C:\Windows\System32\ フォルダへダウンロードされインストールされます。ゲームは約13.11GBと非常に大きいため、このエクスプロイトを再現したい方のためにバックアップ SdoKeyCrypt.sys を用意しました。
SdoKeyCrypt.sys は確かに公式のものであり、誰にも変更されていません。
SdoKeyCrypt.sys が実際に Shanda によって作成されたことを確認する、Shanda Computer (Shanghai) Co., Ltd. による有効なダイジェスト署名があることがわかります。

IRP_MJ_DEVICE_CONTROL ハンドルルーチン内で、IOCTLコードが (DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c の場合、ドライバはユーザー空間から渡されたデータを適切に処理しないため、サイズ値が負になる可能性があり、ヒープアンダーフローが発生します。
ヒープスプレー(別名プール風水攻撃)を利用することで、SMEPを無効化し、カーネルモードで任意のシェルコードを実行してローカル特権昇格を行うことができます。


x64 Microsoft Visual C++ コンパイラ(C++11対応)を使用します。
$ cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Visual Studio 2017 Community でテスト済みです。以下は出力例です:
C:\Github\SdoKeyCrypt-sys-local-privilege-elevation>cl poc.cpp /Fe:poc.exe /link /dynamicbase:no /fixed ntdll.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27027.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
poc.cpp
Microsoft (R) Incremental Linker Version 14.16.27027.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:poc.exe
/dynamicbase:no
/fixed
ntdll.lib
poc.obj
次に、SdoKeyCrypt.sys が読み込まれていることを確認し、poc.exe を直接実行してください。問題がなければ、nt authority\system シェルが取得できるはずです。
PoCコードは Win10 1709 と Win10 1803 でテスト済みであり、正常に動作します。
ただし、ヒープスプレー攻撃を緩和するヒープバックプールを使用する Win10 1809 では動作しません。しかし、BSODを引き起こす可能性があるため、少なくともローカルサービス拒否の脆弱性は存在します。
以下は Win10 1803 17134.619 でのテストビデオです。
