Joe DesimoneSamir BousseadenGabriel Landau

提升标准:使用内核调用堆栈检测内存威胁

我们的目标是超越对手的创新,并保持对尖端攻击者技术的防护。在 Elastic Security 8.8 中,我们添加了基于新内核调用堆栈的检测,这使我们能够更有效地防御内存中的威胁。

阅读 7 分钟安全研究
Upping the Ante: Detecting In-Memory Threats with Kernel Call Stacks

简介

Elastic Security for Endpoint 源于 Endgame,长期以来一直引领内存威胁检测行业。我们率先开发并获得多项检测技术专利,例如内核线程启动预防、调用堆栈异常搜索模块踩踏发现。但是,攻击者不断创新并逃避检测。例如,为了应对我们改进的内存签名保护,攻击者开发了一系列新的基于休眠的规避方法。我们的目标是超越对手的创新,并保持对尖端攻击者技术的防护。在 Elastic Security 8.8 中,我们添加了基于新内核调用堆栈的检测,这使我们能够更有效地防御内存中的威胁。

在开始之前,重要的是要知道什么是调用堆栈以及为什么它们对检测工程有价值。 调用堆栈是为实现程序行为而执行的函数的有序序列。它详细显示了哪些函数(及其关联的模块)被执行以导致诸如创建新文件或进程之类的行为。了解行为的调用堆栈,我们可以构建具有有关程序正在做什么以及如何做的详细上下文信息的检测。

深度可见性

新的基于调用堆栈的检测功能利用我们现有的对最常见系统行为(进程、文件、注册表、库等)的深度内联内核可见性。对于每个事件,我们都会捕获活动的调用堆栈。稍后,会使用模块信息、符号和可疑活动证据对其进行丰富。这为我们提供了类似 procmon 的实时可见性,从而为内存中的技术提供高级防御。

进程创建调用堆栈字段

文件、注册表和库调用堆栈字段

新规则

除非我们可以将其与经过调整的高置信度防御配对,否则额外的可见性不会提高标准。在 8.8 中,行为保护开箱即用,带有 30 多个规则,为我们提供了针对尖端攻击者技术的高效防御,例如: - 直接系统调用 - 基于回调的规避 - 模块踩踏 - 从无支持区域加载库 - 从无支持区域创建的进程 - 更多

调用堆栈是一个强大的数据源,可用于提高对非基于内存的威胁的防护。例如,以下 EQL 查询查找来自 Office 进程的子进程或可执行文件扩展名的创建,其中调用堆栈包含 VBE7.dll(宏启用文档存在的强烈信号)。与仅使用没有调用堆栈信息的进程或文件创建事件相比,这提高了规则逻辑的信号和覆盖范围,同时减少了必要的调整工作。

以下是一些匹配示例,其中启用宏的恶意 Excel 和 Word 文档生成一个子进程,其中调用堆栈引用 vbe7.dll

在这里,我们可以看到通过 Excel 打开的恶意 XLL 文件生成一个合法的 browser_broker.exe 以注入其中。父调用堆栈指示进程创建调用来自 [xlAutoOpen](https://learn.microsoft.com/en-us/office/client-developer/excel/xlautoopen) 函数

相同的丰富功能在库加载和注册表事件中也很有价值。以下是从可疑调用堆栈(具有 RWX 权限的无支持内存区域)加载 Microsoft Common Language Runtime CLR.DLL 模块的示例,使用了 Sliver execute-assembly 命令来加载外部 .NET 程序集

library where dll.name : "clr.dll" and
process.thread.Ext.call_stack_summary : "*mscoreei.dll|Unbacked*"

搜寻某些注册表项(例如用于持久性的 Run 项)的可疑修改往往很嘈杂,并且在合法软件中很常见,但是,如果我们将调用堆栈信号添加到逻辑中,则可疑级别会显着提高

registry where 
 registry.path : "H*\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\*"
// the creating thread's stack contains frames pointing outside any known executable image
 and process.thread.Ext.call_stack_contains_unbacked == true

另一个“有趣”的示例是使用调用堆栈信息来检测通常具有非常特定功能的核心系统进程的恶意实例。通过对它们的正常调用堆栈进行签名,我们可以轻松识别异常值。例如,WerFault.exewermgr.exe 是最受伪装吸引的目标

匹配示例

除了使用调用堆栈数据来查找可疑行为外,在以更精细的方式排除行为检测中的误报时,它也很有用。 这也有助于减少规避机会。

一个很好的例子是查找不寻常的 Microsoft Office 子进程的检测规则。 此规则用于排除 splwow64.exe,它可以通过打印活动合法生成。 通过 process.executable 排除它会通过进程镂空或注入创建一个规避机会,这会使进程树看起来正常。我们现在可以通过要求此类进程创建来自 winspool.drv!OpenPrinter 来缓解此规避

process where event.action == "start" and
  process.parent.name : ("WINWORD.EXE", "EXCEL.EXE", "POWERPNT.EXE", "MSACCESS.EXE", "mspub.exe", "fltldr.exe", "visio.exe") and
// excluding splwow64.exe only if it’s parent callstack is coming from winspool.drv module  
not (process.executable : "?:\\Windows\\splwow64.exe" and``_arraysearch(process.parent.thread.Ext.call_stack, $entry, $entry.symbol_info: ("?:\\Windows\\System32\\winspool.drv!OpenPrinter*", "?:\\Windows\\SysWOW64\\winspool.drv!OpenPrinter*")))

为了减少事件量,在端点上收集调用堆栈信息并对其进行处理以进行检测,但并非总是以事件形式流式传输。要在流式传输的事件中始终包含调用堆栈,可以在端点策略中使用高级选项

C2 覆盖率

Elastic Endpoint 可以快速检测当今活跃的一些顶级 C2 框架。请参见下面的屏幕截图,其中检测到了 Nighthawk、BruteRatel、CobaltStrike 以及 ATP41 的 StealthVector

结论

尽管此功能使我们在当今最先进的内存攻击技术方面取得了领先,但毫无疑问,攻击者将开发新的创新来试图逃避检测。这就是为什么我们已经在努力交付下一组领先的内存检测技术。请继续关注!

资源

8.8 版本发布的规则