简介
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.exe
和 wermgr.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 版本发布的规则
- 从启用宏的 Office 文档执行
- 通过 Windows 脚本执行可疑宏
- 由启用宏的文档丢弃的可疑文件
- 通过启用宏的文档修改快捷方式文件
- 从启用宏的文档加载的 DLL
- 通过 Microsoft Office 加载项创建进程
- 来自可疑内存的注册表或文件修改
- 从可疑内存访问浏览器凭据
- 潜在的 NTDLL 内存取消挂钩
- 从可疑内存加载的 Microsoft 公共语言运行时
- 通过未签名模块加载的公共语言运行时
- 潜在的伪装成 Windows 错误管理器
- 通过 LdrLoadDLL 加载可疑映像
- 通过回调函数加载的库
- 从修改后的 NTDLL 创建进程
- 通过复制的 Microsoft 可执行文件进行 DLL 侧加载
- 通过控制台窗口类进行潜在的注入
- 由受信任进程加载的可疑未签名 DLL
- 通过远程线程启动的进程
- 通过 DotNET 调试进行潜在的注入
- 通过 ShellCode 创建潜在的进程
- 来自复制库的模块践踏
- 从被践踏的模块创建进程
- 从无支持内存加载的并行 NTDLL
- 通过直接系统调用进行的潜在操作
- 通过直接系统调用创建潜在的进程
- 通过无支持代码从存档或可移动媒体启动的进程
- 从可疑无支持内存加载的网络模块
- Rundll32 或 Regsvr32 从无支持内存加载 DLL
- 从无支持内存进行的 Windows 控制台执行
- 通过未签名父进程从无支持内存创建的进程