刚刚修复的Windows 0day和Chrome 0day 已被组合用于 WizardOpium 攻击

微软在刚刚发布的12月“补丁星期二”中共修复36个漏洞,其中含一个已遭利用的 Windows 0day (CVE-2019-1458)。卡巴斯基实验室指出,该漏洞和一个 Chrome 0day  (CVE-2019-13720) 同时被用于Operation  WizardOpium 攻击活动中。微软将该漏洞称为“Win32k提权漏洞”,指出它可导致攻击者在内核模式中执行命令,也就是说它具有对操作系统的完整访问权限。微软表示:“当Win32k 组件未能正确处理内存中的对象时,Windows 中就存在提权漏洞。成功利用该漏洞的攻击者可以在内核模式中运行任意代码。攻击能够安装程序;查看、修改或删除数据;或以完整的用户权限创建新账户。要利用这个漏洞,攻击者首先必须登录系统,之后运行可利用该漏洞的特殊构造的应用程序并控制受影响系统。发布的更新通过更正了 Win32k 处理内存对象的方式解决了这个漏洞问题。”

卡巴斯基实验室发布相关报告,翻译如下

2019年10月,卡巴斯基实验室成功地检测到被用于 Operation WizardOpium 攻击活动中的一个 Chrome 0day (CVE-2019-13720)。我们在调查活动中发现这些攻击活动中还使用了另外一个 0day。谷歌 Chrome 的 exploit 内嵌了一个 0day 提权 (EoP) exploit (CVE-2019-1458),用于获取受感染机器上更高的权限并逃逸 Chrome 进程沙箱。这个 exploit 和由 0day 多产开发员“Volodya”开发的exploit 非常相似。该 EoPexploit 由两个阶段组成,一个小型 PE 加载器和实际的 exploit。通过易受攻击的 JS 代码在浏览器的渲染器进程中实现读/写原语之后,PEexploit 损坏了内存中的某些指针,目的是将代码执行重定向至 PE 加载器。这样做是为了绕过沙箱限制,因为该 PE exploit 无法只使用原生 WinAPI 函数就启动新进程。PE 加载器通过实际 exploit 定位内嵌的 DLL 文件并重复和原生 Windows PE 加载器一样的进程:解析 PE 标头、处理导入/导出等。之后,代码执行被重定向至 DLL 的入口点即 DllEntryPoint 函数。该 PE 代码随后创建一个新进程作为 exploit 本身的入口点,而主线程等待其停止 。

(攻击中利用的 EoP)

封装该 EoPexploit 的 PE 文件的标头如下:

Wed Jul 10 00:50:48 2019 这个编译时间戳和其它二进制不同,表明它已被使用了一段时间。我们对 EoPexploit 的详细分析表明,它所使用的漏洞属于 win32k.sys 驱动,而 EoP exploit 就是这个 0day exploit,原因是它适用于最新(修复的)Windows 7 版本甚至适用于一些 Windows 10 的新版本(新的 Windows 10 版本并不受影响,因为它们实现了阻止对可利用代码的正常使用的措施)。该漏洞本身和windows 切换功能有关(例如使用 Alt-Tab 键组合触发的功能)。这也是为何这个 exploit 的代码使用了一些 WinAPI 调用 (GetKeyState/SetKeyState) 来模拟关键的按键操作。起初,该exploit 试图通过使用ntdll.dll 的 RtlGetVersion 调用来查找操作系统版本,而 RtlGetVersion 用于查找内存中设置虚假内核 GDI 对象所需的十几个偏移量。同时,它试图通过使用多种广为人知的技术泄露一些内核指针,从而泄露一些内核内存地址 (gSharedInfo、PEB 的 GdiSharedHandleTable) 。之后,它试图通过 CreateAcceleratorTable/DestroyAcceleratorTable 的很多调用创建一个特殊的内存布局,其中堆中存在多个漏洞。之后执行 CreateBitmap 的一堆调用,而它们的地址通过句柄表数组遭泄露

(触发可利用的代码路径)

随后,通过窗口句柄创建一些弹出窗口并调用未记录的 syscall NtUserMessageCall。另外,它使用任务切换窗口 (#32771) 的类创建一个特殊窗口,它对于触发驱动中的可利用的代码路径而言起着重要作用。在这一步,该 exploit 试图模拟 Alt 键,之后使用 SetBitmapBits的一个调用构造一个 GDI 对象。该对象中包含一个可控制的指针值,在 exploit 向 syscall (NtUserMessageCall) 再次发出未记录调用后,该指针值可被用于内核驱动的代码 (win32k!DrawSwitchWndHilite) 中。这就是它如何获得任意内核读/写原语的过程。

(实现造成任意读/写所需原语)

该原语随后被用于在目标系统上提升权限,方法是使用现有系统驱动进程的令牌值来覆写当前进程 EPROCESS 结构中的一个令牌 。

(覆写EPROCESS 令牌结构)

幕后黑手

卡巴斯基在关于Chrome 0day 和该 Windows 0day 的分析文章中并未指出 Operation WizardOpium 组织的身份。不过它在 Chrome 0day 分析文章中表示,“无法和任何已知的威胁行动者之间建立确切的关联”,“和 Lazarus 攻击活动中存在某些非常薄弱的代码相似之处,尽管这种迹象也可能是一种伪旗旗标”,实际上“目标网站的资料和早期的 DarkHotel 攻击之间存在更多的一致之处。”