window下几个漏洞的分析和复现

admin 2023年12月25日07:52:35评论34 views字数 4023阅读13分24秒阅读模式

操作系统是计算机系统的核心软件,其主要功能在于管理计算机系统中的各种软硬件资源,并为计算机和用户程序提供访问这些资源的统一抽象。为实现这一设计目标,操作系统内核通常运行在称为内核态的高特权级执行环境中。一旦操作系统内核被恶意攻击者非法入侵,攻击者就会立即拥有对整个计算机系统的控制权,造成极大程度的破坏。因此,针对操作系统内核漏洞挖掘一直是学术界和工业界的研究重点。

Windows操作系统中存在的安全漏洞也往往具有广泛的影响和严重的潜在的稀释。攻击者可以利用这些漏洞来进行大规模的网络攻击,给网络安全带来严重的威胁。通过分析近年来披露的Windows内核漏洞,我们发现,这些漏洞大多是由独立的研究人员或安全研究团队发现的,并且极大地依赖于专家知识,仅在特定的情况下采用了模糊测试等自动化方法来辅助漏洞挖掘。

 

01

CVE-2023-21537漏洞

 

该漏洞于2023年1月披露,并已被微软修复。漏洞并没有公开的PoC程序,漏洞发现者只通过博客文章公开了部分信息。该漏洞的复现版本为Windows 10 21H1 19043.928。

该漏洞存在于消息队列(MSMQ)驱动程序mqac.sys中。消息队列是Windows的可选功能,需要在控制面板中手动启用,并在计算机管理中创建消息队列。微软为消息队列的开发提供了头文件mq.h以及运行时库mqrt.dll,其中包含MQOpenQueue和MQSendMessage等函数。这些函数其实是封装驱动对程序mqac.sys发起的IoControl调用,通过构造合法的参数,用户态程序也可以直接调用使用NtDeviceIoControlFile发送IoControl调用,触发此驱动程序的功能。

该漏洞的原因是mqac.sys中的ACSendMessage函数会两次读取一个来自用户的输入参数,第一次该参数用于控制堆栈长度,第二次写入在释放堆内存时,根据该长度进行然而,可能逻辑出现考虑参数会被用户修改的可能,从而构成一个Double fetch 漏洞,可能导致错误的内存被释放。

mqac.sys中负责处理IoControl调用的函数名称为ACDeviceControl,该函数将为用户解析确定的参数,并调用不同的派发函数。通过逆向分析ACDeviceControl函数,发现当IoControl调用号为0x19658107且输出轴线的总长度为0x2C0时,会进一步调用ACSendMessage这一派发函数。ACSendMessage函数首先将用户状态图复制到内核状态栈上的状态图,之后,将执行核心的业务逻辑,调用CQueue::PutNewPacket来发送用户请求的数据,完成后调用 ACFreeDeepCopyQueueFormat 进行堆内存的释放。此处出现漏洞:进行内存释放操作创建的第二个参数直接读取用户波形波形中。

如图 下图所示,参数a4就是指向枢纽的指针。

window下几个漏洞的分析和复现

这意味着,如果攻击者设法赢得竞争条件,在ACSendMessage 函数进行内存释放前成功地修改了此处的参数值,将其设置为增大的值,那么将导致超出范围地释放任何指示器。

通过进一步分析,触发特定漏洞时消息队列设备需要一个的状态,这需要PoC程序预先执行其他IoControl调用。当用户视角中偏移量584个字节处应该是一个合法的虚拟的指针,才能通过消息队列驱动程序的参数检查。在满足这些约束条件的情况下,PoC程序启动两个线程,一个用于发送IoControl调用,另一个修改用户像素中心偏移量592个字节处的值通过人工构造参数并编写PoC程序发起IoControl请求,可以成功地使内核崩溃,如下面两图所示。

window下几个漏洞的分析和复现

上图:漏洞导致蓝屏,原因为BAD_POOL_CALLER

window下几个漏洞的分析和复现

上图:WinDbg观察漏洞的调用栈,与预期触发的相同

 

02

CVE-2021-41335漏洞

该漏洞存在于Windows的内核ntoskrnl.exe中。漏洞的原因是两个内核函数:ObpCreateSymbolicLinkName与ObpDeleteSymbolicLinkName可能操作同一个_OBJECT_SYMBOLIC_LINK内核对象,但它们容易正确进行加锁操作,从而存在竞态条件安全漏洞该漏洞将导致越界访问,并可能被进一步利用,导致内核任意地址写入造成严重的破坏。该漏洞的复现版本为Windows 10 21H1 19043.928。

触发漏洞的调用链是:NtCreateSymbolicLinkObject系统调用会执行ObInsertObjectEx来创建符号链接,该函数先调用ObpCreateHandle来为新的符号链接对象创建一个新的句柄,再调用ObpCreateSymbolicLinkName创建符号链接。但是,在ObpCreateHandle执行结束之后,用户态程序就已经拥有了指向内核对象的有效句柄。这意味着,在接下来的 ObInsertObjectEx 调用 ObpCreateSymbolicLinkName 时,用户态进程打开另一个线程并尝试通过该句柄操作将会被内核函数使用的新符号例如,可以在另一个线程中通过NtClose函数调用关闭该句柄,这显然会导致问题。

为了进一步明确漏洞的成因,通过人工逆向分析比较ObpCreateSymbolicLinkName和ObpDeleteSymbolicLinkName的代码,可以注意到:ObpDeleteSymbolicLinkName将符号链接对象的DosDeviceDrive成员Index设置为0;而ObpCreateSymbolicLinkName读取符号链接对象的该成员并将其后面1 。

另外,ObpCreateSymbolicLinkName使用减少后的DosDeviceDriveIndex值作为_DEVICE_MAP结构中的DriveType阵列的索引。

window下几个漏洞的分析和复现

上图:链接符号对象的DosDeviceDriveIndex成员被置零

由于加锁操作存在问题,恶意攻击者可以尝试使DosDeviceDriveIndex成员已经被置零后,又进行自减操作,从而产生整数下溢。又由于该数值被用于阵列索引,这将导致越界访问。

为了修复这个漏洞,需要创建两个线程,第一个线程通过NtCreateSymbolicLinkObject不断创建新的符号链接对象,而第二个线程则通过NtClose不断关闭创建新的符号链接对象句柄。

通过这样做,很可能会出现ObpDeleteSymbolicLinkName在ObpCreateSymbolicLinkName被调用的线程交错情况。因此,ObpCreateSymbolicLinkName将取值为0xFFFFFFFF作为索引访问DriveType底层,导致在堆栈边界访问中均值,最终引发内核崩溃。具体的漏洞复现情况和调试器读取的注册表参数如图6、图7所示,可以看到,执行NtClose的线程进行了超过35万次尝试,才触发了导致漏洞的线程交错方式。

window下几个漏洞的分析和复现

上图:运行PoC程序,两个线程分别创建和引用内核对象

window下几个漏洞的分析和复现

上图:WinDbg捕获蓝屏死机的情况,可见rcx寄存器值存在整数下溢

通过补丁对比分析可以发现,该漏洞的修复方式是由ObpCreateHandle来ObpCreateSymbolicLinkName创建符号链接,避免调用用户状态进程提前对句柄进行操作。 

03

CVE-2018-7249漏洞

该漏洞存在于Windows的secdrv.sys驱动程序中,是一个UAF类型的漏洞。该漏洞的复现版本为Windows 7 7600。

secdrv.sys驱动程序提供了IoControl调用号为0x0CA002813的接口,其处理函数sub_11A88接收不同的输入参数:0x96、0x97和0x98,根据并参数调用不同的派发函数。其中:0x96从分页内存池中分配内存块,进行初始化操作,将其中一部分复制到提供用户的蜡烛图中(这里还存在一个未初始化访问的问题,导致内核态的16位内存泄漏到用户态)。0x97读取先前的由0x96分配的块,投影用户输入角度进行加密。0x98则用于释放由0x96分配的块。

window下几个漏洞的分析和复现

上图:处理函数根据输入参数a2执行不同的操作

当调用IoControl类型0x97时,它通过标签找到之前由类型0x96分配的内存块。这里的漏洞弥补,0x97使用内存的过程缺少加锁和同步机制。在其操作内存期间,可能内存可能被释放,因此如果恶意攻击者成功赢得竞态条件,将触发释放后使用的问题。进一步地,如果攻击者在 IoControl 类型 0x97 的操作期间,使用类型 0x98 成功释放了块,并重新分配了一个由攻击者控制的新块到几个内存位置,那么这将有可能最终劫持驱动程序的执行控制流,并在内核态执行任何代码。由于 0x97 中的加密函数在用户提供的法兰克福上执行,这个法兰克福可能非常大,因此加密可能需要很长时间才能执行,从而为 IoControl 类型 0x98 提供了完美的时间窗口来达成竞态条件。

该漏洞存在公开的Exp程序,经过简单调试后即可稳定实现漏洞利用,获得SYSTEM权限。

window下几个漏洞的分析和复现

上图:复现漏洞CVE-2018-7249实现提权

该漏洞的触发方式简单,且输入参数也没有严格的约束条件,从而通过自动化漏洞挖掘工具发现该漏洞是可能的。现有的竞态条件漏洞挖掘方案可以自动由顺序执行的IoControl序列调用生成多线程的序列,并探索不同线程交错的情况下其执行过程是否出现异常。

,这仍需要先通过对驱动程序的分析,推断出相关的IoControl调用号,并指导模糊测试器通过启动多个线程来分别执行0x97和0x98对应的IoControl操作。有关问题仍需进一步研究。

参考链接

https://datacon.qianxin.com/info/information-detail?id=122

原文始发于微信公众号(安全架构):window下几个漏洞的分析和复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月25日07:52:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   window下几个漏洞的分析和复现http://cn-sec.com/archives/2231145.html

发表评论

匿名网友 填写信息