
CVE-2019-9729. Transferred from https://github.com/DoubleLabyrinth/SdoKeyCrypt-sys-local-privilege-elevation
SdoKeyCrypt.sys 是一款大型多人在线角色扮演游戏(MMORPG)冒险岛Online 的键盘保护驱动程序,该游戏在中国由盛大集团发行。
游戏官方网站:http://mxd.sdo.com。(语言:中文)
该驱动程序会在游戏首次运行时下载并安装到 C:\Windows\System32\ 文件夹中。由于游戏体积很大(约 13.11 GB),我在这里备份了一份 SdoKeyCrypt.sys 以便想要复现此漏洞的人使用。
SdoKeyCrypt.sys 绝对是官方版本,未被任何人修改过。
您可以看到它有一个由 盛大计算机(上海)有限公司 签名的有效数字签名,这确认了 SdoKeyCrypt.sys 确实由 盛大 制作。

在 IRP_MJ_DEVICE_CONTROL 处理例程中,当 IOCTL 代码为 时,驱动程序未能正确处理来自用户空间的数据,导致一个长度值可能为负数,从而发生堆下溢。
(DWORD)(-0x7FFF3FFC + 0x18) = 0x8000c01c借助堆喷射(即池风水攻击),可以禁用 SMEP 并在内核模式下运行任意 shellcode,从而实现本地权限提升。


使用支持 C++11 的 x64 Microsoft Visual C++ 编译器
$ 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 权限的 shell。
PoC 代码已测试并在 Win10 1709 和 Win10 1803 上正常工作。
然而,它在 Win10 1809 上无效,因为该版本使用了堆支持的内存池,缓解了堆喷射攻击。但它会导致蓝屏死机,因此至少存在本地拒绝服务漏洞。
以下是在 Win10 1803 17134.619 上的测试视频。
