John UhlmannSamir Bousseaden

加倍投入:使用内核 ETW 调用堆栈检测内存威胁

通过 Elastic Security 8.11,我们添加了更多基于内核遥测调用堆栈的检测,以提高针对内存威胁的有效性。

9 分钟阅读安全研究
Doubling Down: Detecting In-Memory Threats with Kernel ETW Call Stacks

简介

我们很高兴看到我们在 8.8 版本中发布的内核调用堆栈功能获得了极其积极的社区反馈——包括试图规避我们的攻击性研究团队,以及由于额外的上下文信息而更快地分诊警报的防御团队。

但这只是第一步:我们需要为防御者提供来自内核的更多可见性——这是对抗用户模式威胁最可靠的机制。随着 x64 Windows 中内核补丁保护的引入,微软创建了一个共享责任模型,其中安全供应商现在只能访问微软提供的内核可见性和扩展点。这种可见性最值得注意的补充是 Microsoft-Windows-Threat-Intelligence 事件跟踪 for Windows (ETW) 提供程序。

微软已经确定了一些高度安全相关的系统调用,并为安全供应商提供了这些调用的近实时遥测。虽然我们强烈倾向于允许同步阻止恶意活动的内联回调,但微软隐式地认为这还不是必要的安全用例。目前,安全供应商唯一可用的这些系统调用的过滤机制是用户模式挂钩——而这种方法本质上脆弱的。在 Elastic,我们确定基于通过 ETW 收集的内核遥测的更强大的检测方法将比容易绕过的用户模式挂钩提供更大的安全益处。也就是说,内核 ETW 确实存在一些系统性问题,我们已将其记录在微软,并提出了缓解措施

实现

端点遥测是完整性和成本之间的谨慎平衡。供应商不希望不必要地增加您的 SIEM 存储成本,但他们也不希望您错过关键的入侵指标。为了减少这些新的 API 事件的事件量,我们会为每个事件创建一个指纹,并且仅在它是唯一的时候发出。此去重可确保对检测保真度的影响最小。

但是,这种方法在所有环境中都无法将 API 事件量减少到可管理的水平。我们引入的任何进一步的全局事件量减少都会成为我们客户的盲点。与其以这种方式潜在地损害检测可见性,我们确定这些高度冗长的事件将在主机上进行检测处理,但默认情况下不会流式传输到 SIEM。这种方法降低了我们大多数用户的存储成本,同时还使任何希望获得这些事件完整保真度的客户 SOC 能够选择通过端点策略中的高级选项进行流式传输,并实施针对其特定环境量身定制的过滤。

目前,我们传播对以下 API 的可见性 -

  • VirtualAlloc
  • VirtualProtect
  • MapViewOfFile
  • VirtualAllocEx
  • VirtualProtectEx
  • MapViewOfFile2
  • QueueUserAPC [由于 ETW 限制,调用堆栈并非总是可用]
  • SetThreadContext [计划在 8.12 中提供调用堆栈]
  • WriteProcessMemory
  • ReadProcessMemory (lsass) [计划在 8.12 中提供]

除了调用堆栈信息外,我们的 API 事件还通过几种行为进行了丰富

API 事件描述
跨进程观察到的活动发生在两个进程之间。
本机_api直接调用了未记录的本机 API,而不是支持的 Win32 API。
直接_系统调用系统调用指令源自本机 API 层之外。
代理_调用调用堆栈似乎显示了代理的 API 调用以掩盖真正的调用者。
敏感_api可执行的非映像内存意外地调用了敏感 API。
shellcode可疑的可执行非映像内存正在调用敏感 API。
映像已挂钩调用堆栈中的一个条目似乎已被挂钩。
映像_间接_调用调用堆栈中的一个条目之前调用了动态解析的函数。
映像_rop调用堆栈中的一个条目之前没有调用指令。
映像_rwx调用堆栈中的一个条目是可写的。
无支持_rwx调用堆栈中的一个条目是非映像的且可写的。
分配_shellcode非映像可执行内存区域可疑地分配了更多可执行内存。
执行_波动PAGE_EXECUTE 保护意外波动。
写入_波动可执行内存的 PAGE_WRITE 保护意外波动。
挂钩_api对小的可执行映像内存区域的内存保护进行了更改。
空洞_映像对大的可执行映像内存区域的内存保护进行了更改。
挂钩_无支持对小的可执行非映像内存的内存保护进行了更改。
空洞_无支持对大的可执行非映像内存的内存保护进行了更改。
受保护的_代码可执行内存意外地标记为 PAGE_GUARD。
隐藏的_代码可执行内存意外地标记为 PAGE_NOACCESS。
执行_shellcode非映像可执行内存区域以意外的方式执行。
硬件_断点_设置可能已设置硬件断点。

新规则

在 8.11 中,Elastic Defend 的行为保护带有许多针对各种流行的恶意软件技术的新规则,例如 shellcode 波动、无线程注入、直接系统调用、间接调用以及 AMSI 或 ETW 补丁。

这些规则包括

通过直接系统调用进行 Windows API 调用

识别常用滥用的 Windows API 调用,以执行代码注入,并且调用堆栈不是以 NTDLL 开头的

api where event.category == "intrusion_detection" and

    process.Ext.api.behaviors == "direct_syscall" and 

    process.Ext.api.name : ("VirtualAlloc*", "VirtualProtect*", 
                             "MapViewOfFile*", "WriteProcessMemory")

通过随机间接系统调用进行 VirtualProtect

识别对 VirtualProtect API 的调用,以及调用堆栈不是源自其等效的 NT 系统调用 NtProtectVirtualMemory

api where 

 process.Ext.api.name : "VirtualProtect*" and 

 not _arraysearch(process.thread.Ext.call_stack, $entry, $entry.symbol_info: ("*ntdll.dll!NtProtectVirtualMemory*", "*ntdll.dll!ZwProtectVirtualMemory*"))

来自无支持内存的映像空洞

api where process.Ext.api.behaviors == "hollow_image" and 

  process.Ext.api.name : "VirtualProtect*" and 

  process.Ext.api.summary : "*.dll*" and 

  process.Ext.api.parameters.size >= 10000 and process.executable != null and 

  process.thread.Ext.call_stack_summary : "*Unbacked*"

以下示例展示了对 wwanmm.dll 模块进行踩踏以将其内存内容替换为恶意负载的匹配项

AMSI 和 WLDP 内存补丁

识别尝试修改权限或写入 Microsoft 反恶意软件扫描接口或 Windows 锁定策略相关 DLL 的内存,以修改其行为来规避恶意内容检查。

api where

 (
  (process.Ext.api.name : "VirtualProtect*" and 
    process.Ext.api.parameters.protection : "*W*") or

  process.Ext.api.name : "WriteProcessMemory*"
  ) and

 process.Ext.api.summary : ("* amsi.dll*", "* mpoav.dll*", "* wldp.dll*")

通过 Windows 事件跟踪 (ETW) 补丁规避

识别尝试通过内存修改来修补 Microsoft Windows 事件跟踪的行为。

api where process.Ext.api.name :  "WriteProcessMemory*" and 

process.Ext.api.summary : ("*ntdll.dll!Etw*", "*ntdll.dll!NtTrace*") and 

not process.executable : ("?:\\Windows\\System32\\lsass.exe", "\\Device\\HarddiskVolume*\\Windows\\System32\\lsass.exe")

Windows 系统模块远程挂钩

识别尝试写入远程进程内存以修改 NTDLL 或 Kernelbase 模块的行为,这是隐蔽代码注入的准备步骤。

api where process.Ext.api.name : "WriteProcessMemory" and  

process.Ext.api.behaviors == "cross-process" and 

process.Ext.api.summary : ("*ntdll.dll*", "*kernelbase.dll*")

以下是匹配 ThreadLessInject 的示例,这是一种新的进程注入技术,涉及挂钩远程进程的导出函数以获得 shellcode 执行(避免创建远程线程)。

结论

在 Microsoft 为供应商提供安全相关的系统调用内核回调之前,威胁情报 ETW 仍将是 Windows 上内存威胁最可靠的可见性。在 Elastic,我们致力于将这种可见性转化为客户的实际应用,并可选择直接交到客户手中,没有任何隐藏的过滤假设。

请关注 Elastic Security 即将发布的版本中的调用堆栈功能。

资源

8.11 版本中发布的新规则