# 微软Windows系统严重漏洞分析:可能危及Web3生态安全上个月微软发布的安全补丁中修复了一个正被黑客利用的Windows提权漏洞。这个漏洞主要影响早期Windows系统版本,Windows 11似乎不受影响。本文将分析在当前安全防护不断加强的背景下,攻击者如何继续利用这类漏洞。我们的分析是基于Windows Server 2016完成的。## 漏洞背景这是一个0day漏洞,即尚未公开和修复的漏洞。黑客可以在用户不知情的情况下利用它进行攻击,破坏性极大。通过这个Windows系统级别的漏洞,黑客可以获取系统的完全控制权。这可能导致个人信息泄露、系统崩溃、数据丢失、财务损失等严重后果。对于Web3用户来说,私钥和数字资产可能被盗。从更广泛的角度看,这个漏洞甚至可能影响整个基于Web2基础设施的Web3生态系统。## 补丁分析 分析补丁代码,问题似乎出在一个对象的引用计数被多处理了一次。通过查看早期源码注释,我们发现以前的代码只锁定了窗口对象,没有锁定窗口中的菜单对象,这可能导致菜单对象被错误引用。## 漏洞复现分析漏洞函数上下文,我们发现传入xxxEnableMenuItem()的菜单通常已在上层函数被锁定,这里究竟要保护哪个菜单对象存在疑问。进一步分析发现,xxxEnableMenuItem中MenuItemState函数返回的菜单有两种可能:窗口主菜单或子菜单(甚至子子菜单)。我们构造了一个特殊的四层菜单结构来触发漏洞,这些菜单需要满足一些特定条件以通过函数中的检测。关键是在xxxRedrawTitle返回用户层时,删除某些菜单间的引用关系,释放特定菜单对象。这样在xxxEnableMenuItem函数返回点时,即将引用的菜单对象就已无效。## 漏洞利用在开发漏洞利用程序(exp)时,我们主要考虑了两种方案:1. 执行shellcode代码:参考早期的类似漏洞,但在新版Windows中可能存在一些障碍。2. 利用读写原语修改token地址:这种方法近期仍有公开exp可参考,对桌面堆内存布局和读写原语有较好的通用性。我们选择了第二种方案,将整个利用过程分为两步:如何利用UAF漏洞控制cbwndextra的值,以及如何稳定地实现读写原语。关键是找到一个可以由我们构建的地址结构中能够被任意写入数据的位置。我们最终选择了通过xxxRedrawWindow函数中的一个标志位AND操作来实现。为了实现稳定的内存布局,我们设计了至少三个连续的0x250字节HWND对象,释放中间的对象,用HWNDClass对象占用。前后的HWND对象分别用于通过函数检验和实现最终的读写原语。我们还通过泄露的内核句柄地址来精确判断对象是否按预期排列。读写原语方面,我们使用GetMenuBarInfo()实现任意读,使用SetClassLongPtr()实现任意写。## 结论1. 微软正在尝试用Rust重构win32k相关代码,未来此类漏洞可能在新系统中被杜绝。2. 这类漏洞的利用过程相对简单,主要依赖桌面堆句柄地址的泄露。如果不彻底解决这个问题,老旧系统将持续面临安全隐患。3. 该漏洞的发现可能得益于更完善的代码覆盖率检测技术。4. 对于漏洞利用检测,除了监控关键函数,还应该关注异常的内存布局和数据读写行为。
Windows系统漏洞威胁Web3生态安全 专家深度分析利用机制
微软Windows系统严重漏洞分析:可能危及Web3生态安全
上个月微软发布的安全补丁中修复了一个正被黑客利用的Windows提权漏洞。这个漏洞主要影响早期Windows系统版本,Windows 11似乎不受影响。
本文将分析在当前安全防护不断加强的背景下,攻击者如何继续利用这类漏洞。我们的分析是基于Windows Server 2016完成的。
漏洞背景
这是一个0day漏洞,即尚未公开和修复的漏洞。黑客可以在用户不知情的情况下利用它进行攻击,破坏性极大。
通过这个Windows系统级别的漏洞,黑客可以获取系统的完全控制权。这可能导致个人信息泄露、系统崩溃、数据丢失、财务损失等严重后果。对于Web3用户来说,私钥和数字资产可能被盗。从更广泛的角度看,这个漏洞甚至可能影响整个基于Web2基础设施的Web3生态系统。
补丁分析
分析补丁代码,问题似乎出在一个对象的引用计数被多处理了一次。通过查看早期源码注释,我们发现以前的代码只锁定了窗口对象,没有锁定窗口中的菜单对象,这可能导致菜单对象被错误引用。
漏洞复现
分析漏洞函数上下文,我们发现传入xxxEnableMenuItem()的菜单通常已在上层函数被锁定,这里究竟要保护哪个菜单对象存在疑问。
进一步分析发现,xxxEnableMenuItem中MenuItemState函数返回的菜单有两种可能:窗口主菜单或子菜单(甚至子子菜单)。
我们构造了一个特殊的四层菜单结构来触发漏洞,这些菜单需要满足一些特定条件以通过函数中的检测。关键是在xxxRedrawTitle返回用户层时,删除某些菜单间的引用关系,释放特定菜单对象。这样在xxxEnableMenuItem函数返回点时,即将引用的菜单对象就已无效。
漏洞利用
在开发漏洞利用程序(exp)时,我们主要考虑了两种方案:
执行shellcode代码:参考早期的类似漏洞,但在新版Windows中可能存在一些障碍。
利用读写原语修改token地址:这种方法近期仍有公开exp可参考,对桌面堆内存布局和读写原语有较好的通用性。
我们选择了第二种方案,将整个利用过程分为两步:如何利用UAF漏洞控制cbwndextra的值,以及如何稳定地实现读写原语。
关键是找到一个可以由我们构建的地址结构中能够被任意写入数据的位置。我们最终选择了通过xxxRedrawWindow函数中的一个标志位AND操作来实现。
为了实现稳定的内存布局,我们设计了至少三个连续的0x250字节HWND对象,释放中间的对象,用HWNDClass对象占用。前后的HWND对象分别用于通过函数检验和实现最终的读写原语。
我们还通过泄露的内核句柄地址来精确判断对象是否按预期排列。读写原语方面,我们使用GetMenuBarInfo()实现任意读,使用SetClassLongPtr()实现任意写。
结论
微软正在尝试用Rust重构win32k相关代码,未来此类漏洞可能在新系统中被杜绝。
这类漏洞的利用过程相对简单,主要依赖桌面堆句柄地址的泄露。如果不彻底解决这个问题,老旧系统将持续面临安全隐患。
该漏洞的发现可能得益于更完善的代码覆盖率检测技术。
对于漏洞利用检测,除了监控关键函数,还应该关注异常的内存布局和数据读写行为。