简介
我们很高兴看到我们在 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 版本中发布的新规则
- 通过内存补丁绕过 AMSI 或 WLDP
- 通过合成帧进行调用堆栈欺骗
- 通过 Windows 事件跟踪 (ETW) 补丁规避
- 修改未签名 DLL 的内存保护
- 来自被踩踏模块的网络活动
- 通过无效代码签名进行潜在规避
- 通过异常处理程序进行潜在注入
- 通过异步过程调用进行潜在注入
- 潜在的线程调用堆栈欺骗
- 通过映射进行远程进程注入
- 可疑进程对远程进程的操纵
- 远程线程上下文操作
- 控制面板小程序的可疑活动
- 来自脚本解释器的可疑 API 调用
- 来自未签名服务 DLL 的可疑 API
- 可疑调用堆栈尾随字节
- 可疑的可执行堆分配
- 可疑的可执行内存权限修改
- 可疑的内存保护波动
- 可疑的对远程进程的内存写入
- 可疑的 NTDLL 内存写入
- 可疑的空终止调用堆栈
- 可疑的 Kernel32 内存保护
- 可疑的远程内存分配
- 来自虚拟磁盘或 USB 的可疑 Windows API 调用
- 通过直接系统调用进行可疑的 Windows API 调用
- 通过 ROP 小工具进行可疑的 Windows API 调用
- 可疑的 Windows API 代理调用
- 来自未签名 DLL 的 VirtualProtect API 调用
- 通过 NtTestAlert 进行 VirtualProtect 调用
- 通过间接随机系统调用进行 VirtualProtect
- 通过 ROP 小工具进行 VirtualProtect
- 通过回调函数进行 Windows API 调用
- Windows 系统模块远程挂钩