攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

admin 2025年5月26日09:28:11评论13 views字数 8059阅读26分51秒阅读模式
攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

《EDR Part 1: Intro & Security Analysis of EDR Drivers》是 InfoGuard Labs 针对 EDR 解决方案安全性的系列研究的第一篇,聚焦于 Windows 环境下 EDR 驱动程序的攻击面。文章从低权限用户的视角出发,通过逆向工程和调试技术,分析了多个主流 EDR 产品驱动程序的安全性,发现了一些潜在问题(如 Cortex XDR 的 ALPC 通信 DoS 漏洞和身份验证问题 CVE-2024-5905),但未找到严重的可利用漏洞。作者还讨论了 EDR 漏洞研究的现状与挑战,为后续深入分析奠定了基础。

阅读思路建议:  

  • 如果您对 EDR 软件的工作原理不熟悉,可先关注文章开头对 EDR 架构和驱动程序角色的介绍。  

  • 对安全研究感兴趣的读者,可以重点阅读作者使用的分析方法(如调试和 fuzzing 技术)以及如何绕过 EDR 自保护机制的部分。  

  • 如果您更关注具体漏洞和影响,可以快速浏览发现部分,并结合后续系列文章(如 Part 2 和 Part 3)了解更详细的结果。  

  • 文中提到的一些术语(如 ALPC、IOCTL)可能需要基础的操作系统知识,建议提前了解相关概念以便更好地理解分析过程。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

这篇博文是分析端点检测和响应 (EDR) 解决方案攻击面系列文章的一部分。第 1-3 部分已链接,第 3 部分将对前文子系列进行总结。

  • 第 一 部分(本文)概述了 EDR 软件的攻击面,并从低权限用户的角度描述了分析驱动程序的过程。

  • 第二部分描述了 EDR 驱动程序安全性分析的结果。在 Cortex XDR 代理的 Windows 驱动程序中发现了一个小的身份验证问题 (CVE-2024-5905)。此外,还发现了一个 PPL 绕过漏洞以及通过早期启动绕过检测漏洞。此外,还对 Sophos Intercept X Windows Mini-Filter 驱动程序的 Mini-Filter 通信端口进行了快照模糊测试。

  • 第三部分描述了一个影响大多数 Windows EDR 代理的 DoS 漏洞。该漏洞允许低权限用户利用代理处理对象管理器命名空间中现有对象的方式存在的问题,永久导致代理崩溃/停止。目前只有部分供应商获得了 CVE(CVE-2023-3280、CVE-2024-5909、CVE-2024-20671)。

  • 第四部分描述了 Microsoft Defender 扫描和仿真引擎的模糊测试过程mpengine.dll。通过使用 WTF 和 kAFL/NYX 的快照模糊测试,发现了多个越界读取和空引用漏洞。这些漏洞可在文件扫描后立即导致 Defender 主进程崩溃。这些漏洞似乎均无法利用来执行代码。

1. 简介

在当今的组织中,端点检测与响应 (EDR) 解决方案已成为网络安全领域的重要组成部分。尽管 EDR 解决方案已非常普及,但针对 EDR 应用程序本身的攻击的已发表研究仍然明显不足,即使这些应用程序是权限提升、企业网络入侵或路过式攻击的有力目标。这可能有几个原因:该领域的安全研究有限,为红队优势而未发表的研究,或缺乏卓有成效的研究成果。此外,只有少数供应商提供漏洞赏金计划,即使有,Windows 代理也不在范围之内(卡巴斯基除外)。

近年来,大多数关于 EDR 的安全研究都集中在绕过安全措施的技术上,例如 DLL 解钩。意识到这一缺陷,IG 实验室开展了一项研究项目,旨在分析 Windows 上广泛使用的 EDR 驱动程序的攻击面。然而,在开始这项工作之后和发表这篇文章之前,已经出现了一些直接攻击EDR的研究(1、2、3、4、5、…… )。

由于 EDR 的攻击面非常广泛,我们决定将调查范围限制在低权限用户可访问的驱动程序接口作为入口点。EDR

通常包含自我保护机制,甚至可以阻止本地管理员禁用或卸载产品。然而,虽然受安全功能的限制,但从本地管理员到 SYSTEM 再到 Windows 内核的权限转换并不代表绝对的安全边界。已知的方法可以停用或绕过 EDR,包括自带漏洞驱动程序 (BYOVD) 攻击、Windows Defender 应用程序控制 (WDAC)、WPF 过滤和其他技术。因此,本研究主要关注低权限用户,尽管来自本地管理员的攻击也可能很有价值。

此外,重点关注的是市场上最常用的 EDR。

然而,获取这些 EDR 解决方案用于研究却颇具挑战性。只有极少数供应商未经事先审查就提供试用产品,这进一步缩小了可供分析的 EDR 范围。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

典型的“试用”(如果没有合适的业务,您将永远不会获得试用)

尽管一些 EDR 驱动程序允许低权限用户访问某些功能,但未能检测到任何严重的安全问题。尽管如此,这篇博客文章描述了分析过程,包括一些研究路径,但这些路径并未提供任何发现来帮助其他安全研究人员。然而,一段时间后,一条路径指向了 PaloAlto Cortex 中的 ALPC 通信,而这并非最初的重点。这揭示了一个 DoS 漏洞,该漏洞将在第三部分中进行描述。

最初对以下产品进行了驱动因素分析检查:

  • Palo Alto Cortex XDR

  • Sophos Intercept X

  • Microsoft Defender for Endpoint

  • Cynet 360

  • Tanium(实际上不是 EDR,但功能和架构类似)

1.1 EDR 解决方案的攻击面

EDR 解决方案对于应用程序而言,攻击面相对较大。这些解决方案通常由代理本身和云服务上的多个组件组成,而一些供应商也提供本地服务器。EDR 旨在检测和响应端点级别的威胁,但它们本身也创建了新的攻击面,可能被恶意行为者利用。代理是一个复杂的部分,因此更容易受到漏洞攻击。相比之下,服务器端的前端(至少是用户可直接访问的部分,例如 Web 界面)的攻击面较小,通常也更容易被探索。即使是后端 Web API 也存在一些基本缺陷,例如缺少身份验证,如下图所示。一些产品还使用自定义协议进行代理与云之间的通信,这也值得关注。此外,某些产品还在代理之间实现了 P2P 通信(例如 Tanium),从攻击者的角度来看,这也很值得关注。

这些博客文章仅关注代理方面。

代理通常由用户空间和内核空间(驱动程序)组件组成:

  • 过滤驱动程序

  • 网络驱动程序

  • 软件驱动程序

  • 用户空间应用程序

这些组件主要使用以下协议和方法相互通信:

  • 内核到内核:

  • 导出函数

  • IOCTL

  • 用户到内核:

  • IOCTL

  • 过滤连接端口

  • 专门用于微过滤驱动

  • 底层也使用 IOCTL

  • ALPC

  • 用户对用户

  • ALPC

  • 命名管道

  • 文件

  • 注册表

  • 更多的…

以下列表概述了这些组件及其通信中的潜在漏洞。请注意,此列表并不详尽,并且不包含所有服务器端攻击面:

  • 文件扫描和仿真中的内存损坏(野外 0day CVE-2021-1647)

  • 删除任意文件(SymLink-Vulns)

  • 过去存在大量漏洞:删除文件“擦除器”(50% 的测试 EDR 存在漏洞)

  • 用户模式 IPC(进程间通信):授权问题或内存损坏

  • 用户到驾驶员:授权问题

  • 经典驱动程序漏洞:

  • WDM:Ilja van Sprundel:Windows 驱动程序攻击面

  • KMDF:对 KMDF 驱动程序进行逆向工程和漏洞挖掘 - Enrique Nissim 出席 44CON 2018

  • Mini-Filter:Google Project Zero:寻找 Windows Mini-Filter 驱动程序中的错误

  • 服务器到代理

  • 缺少服务器身份验证

  • 解析服务器响应中的错误

  • 经典 Windows 应用程序漏洞(DLL 劫持、文件权限等)

  • 模拟/沙盒逃逸

  • 其他逻辑错误

本文重点关注用户到驱动程序的授权问题,以及某种程度上的经典驱动程序漏洞。第三部分将讨论用户模式进程间通信 (IPC)。

影响

客户端潜在漏洞的主要影响是本地权限提升或隐藏恶意软件的执行。另一种可能性是伪造发送到后端的代理数据。某些漏洞(例如扫描引擎中的漏洞)也可能导致远程代码执行。此外,代理被攻陷还会扩大后端的攻击面,因为攻击者可以滥用代理的已验证会话。

在基于 P2P 的通信中,严重的设计缺陷可能会导致其他代理被攻陷。

2. 低权限用户的驱动程序攻击

本节概述了如何对 EDR 驱动程序进行安全分析。它主要侧重于识别可能构成低权限用户攻击面的暴露驱动程序功能。本节不会深入探讨驱动程序相关漏洞的具体细节及其利用方式。

对于测试环境,我们建议使用附加了 WinDBG 内核调试器的虚拟机。最简单的设置方法是使用 KDNET(请参阅以下文档)。

2.1 加载了哪些驱动程序?

查看已加载驱动程序的一种方法是使用DriverView,该方法还可以借助从 Microsoft 过滤驱动程序的功能。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

安装了 Cortex 的 DriverView

2.2 每个驱动程序向用户空间暴露什么接口

有两种方法可以检查这一点:静态分析和动态分析。我们建议结合使用这两种方法来捕获所有情况。例如,EDR 驱动程序在启动期间可能只初始化一个设备对象,但在 EDR 执行过程中可能会创建更多设备对象。

Windows 驱动模型 (WDM) 或内核模式驱动程序框架 (KMDF) 驱动程序可以公开设备接口。该接口可以从用户空间打开,以便与驱动程序进行交互。

微过滤器驱动程序可以公开一个 FilterCommunicationPort,可以从用户模式使用它来与驱动程序交互。

2.2.1 静态分析

要建立通信接口,驱动程序必须调用特定的 Windows API。这些调用可以使用 IDA 等逆向工程软件进行静态分析。Microsoft 文档中列出的常用函数如下:

  • WDM设备驱动程序:

NTSTATUS IoCreateDevice(  [in] PDRIVER_OBJECT DriverObject,  [in] ULONG DeviceExtensionSize,  [in, optional] PUNICODE_STRING DeviceName,  [in] DEVICE_TYPE DeviceType,  [in] ULONG DeviceCharacteristics,  [in] BOOLEAN Exclusive,  [out] PDEVICE_OBJECT *DeviceObject);

或者,可以使用应用默认 SDDL 字符串的 IoCreateDeviceSecure。

  • KMDF 设备驱动程序:

NTSTATUS WdfDeviceCreateDeviceInterface(  [in] WDFDEVICE Device,  [inconst GUID *InterfaceClassGUID,  [in, optional] PCUNICODE_STRING ReferenceString);
  • 微型过滤器驱动程序:

NTSTATUS FLTAPI FltCreateCommunicationPort([in]           PFLT_FILTER Filter,[out]          PFLT_PORT *ServerPort,[in]           POBJECT_ATTRIBUTES ObjectAttributes,[in, optional] PVOID ServerPortCookie,[in]           PFLT_CONNECT_NOTIFY ConnectNotifyCallback,[in]           PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback,[in, optional] PFLT_MESSAGE_NOTIFY MessageNotifyCallback,[in]           LONG MaxConnections);

2.2.2 动态分析

可以使用 Sysinternals 的 WinObj(尽管名称并不总是很明显)或通过在内核调试器中设置断点来识别已注册的设备和端口名称。

设备驱动程序:它们在 WinObj 的“GLOBAL??”下以指向设备对象的符号链接形式列出。这使得\.NAME当其他应用程序尝试与驱动程序交互时,可以通过该设备访问设备。另一个选择是使用 OSR 已停用的工具 DeviceTree,该工具以层次结构显示每个驱动程序的设备以及其他信息。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

WinObj 与 Cortex 设备

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

带有 Cortex 设备的 DeviceTree

微过滤驱动:它们在 WinObj 文件中被列为“FilterConnectionPort”

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

WinObj 中的 FilterConnectionPorts(Cortex)

2.3 各个接口的访问权限是什么?

此步骤更容易动态地完成。

设备驱动程序:据我们所知,目前没有现代工具可以查看设备接口的正确访问权限。请尝试获取 OSR DeviceTree 的副本,它可以直接显示 ACL 和其他标志。另一种方法是使用内核调试器。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

迷你过滤驱动程序:测试某个用户是否可以访问 FilterConnectionPort 的一种方法是使用James Forshaw 的NtObjectManager工具https://www.powershellgallery.com/packages/NtObjectManager/1.1.29。

Get-FilterConnectionPort -Path "CyvrFsfd"Exception"(0x80070005) - Access is denied."

要检索安全描述符,请使用 WinDbg 作为内核调试器:

0: kd> !object CyvrFsfdObject: ffffc2861e32f550 Type: (ffffc2861bc7b220) FilterConnectionPortObjectHeader: ffffc2861e32f520 (new version)HandleCount1PointerCount6    Directory Object: ffffd9099503e9f0 Name: CyvrFsfd0: kd> dx (((nt!_OBJECT_HEADER*)0xffffc2861e32f520)->SecurityDescriptor & ~0xa)(((nt!_OBJECT_HEADER*)0xffffc2861e32f520)->SecurityDescriptor & ~0xa) :0xffffd909950257a00: kd> !sd 0xffffd909950257a0 1->Revision0x1->Sbz1 0x0->Control 0x8004            SE_DACL_PRESENT            SE_SELF_RELATIVE->Owner : S-1-5-32-544 (Alias: BUILTINAdministrators)->Group : S-1-5-18 (Well Known Group: NT AUTHORITYSYSTEM)->Dacl :->Dacl : ->AclRevision0x2->Dacl : ->Sbz1 0x0->Dacl : ->AclSize 0x1c->Dacl : ->AceCount 0x1->Dacl : ->Sbz2 0x0->Dacl : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE->Dacl : ->Ace[0]: ->AceFlags0x0->Dacl : ->Ace[0]: ->AceSize0x14->Dacl : ->Ace[0]: ->Mask 0x001f0001->Dacl : ->Ace[0]: ->SID: S-1-5-18 (Well Known Group: NT AUTHORITYSYSTEM)->Sacl : is NULL

此端口仅允许从NT AUTHORITYSYSTEM访问。

2.4 如果接口可以访问,您可以做什么?

首先,如果 Windows ACL 允许访问设备接口或 FilterConnectionPort,并不意味着您实际上可以访问这些接口提供的所有功能。驱动程序本身可以执行任意访问检查,例如验证调用进程的安全令牌或检查进程的文件路径。

本主题通常需要对驱动程序中一些值得关注的函数进行逆向工程,并在驱动程序中缺少函数名称的情况下弄清楚它们的作用。在下文中,我们将提供一些入门建议。

2.4.1 设备驱动程序

与这些设备交互最相关的方法是使用主功能码 0xe (14) 的设备输入/输出控制 (IOCTL),它允许两个伙伴之间进行通信,同时提供双向数据交换的通道。虽然读取 ( IRP_MJ_READ ) 和写入 ( IRP_MJ_WRITE ) 操作也可能相关,但此上下文中的主要功能位于IRP_MJ_DEVICE_CONTROL中。

这些调度函数可以通过以下函数从用户模式触发:

  • 创建文件() => IRP_MJ_CREATE_

  • 读取文件() => IRP_MJ_READ

  • 设备IoControl() => IRP_MJ_CONTROL

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

资料来源:Enrique Nissim,IOActive

下一步需要进行逆向工程,以分析这些调度函数的功能。这些功能位于DRIVER_DISPATCH驱动程序初始化期间注册的回调函数中。以下 IDA 屏幕截图展示了Cortex 的tedrdrv.sys驱动程序。在此示例中,大多数回调函数都相同。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

Cortex 中的驱动程序调度函数

该函数sub_1233A0区分不同的MajorFunction代码。如果调用0xe(DEVICE_CONTROL),则会调用真正的IO控制调度函数,如下所示:

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

Cortex中的设备IO控制调度函数

不同的情况对应于 I/O 控制码 (IOCTL)。这段代码揭示了一个有趣的现象:调用者的进程 ID 被检索,然后进行比较或传递给其他函数。这表明需要进一步分析授权机制。这是下一章的内容。

2.4.2 FilterConnectionPorts:

过滤器连接端口类似于I/O控制码,在注册过滤器连接端口时,可以在FltCreateCommunicationPort函数中指定回调函数,用于处理连接、断开连接以及消息。

攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

Cortex cyvrfsfd.sys 中的 FltCreateCommunicationPort()

实现MessageNotifyCallback与上面的IO控制调度函数类似的不同情况。

2.5 为什么某些 EDR 驱动程序接口可供低权限用户访问?

验证驱动程序接口的访问控制列表 (ACL) 是渗透测试中的一项基本检查,理想情况下,所有供应商都应在某个阶段进行此项检查。在某些情况下,ACL 很可能被故意设置为可广泛访问。Windows API 通常提供限制特定设备对象权限级别的功能。例如,使用IoCreateDeviceSecure显式安全标识符作为参数,或者IoCreateDevice在 INF 文件中使用并指定安全标识符。

那么,为什么这些 ACL 没有更严格呢?在驱动程序的内核调试过程中,我们观察到 IOCTL 是由各种用户空间进程调用的。EDR 通常采用一种架构,其中来自 EDR 代理的注入 DLL 代表注入的进程通过 IOCTL 直接与驱动程序通信。由于这些注入的进程通常权限较低(例如word.exe),因此驱动程序无法仅根据进程的权限级别强制执行安全限制。我们从未实现过 EDR,也没有足够的细节来判断这一点,但我们认为这不是最安全的方法。事实上,一些 EDR 解决方案并未采用这种做法。

按照前面几节中描述的过程,有针对驱动程序接口的开放 ACL 的候选者:

  • PaloAlto Cortex XDR

  • Sophos Intercept X

结果在第 2 部分描述

攻击 EDR 第 二 部分:驱动程序分析结果https://labs.infoguard.ch/posts/edr_part2_driver_analysis_results/攻击 EDR 第三部分:一个 Bug 阻止所有攻击https://labs.infoguard.ch/posts/edr_part3_one_bug_to_stop_them_all/攻击 EDR 第 4 部分:模糊测试 Defender 的扫描和仿真引擎 (mpengine.dll)
https://labs.infoguard.ch/posts/attacking_edr_part4_fuzzing_defender_scanning_and_emulation_engine/

原文始发于微信公众号(Ots安全):攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月26日09:28:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   攻击 EDR 第一部分:EDR 驱动程序简介及安全性分析https://cn-sec.com/archives/4096509.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息