深入分析Win32k系统调用过滤机制

[[183613]]

前言

Windows内核漏洞的利用具有高风险,经常用于浏览器沙箱逃逸。许多年以来,发现的大多数漏洞都是来源于Win32k.sys驱动,它负责处理来自GDI32.DLL和user32.dll的调用。为了缓解这些漏洞,微软在window10上实现了Win32系统调用过滤.总体思路是在进程入口处尝试阻止大量的发往win32.sys的系统调用,以便阻止未知的漏洞利用。我没有找到实现的相关细节,也不确定效果如何。我发现的唯一资料就是由Peter Hlavaty发表在 Rainbow Over the Windows的相关文章。

系统调用101

我理解过滤技术的第一个方法就是研究系统调用是如何执行。分析是基于Windows 10周年更新的64位版本。通常,系统调用在gdi32.dll或者user32.dll的函数中被初始化,最终会在win32u.dll中调用真实的系统调用。但是,我们可以直接使用汇编来显示系统调用,在以下的POC中,我查询到系统调用号为0x119E的WIN32K函数是NtGdiDdDDICreateAllocation。所以我简单地创建下面的测试应用程序:

下图是NtGdiDdDDICreateAllocation的汇编代码:

当运行syscall指令后,将转入内核模式执行.真实的系统调用位于NT!KiSystemStartService。但是,由于有大量的系统调用,所以我们需要在调试器中设置一个条件断点:

运行POC并开启断点

首先显示的系统调用号就是我们提供的0x119E,其实参数1,2,3,4保存在寄存器RCX,RDX,R8和R9中。在IDA中查看相关代码:

查阅代码,我们发现一个有趣的问题:RBX寄存器的内容是什么,这又是从何而来。尝试引用KiSystemServiceStart,我们发现 RBX在以下函数中被设置:

MOV RBX GS:188将Win32SyscallFilter.exe的内核线程结构载入RBX中,验证如下:

研究算法

接下来的问题是RBX + 0x78代表什么,事实证明,它代表一系列的标志位。下图引用的两个标志是GuiThread和RestrictedGuiThread,它们分别位于标志的第6位和和19位。

在我们的例子中,标志位的值如下:

由于线程不是一个GUI线程,所以会重定向的将它转换成一个GUI线程,然后返回相同的指针。继续执行会发生:

Win32kSyscallFilter并没有做任何事。但是接下来的检查很有趣。RestrictedGuiThread标志指明,如果启用系统调用过滤,会在进程级别上进行检测:

因此,对于当前的进程和线程,系统调用过滤没有启用。查看进一步执行,将体现出这个标志位的重要性:

如果开启了系统调用过滤功能,KeServiceDescriptorTableFilter将取代KeServiceDescriptorTableShadow,如果没有开启过滤,则将使用KeServiceDescriptorTableShadow。接下来要观察系统调用表的使用,如下图所示:

在经过运算后,RDI包含系统调用数目。在WIN32K系统的情况下,它的值是0x20。所以,取决于系统调用过滤是否开启,不同的表会被载入R10.这两个选项是:

然后该表将转入真实的函数调用:

跟随以上的算法,我们在调试器中找到:

所以这很显然,系统调用号通过负偏移指向W32pServiceTable结构,然后指向真实的NtGdiDdDDICreateAllocation函数。这是非常好的,但是如果开启了系统调用过滤,会有什么区别呢,这可以使用W32pServiceTableFilter来进行验证:

我们看到在此之前并没有什么区别,这是因为NtGdiDdDDiCreateAllocation并不是过滤的API之一,如果我们选择其他的系统调用,比如NtGdiDdDDiCreateAllocation,它的系统调用号是0x117E。我们基于是否启用系统调用过滤来对比以下两个输出。

首先是未启用系统调用过滤的:

然后是启用系统调用过滤:

我们发现,如果开启了系统调用过滤功能,系统调用是不允许的另一个函数被调用的。该过滤函数验证是否启用系统调用过滤并简单的结束系统调用。

利用的结果

现在我们了解了系统调用过滤是如何工作的,我们需要研究它是如何防止内核漏洞利用的。首先要看看它保护的是什么进程,到目前为止,仅仅是微软Edge可以启用这个功能,目前第三方程序没有可以启用它的接口。这意味着系统调用过滤仅仅关心Microsoft Edge漏洞并且仅限于内核漏洞。下面我们可以看到MicrosoftEdgeCP.exe的进程结构,并启用了系统调用过滤:

回顾我早期文章,关于重新启用tagWND对象作为读写原语的用法的,我想知道是否使用这个方法的任意系统调用都会被过滤,在那个方法中使用的内核模式的函数是:

  1. NtUserCreateWindowEx 
  2. NtUserDestroyWindow 
  3. NtUserSetWindowLongPtr 
  4. NtUserDefSetText 
  5. NtUserInternalGetWindowText 
  6. NtUserMessageCall 

在win32k.sys中没有stub_*方法的函数意味着不会被过滤。结论就是Win32K系统调用过滤不会阻止可能导致漏洞的系统调用,但是当系统调用触发一个漏洞时,它一定会阻止,可能是write-that-wherer或者是一个缓冲区溢出。WIN32K系统调用过滤所提供的保护是巧妙的,但关键在于是否使用了系统调用来触发漏洞。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/145784.html<

(0)
管理的头像管理
上一篇2025-03-10 19:05
下一篇 2025-03-10 19:06

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注