Windows 11 23H2新特性:ETW事件终结KASLR绕过攻击?

本文深入解析Windows 11 23H2引入的新ETW事件THREATINT_PROCESS_SYSCALL_USAGE,探讨其如何检测可疑系统调用行为,包括KASLR绕过、虚拟机检测和物理内存访问等攻击技术,并分析其对安全防护的实际影响。

Windows 11 23H2新特性:ETW事件如何检测可疑系统调用行为

近年来,除了缓解和修补特定恶意软件或漏洞利用,微软开始针对漏洞类别进行防护。通过一系列缓解措施,如零初始化池分配、CET、XFG以及最新的CastGuard,利用漏洞变得越来越具有挑战性。此外,通过ETW(特别是威胁情报ETW通道)提高了对恶意软件和漏洞利用技术的可见性,可供EDR(终端检测与响应)使用。

在23H2预览版中,微软引入了一个新的ETW事件,这次针对的是可能指向各种可疑行为的NT API。

系统调用使用可见性

通过这一新变化,微软重点关注了几个系统调用,这些调用通常不应被许多应用程序使用,但可能被漏洞利用在其前或后利用阶段用于各种目的,如KASLR绕过、虚拟机检测或物理内存访问。这一新事件涵盖的许多情况已经仅限于特权进程——有些需要管理员或系统进程保留的权限,其他则限于低IL或不信任的调用者。但尝试调用任何这些系统调用都可能表明可疑活动,因此无论如何都值得关注。

到目前为止,EDR检测此类活动的唯一方法是在所有泄露内核指针的不同NtQuery函数上放置用户模式钩子。由于多种原因,这并不理想。微软一直试图让EDR远离用户模式钩子,主要是通过添加ETW事件,允许EDR通过非侵入性方式(尽管是异步且无阻塞能力)消费相同信息。

顺应这一趋势,Windows 11 23H2在威胁情报通道中添加了一个新的ETW事件——THREATINT_PROCESS_SYSCALL_USAGE。生成此ETW事件是为了表明非管理员进程已对API + 信息类进行了API调用,这可能表明一些异常(且可能恶意)的活动。以下两个API中的信息类将生成此事件:

  • NtQuerySystemInformation
  • NtSystemDebugControl

这些API有许多信息类,其中许多是“无害”的,并被许多应用程序常用。为了避免垃圾信息,以下信息类将生成ETW事件:

  • SystemModuleInformation
  • SystemModuleInformationEx
  • SystemLocksInformation
  • SystemStackTraceInformation
  • SystemHandleInformation
  • SystemExtendedHandleInformation
  • SystemObjectInformation
  • SystemBigPoolInformation
  • SystemExtendedProcessInformation
  • SystemSessionProcessInformation
  • SystemMemoryTopologyInformation
  • SystemMemoryChannelInformation
  • SystemCoverageInformation
  • SystemPlatformBinaryInformation
  • SystemFirmwareTableInformation
  • SystemBootMetadataInformation
  • SystemWheaIpmiHardwareInformation
  • SystemSuperfetchInformation + SuperfetchPrefetch
  • SystemSuperfetchInformation + SuperfetchPfnQuery
  • SystemSuperfetchInformation + SuperfetchPrivSourceQuery
  • SystemSuperfetchInformation + SuperfetchMemoryListQuery
  • SystemSuperfetchInformation + SuperfetchMemoryRangesQuery
  • SystemSuperfetchInformation + SuperfetchPfnSetPriority
  • SystemSuperfetchInformation + SuperfetchMovePages
  • SystemSuperfetchInformation + SuperfetchPfnSetPageHeat
  • SysDbgGetTriageDump
  • SysDbgGetLiveKernelDump

包含这些信息类的原因各不相同——有些已知会泄露内核地址,有些可用于虚拟机检测,另一些用于硬件持久性,还有一些表明对物理内存的先验知识,而大多数应用程序不应具有这些知识。总体而言,这一新事件涵盖了应用程序行为异常的多种指标。

每个缓解措施还必须考虑潜在的性能影响,ETW事件生成在频繁调用的代码路径中可能会减慢系统速度。因此,对此应用了一些限制:

  • 事件仅针对用户模式非管理员调用者生成。由于Admin->Kernel在Windows上不被视为边界,许多缓解措施不适用于管理员进程,以降低对系统的性能影响。
  • 每个进程每个信息类仅生成一次事件。这意味着如果单个进程调用NtQuerySystemInformation 10次,且均使用相同的信息类,则仅发送一个ETW事件。
  • 仅当调用成功时才发送事件。失败的调用将被忽略,不会生成任何事件。

为了支持需求2并跟踪进程涉及的信息类,在EPROCESS结构中添加了一个新字段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
union
{
    unsigned long SyscallUsage;
    struct
    {
        struct /* bitfield */
        {
            unsigned long SystemModuleInformation : 1; /* bit position: 0 */
            unsigned long SystemModuleInformationEx : 1; /* bit position: 1 */
            unsigned long SystemLocksInformation : 1; /* bit position: 2 */
            unsigned long SystemStackTraceInformation : 1; /* bit position: 3 */
            unsigned long SystemHandleInformation : 1; /* bit position: 4 */
            unsigned long SystemExtendedHandleInformation : 1; /* bit position: 5 */
            unsigned long SystemObjectInformation : 1; /* bit position: 6 */
            unsigned long SystemBigPoolInformation : 1; /* bit position: 7 */
            unsigned long SystemExtendedProcessInformation : 1; /* bit position: 8 */
            unsigned long SystemSessionProcessInformation : 1; /* bit position: 9 */
            unsigned long SystemMemoryTopologyInformation : 1; /* bit position: 10 */
            unsigned long SystemMemoryChannelInformation : 1; /* bit position: 11 */
            unsigned long SystemCoverageInformation : 1; /* bit position: 12 */
            unsigned long SystemPlatformBinaryInformation : 1; /* bit position: 13 */
            unsigned long SystemFirmwareTableInformation : 1; /* bit position: 14 */
            unsigned long SystemBootMetadataInformation : 1; /* bit position: 15 */
            unsigned long SystemWheaIpmiHardwareInformation : 1; /* bit position: 16 */
            unsigned long SystemSuperfetchPrefetch : 1; /* bit position: 17 */
            unsigned long SystemSuperfetchPfnQuery : 1; /* bit position: 18 */
            unsigned long SystemSuperfetchPrivSourceQuery : 1; /* bit position: 19 */
            unsigned long SystemSuperfetchMemoryListQuery : 1; /* bit position: 20 */
            unsigned long SystemSuperfetchMemoryRangesQuery : 1; /* bit position: 21 */
            unsigned long SystemSuperfetchPfnSetPriority : 1; /* bit position: 22 */
            unsigned long SystemSuperfetchMovePages : 1; /* bit position: 23 */
            unsigned long SystemSuperfetchPfnSetPageHeat : 1; /* bit position: 24 */
            unsigned long SysDbgGetTriageDump : 1; /* bit position: 25 */
            unsigned long SysDbgGetLiveKernelDump : 1; /* bit position: 26 */
            unsigned long SyscallUsageValuesSpare : 5; /* bit position: 27 */
        }; /* bitfield */
    }  SyscallUsageValues;
};

进程首次成功调用受监控的信息类之一时,设置对应于该信息类的位——这适用于管理员进程,即使不为这些进程发送ETW事件。仅当未设置该位时才发送ETW事件,确保每个类仅发送一次事件。虽然没有API查询此EPROCESS字段,但它有一个很好的副作用,即留下每个进程使用哪些信息类的记录——如果您分析系统,可以查看这一点!(但仅当系统中启用了系统调用使用事件时,否则位不会被设置)。

检查数据

目前没有任何东西启用此事件,也没有人消费它,但我预计Windows Defender很快就会开始使用它,并希望其他EDR也能如此。我手动启用了此事件,以查看这些“可疑”API是否在常规机器上使用,使用我的I/O环漏洞利用作为健全性测试(因为我知道它使用NtQuerySystemInformation泄露内核指针)。以下是几分钟正常执行的一些结果:

1
dx -g @$cursession.Processes.Where(p => p.KernelObject.SyscallUsage).Select(p => new {Name = p.Name, SyscallUsage = p.KernelObject.SyscallUsage})

显然,机器上有几个信息类使用相当频繁,其中主要(到目前为止)的是SystemFirmwareTableInformation。这些常见类可能早期被EDR忽略,因此被能够滥用它们的漏洞利用更频繁地使用。其他类不那么常见,更独特于漏洞利用,尽管合法软件也可能使用它,导致误检测。

结论

这是否意味着不再有基于API的KASLR绕过?或者所有现有漏洞利用将立即被检测到?可能不是。EDR需要一段时间才能开始注册这些事件并使用它们,特别是因为23H2只会在明年秋天正式发布,可能还需要一两年时间大多数安全产品才会意识到此事件的存在。而且由于此事件发送到威胁情报通道,只有PPL可以注册,许多产品根本无法访问此或其他漏洞利用相关事件。此外,即使对于将注册此事件的安全产品,这也不是改变世界的补充。此ETW事件仅仅替换了一些EDR已经在使用的用户模式钩子,而没有提供全新的功能。此事件将使EDR能够获取恶意进程进行的一些额外调用的信息,但这只是漏洞利用中的单个步骤,如果安全产品过于依赖它,无疑会导致许多误报。无论如何,此事件仅涵盖一些已知指标,留下许多其他潜在绕过。

总之,这是一个很酷的补充,我希望安全产品使用它来增加对潜在漏洞利用的可见性。虽然它目前还不是游戏改变者,但绝对是EDR和漏洞利用开发者在不久的将来需要考虑的事情。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计