首页 > 代码库 > OD: Kernel Vulnerabilities Analyze

OD: Kernel Vulnerabilities Analyze

内核漏洞大多出没于 ring3 到 ring0 的交互中。从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞。例如:驱动程序中 IoControl 的处理函数,SSDT 和 Shadow SSDT 中的系统服务函数(无论是否被 hook 都有可能存在漏洞),系统回调函数,内核钩子程序等。从漏洞数量来看,驱动程序中 IoControl 的处理函数中的漏洞最为多见,尤其是第三方的驱动程序。

本节对几种典型的内核漏洞,用几个真实的内核漏洞案例来详细分析。

 

远程拒绝服务内核漏洞

对 CVE-2009-3103 / 2009-09-08 Microsoft SMB2 SRV2.sys Remote DOS 36299 进行分析:实现 SMB v2 协议相关的 srv2.sys 没有正确处理包含畸形 SMB 头结构数据的 NEGOTIATE PROTOCOL REQUEST(客户发送给 SMB 服务器的第一个 SMB 查询,用于识别 SMB 语言并用于之后的通信)请求。如果远程攻击者在发送的 SMB 报文的 Process Id High 头字段中包含畸形数据,就会在 srv2.sys 驱动中的 _Smb2ValidateProviderCallback() 触发越界内存引用,导致内核态执行任意指令或发生系统崩溃。漏洞利用无须额外认证过程,只要系统开放了通常的文件共享打印服务并允许远端访问。

 

书中简单地介绍了下 SMB 数据报的结构,使用了 IDA 来进行分析。通常 SMB 运行于 TCP/IP 之上,其数据报总体结构如下,其它内容见原书。

IDA 载入文件后默认以反汇编的方式显式,不过 Hex-Rays 插件可以显示为 C 语言。安装完 Hex-Rays 后,用鼠标定位到要翻译的反汇编程序段,点击 View - Open Subviews - Pseudocode 或者 F5 即可将代码段用 C 语言显示出来。

 

本地拒绝服务内核漏洞

对 CVE-2010-1734 / 2010-04-22 Microsoft SfnINSTRING win32k.sys Local DOS 39631 进行分析:win32k.sys 模块在 DispatchMessage 时,会最后调用到 xxxDefWindowProc(),这个函数在处理某些消息时会调用 gapfnScSendMessage() 这个函数表中的函数来处理,其中 Windows 2000/xp/2003 在处理 0x18d 号消息时,会有一个名为 SfnINSTRING() 的函数,这个函数当 lParam 不为空时,直接认为 lParam 是内存指针,并直接从地址中取出数据。虽然使用了 SEH,但只要传递错误内核地址,就会引发系统崩溃。

 

缓冲区溢出内核漏洞

对 2009-07-31 ALWIL avast4.8.1335_Professionnal aswmon2.sys Local Buffer Overflow - Privilege Escalation 进行分析:aswmon2.sys 对驱动派遣例程的处理中,IoControlCode 为 0xB2C8000C 时,当两次调用这个 IoControl 处理函数后,会导致内存中的函数指针被覆盖成一个固定的 DWORD,该值为 0x57523C00,而这个地址的内存可以在用户态分配。

OD: Kernel Vulnerabilities Analyze