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, 内核驱动, 固件安全, 安全研究, 客户端加密, 网络协议