Cointime

扫码下载App
iOS & Android

Numen 独家:微软 0day 漏洞可系统+物理层面掀掉 Web3 牌局

项目方

引言

在上个月微软的安全补丁中,包含一个在野利用的 win32k 提权漏洞。该漏洞似乎不能在 win11 的系统版本上触发,仅存在于早期系统。

这类漏洞的利用来源已久,此次,我们希望分析这类在当前新缓解措施不断改善的背景下,攻击组织是可能如何继续利用这个漏洞。

我们在 server2016 下完成整个分析过程。

背景补充:

0day 漏洞,即零日漏洞,指未被披露和修补的漏洞,时间概念上类比于 Web3 更为人熟知的概念,是 T+0 交易。0day 漏洞被发现后可以在未被察觉的情况恶意利用,这类攻击往往具备极大的破坏性。

Numen Cyber 本次发现的 0day 漏洞是微软 Windows 系统层面的漏洞,通过该漏洞,黑客可获取 Windows 的完全控制权。

被黑客控制所有权的后果,包括不限于个人信息窃取、系统崩溃数据丢失、财务损失、恶意软件植入等,小范围说,你的私钥可以被窃取,以及数字资产被转移。大范围说,这个漏洞能掀掉基于 Web2 基础设施运行的 Web3 牌局。

补丁分析

分析补丁,我们似乎并不能太直观看出是什么问题,这里仅仅似乎是一个对象的引用计数被多处理了一次:

但因为win32k是比较古老的代码,我们能找到一些早期的源码注释:

这样就非常好理解了,这里说明以前的代码只是锁定了窗口对象,没有锁定窗口对象中的菜单对象,这里菜单对象可能被错误引用。

实现 poc

https://github.com/numencyber/Vulnerability_PoC/blob/main/CVE-2023-29336/poc.cpp

如何错误的引用这个窗口中的菜单对象呢?

分析漏洞函数上下文,我们发现一个问题,传入到 xxxEnableMenuItem()的菜单,通常已经在上一层函数被锁定,那这里到底是要保护哪一个菜单对象呢?

继续分析 xxxEnableMenuItem 中,对菜单对象的可能处理过程,我们终于发现 xxxEnableMenuItem 中的 MenuItemState 函数返回的菜单有两种可能,一种就是窗口中的主菜单,但也有可能是菜单中的子菜单,甚至子子菜单。

poc 中,我们构造一个特殊的菜单(这里是三层,四个菜单):

上面相邻的菜单都是父子关系,如 菜单D 是 菜单C 的子菜单。

并且这些菜单有以下一些特点(这些特征都是为了通过 xxxEnableMenuItem 函数中的检测和判断,因为这和该漏洞产生原理有关):

  1. 菜单D 中,必须其 ID 类型必须为系统菜单类型的一种,如:0xf060(关闭菜单).
  2. 菜单A 也必须是系统菜单,为了在后续的菜单遍历过程中在 菜单C 中的子菜单中寻找到我们指定的系统菜单类型 0xf060(菜单A 中如果包含我们要找的系统菜单类型,会提前结束菜单查找过程)。我们需要删除 菜单A 中的对应系统菜单类型 0xf060。
  3. 删除掉 菜单C 在 菜单B 中的引用,才能在返回用户层的过程中彻底释放 菜单C。
  4. 为什么需要 菜单B,这里我们并不确认这是否是必须以及原理,但如果没有 菜单B 这一层,似乎 菜单C 的释放仍有一些不顺利。

在 xxxRedrawTitle 返回用户层的时候,删除 菜单C 和 菜单B 的引用关系,然后成功释放该 菜单C。

最后,回到内核中的 xxxEnableMenuItem 函数的 xxxRedrawTitle 函数返回点时,后面即将引用的 菜单C 对象已经无效。

实现 exp

A. 整体思路

在确定使用哪种利用思路之前,我们通常希望做一些理论上的前期判断,以避免一些不能绕过关键问题的方案会浪费大量尝试时间。这也是在分析其他漏洞 poc 或者 exp 的一个常规过程。

本次漏洞 exp 构造前,我们主要有以下两种考量方向:

执行 shellcode 代码:

这个思路参考早期的 CVE-2017-0263 和 CVE-2016-0167。这种方式我们并没有尝试,因为在该漏洞的这个方案下,执行 shellcode 的入口点以及一些例如 SMEP 的安全机制问题在高版本 windows 中,可能并没有一些方便且已经公开的解决方式。

利用读写原语修改 token 地址:

即使在最近的两年,依然已经有公开的 exp 可以参考。其中对于桌面堆内存布局以及桌面堆中的读写原语具有长久的通用性。我们现在唯一需要花更多时间完成的只是分析出 UAF 内存被重用时,如何第一次控制 cbwndextra 为一个特别大的值。

所以,这里我们将整个 exp 利用拆分为两个问题。一个是如何利用 UAF 漏洞控制 cbwndextra 的值,另一个则是控制 cbwndextra 值后,稳定的读写原语方式。

B. 如何写入第一次数据

当我们最开始触发漏洞时,系统并不总会 crash。因为我们的漏洞触发方式里,我们已经去掉了被重用漏洞在系统中所有的其他关联。

系统可能错误使用这个被我们控制内存的窗口对象数据基本只有 xxxEnableMenuItem 函数中的 MNGetPopupFromMenu() 和xxxMNUpdateShownMenu()。

我们使用窗口类 WNDClass 中的窗口名称对象来占用漏洞触发中我们释放的菜单对象。

我们能够实现第一次的数据写入时机也在这其中。

我们需要做的只有一件事,就是找到一个可以由我们构建的地址结构中,能够被任意写入数据的地方。哪怕仅仅一个字节(我们可以将这个字节写入到 cbwndextra 的高位)。

此过程如在迷宫中寻找一条出路,不再赘述。

最终我们有 xxxRedrawWindow 函数中的两个预备的方案。

如果使用 GreCreateRectRgnIndirect,交换相邻内存数据的方式有两个困难。

一是 cbwndextra 的前一个8位是一个非常不易控制的参数,并且似乎只能在有限的条件下短暂为1.另外使用这种方式时,cbwndextra 的其他相对偏移会定位到前一个对象(无论任何对象,因为这里只和窗口对象 cbwndextra 偏移本身大小有关)的最后8位,这是一个堆链表尾的安全字节,其不易受控。

所以我们使用了第二个地址写入点,即依靠一个标志位的 AND 2 操作。但同样,由于上述的堆链表尾的安全字节不易受控的原因,我们变换以下思路:

我们并不写入窗口对象的 cb-extra,而是写入 HWNDClass 的 cb-extra。这是因为后者的 cb-extra 偏移相对于前者的 cb-extra 偏移更小,我们可以通过布局内存,控制前一个对象的内存数据来当作通过 xxxRedrawWindow 函数中,对对象标志判断的参数。

C. 稳定的内存布局

我们设计内存至少是连续三个 0x250 字节的 HWND 对象。释放掉中间那一个,构造一个 0x250 字节的 HWNDClass 对象去占用释放掉的 HWND 对象。

前一个 HWND 对象其尾部数据作为通过 xxxRedrawWindow 中标志检验的参数。后一个 HWND 对象其菜单对象和其 HWNDClass 对象作为最终读写原语的媒介。

我们尽量控制窗口对象和我们的的 HWNDClass 对象尽量大小一致,窗口对象的扩展数据大小也要足够大,以通过前面提到的修改第一个窗口 class 对象的额外数据大小参数。

我们通过堆内存中的泄露的内核句柄地址来精确判断(计算按顺序排列的相邻对象的间距)我们申请的窗口对象是否按照我们预期的顺序排列。

D. 读写原语的一些修改

任意读原语我们仍然使用 GetMenuBarInfo();

任意写原语我们则使用 SetClassLongPtr();

除了替换 TOKEN 的写入操作是依赖第二个窗口的 class 对象,其他写入都是利用第一个窗口对象的 class 对象使用偏移来写入。

EXP 链接

https://github.com/numencyber/Vulnerability_PoC/tree/main/CVE-2023-29336

总结

A. win32k 现状

win32k 漏洞历史众所周知。但在最新的 windows11 预览版中,微软已经在尝试使用 Rust 重构该部分内核代码。未来该类型的漏洞在新系统可能被杜绝。

B. 漏洞利用过程基本不太困难

唯有如何使用释放内存重新占用的数据去控制第一次写入的方法需要比较细心的尝试外,基本不要需要使用到任何新的利用技术,该类漏洞严重依赖桌面堆句柄地址的泄露。

虽然其较以往有改动,但如果不彻底解决这个问题,对于老旧系统始终是一个不安全的隐患。

C. 漏洞的发现

分析该漏洞,我们擅自猜测该漏洞的发现可能依赖于更加完善的代码覆盖率检测。一旦系统 API 在目标函数的执行路径能够到达最深处的漏洞点,并且目前窗口对象本身也是一个多重嵌套引用状态,这个漏洞就可能被 fuzz 发现。

D. 其他发现途径

对于漏洞利用检测来说,除了对于漏洞触发函数的关键点的检测,对于这类不常见的对内存布局以及对窗口或者窗口类额外数据的异常偏移读写的针对检测将是发现此类型同种漏洞的可能途径之一。

参考

1.https://github.com/0x5bfa/NT5.1/blob/1b390dddff9fe017e9c11a7845c67a887c3483dc/Source/XPSP1/NT/windows/core/ntuser/kernel/mnsys.c#L511

2.https://github.com/L4ys/CVE-2022-21882/blob/main/CVE-2022-21882.cpp

3.https://github.com/KaLendsi/CVE-2022-21882/blob/main/ExploitTest.cpp

4.https://www.zerodayinitiative.com/blog/2023/5/8/the-may-2023-security-update-review

5.https://www.real-sec.com/2022/01/technical-analysis-of-cve-2021-1732/

评论

所有评论

推荐阅读

  • 英伟达市值不到两个月蒸发1万亿美元 估值回落至人工智能热潮掀起之前的水平

    7月8日,在不到两个月的时间里市值蒸发约1万亿美元后,英伟达股票触及自人工智能热潮掀起并推动该股飙升以来的最低廉水平。这家芯片制造商的图形处理器(GPU)仍然主导着人工智能数据中心市场。但其股价自5月14日创下历史新高以来已下跌16%,投资者纷纷调整人工智能交易策略,卖出英伟达,转而投资其他半导体制造商,尤其是内存市场的制造商。数据显示,抛售潮导致英伟达基于未来12个月预期盈利的市盈率为18倍。上一次触及如此低廉的水平还是在2019年初。更直观地了解其下跌程度之深,可以从与基准股指的比较看出,标普500指数的预期市盈率为20倍,纳斯达克100指数的预期市盈率接近23倍。

  • 博通盘前直线拉升转涨

    7月8日,博通美股盘前直线拉升转涨,此前一度跌近3%。消息面上,苹果与博通新签订多年期协议,该协议预计将超过300亿美元,生产超过150亿颗美国制造的芯片。

  • 存储股盘前集体下挫,闪迪跌超6%,美光科技跌超5%

    7月8日,美股存储芯片股盘前集体下跌,其中,闪迪跌超6%,美光科技跌超5%,西部数据、慧荣科技、希捷科技跌超4%((下图由扣子APP生成)。消息面上,有媒体称苹果正在测试长鑫存储生产的内存芯片,计划将其用于在华销售的设备。苹果还在美国科技企业中牵头游说华盛顿,争取允许更广泛地使用长鑫存储的产品,但该公司目前尚未承诺将这些芯片用于商业量产。

  • 苹果与博通新签订多年期协议 预计将超300亿美元

    7月8日,苹果:公司与博通新签订多年期协议,该协议预计将超过300亿美元,生产超过150亿颗美国制造的芯片。新的多年期协议还包括对科罗拉多州柯林斯堡设施的扩建。博通将投资15亿美元扩建柯林斯堡的设施。

  • 三菱日联:不应过分解读美联储会议纪要细节

    7月8日讯,三菱日联分析师Derek Halpenny表示,今晚美联储将公布6月FOMC会议纪要,但建议不要对会议纪要细节过度解读,因为6月会议前的背景与现在已有很大不同。点阵图很可能是在会议前一周(截至6月12日当周)提交的,如果现在召开会议,FOMC点阵图不会显示有九人支持加息。就这一点而言,隔夜指数互换曲线对加息的定价似乎偏高。目前7月29日会议加息的可能性定价仍接近30%,考虑到劳动力市场数据已经走弱,这一定价看起来过高。截至2027年3月,市场定价了近40个基点的加息,但我们认为届时降息的可能性大于加息。(金十)

  • 多家基石投资人、国资机构及战略投资者集体表态:长期看好MiniMax

    7月8日,在MiniMax基石投资者解禁窗口临近之际,超八成 Pre IPO 及基石股东明确表态长期看好并将继续持有。表态机构包括 Aspex、博裕、IDG、Janchor、Martis Fund等基石投资人,国寿投资、徐汇资本等国资机构,以及阿里、米哈游、云启、明势等早期股东,涵盖产业战略投资者、国际长线基金、国有资本及地方产业投资平台、市场化专业投资机构和公募基金等多元类型。8日下午,MiniMax盘中快速拉升涨近20%,最高报389.8港元。

  • 以色列正在为可能与伊朗恢复战斗做准备

    7月8日,据以色列媒体Walla,以军与美国中央司令部就伊朗问题举行会议,以色列正在为可能与伊朗恢复战斗做准备。

  • 新罕布什尔州将就1亿美元比特币支持债券提案举行公开听证会

    据The Block报道,美国新罕布什尔州官员将于周三就一项发行最高1亿美元比特币支持债券的提案举行公开听证会。该提案最终仍需获得州长凯利·阿约特(Kelly Ayotte)及执行委员会的批准方可落地。

  • Kraken过去24小时流出2108枚BTC

    据数据监测,Kraken交易所出现大额资金流动。过去24小时,该交易所钱包流出2108枚BTC,价值2.11亿美元,当前其BTC钱包余额为14.59万枚BTC。

  • 特朗普结束停火发言后 欧洲央行加息预期升温

    7月8日讯,市场定价显示,欧洲央行今年进一步收紧货币政策的预期升至36个基点,高于周二的25个基点,此前特朗普发表停火结束言论。(金十)