UEFI-BootKit技术细节与实现原理

admin 2026-08-27 05:27:25 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入解析UEFIbootkit技术细节与实现原理,以RedLotus教学POC为例,阐述其在操作系统加载前获得控制权的终极持久化能力。文章详细介绍了UEFI启动规范、Windows启动链及三个核心挂钩点(imgarchstartbootapplication、oslfwpkernelsetupphase1、blimgallocateimagebuffer),演示了通过手动映射绕过驱动签名验证(DSE)的方法。同时对比了BlackLotus等真实样本,并讨论了从固件到内核的全栈检测与防御体系(SecureBoot、HVCI等)。可操作建议:加强启动链完整性验证,部署虚拟化安全保护。 综合评分: 95 文章分类: 漏洞分析,恶意软件,红队,安全工具,安全培训


UEFI-BootKit技术细节与实现原理

原创

pandazhengzheng pandazhengzheng

安全分析与研究

2026年8月26日 22:00 广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

目录

  1. 引言:为什么 UEFI BootKit 是”终极持久化”候选
  2. UEFI 启动规范深度解析
  3. Windows 启动链与 BootKit 挂钩点全景
  4. UEFI Runtime Driver 机制
  5. RedLotus 架构总览与执行流
  6. 阶段一:UEFI Runtime Driver 加载与初始化
  7. 阶段二:bootmgfw.efi 挂钩(ImgArchStartBootApplication)
  8. 阶段三:winload.efi 双挂钩(OslFwpKernelSetupPhase1 + BlImgAllocateImageBuffer)
  9. 阶段四:手动映射内核驱动(Manual Mapping)
  10. 阶段五:DriverEntry 挂钩与控制流转移
  11. 阶段六:.data 指针通信(xKdEnumerateDebuggingDevices)
  12. 阶段七:用户态-内核态通信(NtConvertBetweenAuxiliaryCounterAndPerformanceCounter)
  13. DSE(Driver Signature Enforcement)绕过原理
  14. 模式扫描与版本兼容性工程
  15. Rust 在底层安全研究中的应用
  16. 与真实样本对比:BlackLotus / ESPecter / CosmicStrand / MoonBounce
  17. 检测面:从固件到内核的全栈检测
  18. 防御体系:Secure Boot / HVCI / BitLocker / VBS / DRTM
  19. ATT&CK 映射
  20. 伦理、合规与研究价值
  21. 延伸阅读与工具链

1. 引言:为什么 UEFI BootKit 是”终极持久化”候选

1.1 BootKit 的本质定义

BootKit(Boot Kit)是 Bootkit 家族的统称,指在操作系统内核加载之前获得控制权的恶意代码。与传统的 RootKit(在 OS 运行后植入内核)相比,BootKit 的核心优势在于先于安全机制存在

  • 先于内核:在 ntoskrnl.exe 加载前执行,可篡改内核镜像、关闭内核保护标志;
  • 先于驱动签名验证:在 DSE(Driver Signature Enforcement)初始化前加载任意驱动;
  • 先于 PatchGuard:在 KPP(Kernel Patch Protection)激活前修改内核结构;
  • 先于 EDR:在 EDR Sensor 驱动加载前完成注入,EDR 启动时看到的已是”被污染”的内核;
  • 先于 VBS/HVCI:在虚拟化安全启动前获得控制,可尝试禁用 VBS 相关标志。

1.2 UEFI 时代的 BootKit

BIOS 时代的 BootKit(如 TDL4、Rovnix、Carberp)通过 MBR/VBR 修改实现。UEFI 时代带来了根本性变化:

| 维度 | BIOS/MBR BootKit | UEFI BootKit | | — | — | — | | 执行环境 | 16 位实模式 → 32 位保护模式 | 64 位长模式,C 语言调用约定 | | 代码容量 | 受限于 MBR(512B)/VBR | 可为完整 PE/EFI 驱动(数十 KB) | | 持久化位置 | MBR/VBR/磁盘尾部 | SPI Flash DXE/RT 阶段、ESP 分区、运行时变量 | | 安全机制 | 无 | Secure Boot、Measured Boot、PCR 度量 | | 检测难度 | 低(MBR 哈希易比对) | 高(固件镜像大、结构复杂、厂商差异) | | 生存期 | OS 加载后即失去控制(需 Hook) | 可作为 Runtime Driver 跨 UEFI/OS 边界 |

UEFI BootKit 的”终极”属性体现在两点:

  1. 可跨 UEFI/OS 边界:UEFI Runtime Driver 在 ExitBootServices 后仍可被 OS 调用(Runtime Services),形成 UEFI 与 OS 间的持久通道;
  2. 可篡改启动链任意环节:从 DXE 驱动、Boot Manager、OS Loader 到内核镜像,每一环都是潜在挂钩点。

1.3 RedLotus 的研究定位

RedLotus(代号)是 memN0ps 于 2023 年公开的 Windows UEFI BootKit PoC,用 Rust 编写。其研究定位:

  • 教学导向:不追求隐蔽、不追求持久化、不绕过 Secure Boot;
  • DSE 绕过演示:通过手动映射加载未签名内核驱动,绕过驱动签名验证;
  • Rust 实践:验证 Rust 在 UEFI/底层驱动开发中的可行性;
  • 技术传承:综合 btbd/umap、realoriginal/bootlicker、ESET 对 BlackLotus 的分析、ajkhoury/UEFI-Bootkit、Mattiwatti/EfiGuard 等前人工作。

RedLotus 不攻击 Secure Boot(需 Secure Boot 关闭或 BYOVB),不绕过 HVCI/BitLocker,其技术谱系更接近游戏外挂社区的”手动映射加载器”(如 umap),而非 BlackLotus 这类完整 APT 武器。但其在结构、时序、挂钩链设计上与 BlackLotus 高度相似,是理解 UEFI BootKit 原理的理想教学样本。


2. UEFI 启动规范深度解析

2.1 UEFI 规范概览

UEFI(Unified Extensible Firmware Interface)是 Intel 于 1998 年发起的 EFI 规范的现代化版本,由 UEFI Forum 维护。当前最新规范为 2.10。UEFI 定义了 OS 与固件之间的接口,取代传统 BIOS。

UEFI 的核心组成:

  • Boot Services:启动阶段服务(内存分配、协议定位、驱动加载),在 ExitBootServices 后失效;
  • Runtime Services:运行时服务(变量读写、时间、Capsule 更新),在 OS 运行期间仍可调用;
  • Protocol:UEFI 的”接口”概念,类似 COM,通过 GUID 标识;
  • Handle:表示设备/驱动/协议实例的对象;
  • Event/Notification:事件驱动的回调机制。

2.2 UEFI 启动阶段(SEC → PEI → DXE → BDS → TSL → RT)

UEFI 启动分为七个阶段(PI 规范):

  1. SEC(Security):固件入口,处理复位向量,建立临时 RAM(Cache-as-RAM),验证 PEI 入口完整性;
  2. PEI(Pre-EFI Initialization):早期硬件初始化(CPU、内存控制器),PEIM(PEI Module)加载,内存初始化是关键;
  3. DXE(Driver Execution Environment):主要驱动加载阶段,UEFI 驱动按依赖顺序加载,硬件枚举完成;
  4. BDS(Boot Device Selection):启动设备选择,确定启动项,加载 Boot Manager;
  5. TSL(Transient System Load):OS Loader 加载阶段(如 bootmgfw.efi);
  6. RT(Runtime)ExitBootServices 后,控制权移交 OS,Runtime Services 仍可用;
  7. AL(After Life):系统关机/重启/异常处理。

BootKit 的植入窗口主要在 DXE/BDS/TSL 阶段:

  • DXE 阶段植入:将恶意 DXE 驱动植入固件 SPI Flash(如 LoJax),最隐蔽但需 SPI 写入;
  • BDS 阶段植入:修改 Boot Manager 或启动项(如 ESPecter 利用 ESP 分区);
  • TSL 阶段植入:挂钩 OS Loader(如 RedLotus 挂钩 bootmgfw.efi/winload.efi)。

2.3 ExitBootServices 的关键意义

ExitBootServices 是 UEFI 启动的分水岭:

  • 之前:Boot Services 可用,可分配内存、加载驱动、安装协议;
  • 之后:Boot Services 失效,仅 Runtime Services 可用,OS 完全接管内存映射。

BootKit 必须在 ExitBootServices 之前完成:

  1. 内存分配:用 Boot Services.AllocatePages 分配 OS 可见的内存(如 RedLotus 为 redlotus.sys 分配 RWX 内存);
  2. 挂钩安装:在 OS Loader 中安装 trampoline hook;
  3. 数据准备:将 payload 拷贝到分配的内存。

ExitBootServices 之后,BootKit 通过已安装的挂钩和 Runtime Services 继续影响 OS。

2.4 UEFI 镜像格式

UEFI 驱动/应用采用 PE/COFF 格式(与 Windows PE 类似但有差异):

  • 子系统IMAGE_SUBSYSTEM_EFI_APPLICATION(10)、IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER(11)、IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER(12);
  • 入口点efi_main(ImageHandle, SystemTable)
  • 调用约定:x64 下为 Microsoft x64 ABI(不同于 Linux UEFI 的 System V ABI,需注意)。

UEFI_RUNTIME_DRIVER(子系统 12)是 RedLotus 的关键选择:它在 DXE 阶段加载,但部分代码可在 RT 阶段继续执行(运行时字段标记为 RT),这使其能跨 ExitBootServices 边界存活。

2.5 UEFI 变量与持久化

UEFI 变量(Runtime Service GetVariable/SetVariable)是跨 UEFI/OS 的持久存储:

  • **BootOrder/Boot####**:启动项配置,篡改可改变启动顺序或注入恶意启动项;
  • PlatformLang/Setup:厂商自定义变量,部分可写入 NVRAM;
  • 自定义变量:BootKit 可创建自定义变量存储配置(如 BlackLotus 用自定义变量持久化)。

UEFI 变量存储在 NVRAM(SPI Flash 的一部分),重刷固件才会清除。


3. Windows 启动链与 BootKit 挂钩点全景

3.1 现代 Windows UEFI 启动链

Windows 8+ 在 UEFI 系统上的启动链:

UEFI Firmware
    ↓ (DXE/BDS)
bootmgfw.efi (Windows Boot Manager)
    ↓
winload.efi (Windows OS Loader)
    ↓
ntoskrnl.exe (Windows Kernel)
    ↓
hal.dll, boot drivers, SYSTEM hive
    ↓
Session Manager (smss.exe) → csrss.exe → wininit.exe → services.exe → logon

各组件职责:

  • bootmgfw.efi:Windows Boot Manager,读取 BCD(Boot Configuration Data),显示启动菜单,加载并执行 winload.efi
  • winload.efi:Windows OS Loader,加载 ntoskrnl.exe 和 HAL、SYSTEM hive、boot-start 驱动,应用 BCD 配置,最终跳转到内核入口;
  • ntoskrnl.exe:Windows 内核,初始化执行体、内核、HAL、内存管理、对象管理器、IO 管理器,加载驱动。

3.2 关键挂钩点(Hook Points)

RedLotus 选择的三个核心挂钩点,时序如下:

| 挂钩点 | 所在组件 | 执行时机 | 作用 | | — | — | — | — | | ImgArchStartBootApplication | bootmgfw.efi | winload.efi 加载后、执行前 | 拦截 winload.efi,安装后续挂钩 | | OslFwpKernelSetupPhase1 | winload.efi | ntoskrnl.exe 加载后、转移控制前 | 篡改内核镜像/驱动,手动映射 payload | | BlImgAllocateImageBuffer | winload.efi | 驱动镜像分配时 | 劫持内存分配,为 payload 预留 RWX 内存 |

可选的其他挂钩点(RedLotus 未用,但 BlackLotus 等使用):

  • ExitBootServices:UEFI Boot Services 终止前最后一刻,可做最终内存分配;
  • OslArchTransferToKernel:winload.efi 跳转到内核的最后一刻,可修改 Loader Block;
  • bootmgfw.efi 入口点:直接 patch bootmgfw.efi 镜像(RedLotus 明确不支持,因易被检测);
  • ntoskrnl.exe 入口点:在内核入口安装挂钩,但需先获得内核镜像基址。

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全分析与研究 pandazhengzheng pandazhengzheng《UEFI-BootKit技术细节与实现原理》

评论:0   参与:  0