
CVE-2019-9729. https://github.com/DoubleLabyrinth/SdoKeyCrypt-sys-local-privilege-elevation에서 이전됨
__SdoKeyCrypt.sys__는 중국에서 Shanda Group이(가) 배급하는 MapleStory Online이라는 MMORPG(대규모 다중 접속 온라인 롤플레잉 게임)를 위한 키보드 보호 드라이버입니다.
게임의 공식 웹사이트: http://mxd.sdo.com. (언어: 중국어)
이 드라이버는 게임이 처음 실행될 때 C:\Windows\System32\ 폴더에 다운로드 및 설치됩니다. 게임이 약 13.11GB로 매우 크기 때문에, 이 익스플로잇을 재현하려는 사람들을 위해 백업 파일 SdoKeyCrypt.sys을(를) 준비했습니다.
SdoKeyCrypt.sys는 확실히 공식 파일이며 누구에 의해서도 수정되지 않았습니다.
보시다시피 _Shanda Computer (Shanghai) Co., Ltd._가 서명한 유효한 다이제스트 서명이 있으며, 이는 SdoKeyCrypt.sys가 실제로 _Shanda_에 의해 만들어졌음을 확인해 줍니다.

IRP_MJ_DEVICE_CONTROL 처리 루틴에서 IOCTL 코드가 (DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c일 때, 드라이버는 사용자 공간에서 전달된 데이터를 제대로 처리하지 못하여 크기 값이 음수가 될 수 있고, 그 결과 힙 언더플로(heap underflow)가 발생합니다.
힙 스프레이, 일명 pool-Feng-Shui 공격을 활용하면 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__에서 테스트되었으며 정상 작동합니다.
하지만 힙 기반 풀(heap-backed pool)을 사용하여 힙 스프레이 공격을 완화하는 __Win10 1809__에서는 작동하지 않습니다. 다만 BSOD를 유발할 수 있으므로 최소한 로컬 서비스 거부(Denial-of-Service) 취약점은 존재합니다.
다음은 __Win10 1803 17134.619__에서의 테스트 영상입니다.
