文章总结: 本文深入解析UEFIbootkit技术细节与实现原理,以RedLotus教学POC为例,阐述其在操作系统加载前获得控制权的终极持久化能力。文章详细介绍了UEFI启动规范、Windows启动链及三个核心挂钩点(imgarchstartbootapplication、oslfwpkernelsetupphase1、blimgallocateimagebuffer),演示了通过手动映射绕过驱动签名验证(DSE)的方法。同时对比了BlackLotus等真实样本,并讨论了从固件到内核的全栈检测与防御体系(SecureBoot、HVCI等)。可操作建议:加强启动链完整性验证,部署虚拟化安全保护。 综合评分: 95 文章分类: 漏洞分析,恶意软件,红队,安全工具,安全培训
UEFI-BootKit技术细节与实现原理
原创
pandazhengzheng pandazhengzheng
安全分析与研究
2026年8月26日 22:00 广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
目录
- 引言:为什么 UEFI BootKit 是”终极持久化”候选
- UEFI 启动规范深度解析
- Windows 启动链与 BootKit 挂钩点全景
- UEFI Runtime Driver 机制
- RedLotus 架构总览与执行流
- 阶段一:UEFI Runtime Driver 加载与初始化
- 阶段二:bootmgfw.efi 挂钩(ImgArchStartBootApplication)
- 阶段三:winload.efi 双挂钩(OslFwpKernelSetupPhase1 + BlImgAllocateImageBuffer)
- 阶段四:手动映射内核驱动(Manual Mapping)
- 阶段五:DriverEntry 挂钩与控制流转移
- 阶段六:.data 指针通信(xKdEnumerateDebuggingDevices)
- 阶段七:用户态-内核态通信(NtConvertBetweenAuxiliaryCounterAndPerformanceCounter)
- DSE(Driver Signature Enforcement)绕过原理
- 模式扫描与版本兼容性工程
- Rust 在底层安全研究中的应用
- 与真实样本对比:BlackLotus / ESPecter / CosmicStrand / MoonBounce
- 检测面:从固件到内核的全栈检测
- 防御体系:Secure Boot / HVCI / BitLocker / VBS / DRTM
- ATT&CK 映射
- 伦理、合规与研究价值
- 延伸阅读与工具链
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 的”终极”属性体现在两点:
- 可跨 UEFI/OS 边界:UEFI Runtime Driver 在
ExitBootServices后仍可被 OS 调用(Runtime Services),形成 UEFI 与 OS 间的持久通道; - 可篡改启动链任意环节:从 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 规范):
- SEC(Security):固件入口,处理复位向量,建立临时 RAM(Cache-as-RAM),验证 PEI 入口完整性;
- PEI(Pre-EFI Initialization):早期硬件初始化(CPU、内存控制器),PEIM(PEI Module)加载,内存初始化是关键;
- DXE(Driver Execution Environment):主要驱动加载阶段,UEFI 驱动按依赖顺序加载,硬件枚举完成;
- BDS(Boot Device Selection):启动设备选择,确定启动项,加载 Boot Manager;
- TSL(Transient System Load):OS Loader 加载阶段(如
bootmgfw.efi); - RT(Runtime):
ExitBootServices后,控制权移交 OS,Runtime Services 仍可用; - 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 之前完成:
- 内存分配:用
Boot Services.AllocatePages分配 OS 可见的内存(如 RedLotus 为redlotus.sys分配 RWX 内存); - 挂钩安装:在 OS Loader 中安装 trampoline hook;
- 数据准备:将 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技术细节与实现原理》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论