0xbekoo/Silence-of-Naunet

GitHub: 0xbekoo/Silence-of-Naunet

一个研究项目,通过Hook UEFI SetVariable服务并配合Windows内核驱动,演示如何将数据隐蔽存储在NVRAM内存中而不落地持久化。

Stars: 1 | Forks: 0

# Naunet 的沉默 ## 女神 Naunet 在古埃及神话中,**Naunet** 是原始水域的化身——万物诞生的无限、无形的深渊。她是**努恩**(Nun)的女性对应神,努恩是代表创造之初混沌水域的神,他们共同构成了埃及宇宙观的基础。 ## 概述 Silence of Naunet 是一个研究项目,旨在演示通过拦截 NVRAM 变量来**挂钩 UEFI Runtime Services**。该项目的名字灵感来源于原始水域的女神,反映了该项目的目的:深入系统 firmware 静默的深处,并在数据流经混沌的 UEFI runtime services 水域时将其拦截。 该项目包含两个组件: 1. **SilenceOfNaunet** - 一个挂钩 `SetVariable()` UEFI Runtime Service 的 EFI 驱动程序 2. **Rootkit** - 一个 Windows 内核驱动程序,用于将测试 payload 数据写入 UEFI NVRAM ### 本项目演示的内容 - 如何通过挂钩 UEFI Runtime Services Table 中的 `SetVariable()` 服务来拦截 firmware 变量写入 - 当写入特定的 NVRAM 变量(由自定义 GUID 和名称对定义)时,被挂钩的函数会捕获 payload 数据并将其存储在隐藏的内存缓冲区中 - 被拦截的数据永远不会到达持久化存储——它保持隐藏在 runtime 内存中,就像沉没在 Naunet 深渊中的宝藏一样 ## 工作原理 ### SilenceOfNaunet(EFI 驱动程序) EFI 驱动程序执行以下操作: 1. **Hook 安装**:通过替换服务表中的函数指针,拦截 EFI Runtime Services Table 中的 `SetVariable()` 2. **隐藏缓冲区分配**:在 runtime services 内存中分配一个隐藏缓冲区,用于存储被拦截的 payload 3. **变量拦截**:当任何匹配目标 GUID/名称对的变量通过 `SetVariable()` 写入时,驱动程序会捕获 payload 数据,而不是允许其持久化存储在 NVRAM 中 4. **调试输出**:通过 `DEBUG()` 消息显示被拦截 payload 的十六进制转储 ### Rootkit(Windows 内核驱动程序) 一个最小化的 Windows 内核驱动程序,它使用 `ExSetFirmwareEnvironmentVariable()` 将测试数据写入 UEFI NVRAM。此驱动程序用于在系统启动时触发拦截机制。 ## 项目结构 ``` Silence-of-Naunet/ ├── SilenceOfNaunet/ # EFI Driver │ ├── SilenceOfNaunet.c # Main driver implementation │ ├── SilenceOfNaunet.h # Public header │ ├── SilenceOfNaunet.inf # INF file for build ├── Rootkit/ # Windows Kernel Driver │ └── Rootkit/ │ ├── main.c # Driver entry point │ └── Rootkit.inf # INF file for build └── README.md ``` ## 配置 要更改被拦截的目标变量,请修改源文件中的以下值: **SilenceOfNaunet/SilenceOfNaunet.c:** ``` CHAR16 *NvramName = L"TestData"; STATIC EFI_GUID mTestDataGuid = { 0xa1b2c3d4, 0x1234, 0x5678, {0x9a, 0xbc, 0xde, 0xf1, 0x23, 0x45, 0x67, 0x89} }; ``` **Rootkit/Rootkit/main.c:** ``` #define SN_VAR_NAME L"TestData" GUID VendorGuid = { 0xa1b2c3d4, 0x1234, 0x5678, {0x9a, 0xbc, 0xde, 0xf1, 0x23, 0x45, 0x67, 0x89} }; ``` ## 测试 使用 QEMU + OVMF 进行测试(调试设置请参阅[我的博客](https://0xbekoo.github.io/docs/uefi-dev/debugging-ovmf-with-gdb/)): ``` bekoo@UbuntuOS:~/qemu-ovmf$ cat debug.log | grep "Silence" ... Loading driver at 0x0007FAAC000 EntryPoint=0x0007FAAE351 SilenceOfNaunet.efi [SilenceOfNaunet] OnVirtualAddressChange triggered [SilenceOfNaunet] HiddenBuffer virtual: 0xFFFFF80763C49000 [SilenceOfNaunet] SetVariable virtual: 0xFFFFF80763DDEED5 [SilenceOfNaunet] TestData intercepted! 4 bytes -> HiddenBuffer (0xFFFFF80763C49000) [SilenceOfNaunet] Payload Content (Hex Dump): [SilenceOfNaunet] DE AD BE EF ``` ## 技术细节 ### Hook 机制 该驱动程序通过以下方式挂钩 `SetVariable()`: 1. 禁用 CPU 写入保护(CR0.WP 位) 2. 替换 `gRT->SetVariable` 中的函数指针 3. 重新启用写入保护 4. 重新计算 `gRT` 的 CRC32 以保证完整性 ## 许可证 详情请参阅 LICENSE 文件。
标签:Hook技术, Rootkit, UEFI, Zeek, 内核驱动, 固件安全, 安全研究, 客户端加密, 网络协议