研究人员在Operation WizardOpium攻击活动中发现了Windows 0 day漏洞CVE-2019-1458在野利用。
2019年11月,Kaspersky研究人员在Operation WizardOpium攻击活动中成功检测到一个Google Chrome浏览器的0 day漏洞利用。在调查过程中,研究人员在攻击活动中还发现了另一个0 day漏洞利用。该漏洞CVE编号为CVE-2019-1458,是一个0 day权限提升漏洞,用于在受感染的机器中获取更高权限,或从Chrome进程沙箱中逃逸出来。该漏洞利用与著名的0 day开发者Volodya开发的漏洞利用非常相似。
该权限提升漏洞利用包括2个部分:一个小的PE加载器和真实的漏洞利用。在通过有漏洞的JS代码获取浏览器渲染进程的读写原语后,PE漏洞利用就会破坏内存中的一些指针来重定向代码执行到PE加载器中。这是通过绕过沙箱限制来实现的,因为PE漏洞利用不能简单地通过原始winAPI函数来开始新的进程。
PE加载器用真实的漏洞利用定位了嵌入DLL文件的位置,并且在原始Windows PE加载器中重复相同的过程,分析PE header,处理输入、输出等。之后,代码执行会被重定向到DLL的入口点——DllEntryPoint函数。然后PE代码会创建一个新的线程,就是漏洞利用本身的入口点,主线程在其停止前会一直等待。
攻击活动中的EoP漏洞利用
封装了该漏洞利用的PE文件header如下:
编译的时间戳Wed Jul 10 00:50:48 2019与其他二进制文件是不同的,表明之前已经用过了。
研究人员进一步分析该权限提升漏洞发现,该漏洞是win32k.sys驱动中的一个漏洞,该漏洞是0 day漏洞的原因是在最新版的Windows 7系统和一些Windows 10系统上也可以工作。
该漏洞本身与Windows切换功能有关,比如使用Alt + Tab键的组合来进行切换。这也是为什么漏洞利用代码中使用了许多winAPI调用(GetKeyState/SetKeyState)来模拟键盘输入操作。
开始的时候,漏洞利用会尝试使用ntdll.dll的RtlGetVersion调用来确定操作系统的版本,该调用的作用是在内存中找出一些设置虚假kernel GDI对象所需的offset值。同时,漏洞利用会尝试使用一些知名的技术来泄露kernel指针以达到泄露kernel内存地址的目的。之后,会尝试使用一些到CreateAcceleratorTable/DestroyAcceleratorTable的调用来在堆中创建含有漏洞的特殊内存布局。然后,会执行一些CreateBitmap调用,使用handle表数组就达到了泄露地址的目的。
触发漏洞利用代码路径
之后,会创建一些弹窗窗口和使用Window handles来调用系统调用NtUserMessageCall。此外,还会用任务切换窗口(#32771)的类来创建一个特殊的窗口,在驱动中触发该漏洞利用是非常主要的。在这一步,漏洞利用会尝试模拟alt键,然后调用SetBitmapBits来构造一个含有可以控制的指针值来构造一个GDI对象,该指针值会在漏洞利用调用第二个系统调用NtUserMessageCall时,kernel驱动的代码中使用到。这就是如何获取一个任意的kernel 读写原语。
获取任意R/W所需的原语
然后该原语会被用来在目标系统上执行权限提升。这一过程是通过使用现有系统驱动进程中的token值来覆写当前进程的EPROCESS结构的token值来实现的。
覆写EPROCESS结构的token值
Kaspersky研究人员称此类威胁可以通过沙箱技术来检测。