Network & Infrastructure · · 10 min read
物理硬件 vs 虚拟机:指纹识别能检测到什么
虚拟机在每个层面都留下可检测的痕迹:虚拟化管理程序 CPU 标志、虚拟硬件 ID、合成 GPU 渲染器、虚拟网卡 MAC 前缀、BIOS 字符串和计时侧信道。反检测浏览器无法隐藏虚拟化管理程序级别的标记。唯一不产生 VM 检测信号的硬件是真正的物理硬件。
虚拟化检测问题
每个主要平台——从亚马逊和 Stripe 到银行和广告网络——都对传入连接运行设备指纹识别。该指纹识别的一部分专门检查设备是物理机还是虚拟机。这种检查的存在是因为 VM 是账户欺诈、机器人操作和身份复制的主要工具。一台物理服务器可以生成数百个 VM,每个都假装是独立的用户。
检测方法是分层的,在系统堆栈的不同深度运行。有些很容易检测,有些需要复杂的分析。但综合来看,它们创建了一个能可靠区分虚拟和物理硬件的指纹——没有纯软件解决方案可以完全抑制所有信号。
虚拟化管理程序位:CPU 级别的标志
现代 x86 处理器有一个特定的 CPU 标志,称为虚拟化管理程序位(CPUID leaf 1, ECX bit 31)。当虚拟机运行时,虚拟化管理程序设置此位以指示操作系统正在虚拟化环境内执行。这不是可选的——它是硬件虚拟化规范(Intel VT-x, AMD-V)的一部分。
在 VM 内运行的任何软件都无法取消设置此位,因为 VM 不控制物理 CPU——虚拟化管理程序控制。一些高级配置尝试使用嵌套虚拟化技巧隐藏此位,但这些方法对简单的检测脚本有时有效,对检查额外一致性信号的复杂指纹识别则会失败。
虚拟硬件 ID:设备指纹
计算机中的每个硬件都有标识字符串——制造商名称、型号、序列号和设备 ID。在物理机中,这些由实际硬件制造商设置。在虚拟机中,这些字符串会暴露虚拟化平台。
VMware 签名:
- BIOS 供应商:"Phoenix Technologies"或"VMware"
- 系统制造商:"VMware, Inc."
- 网络适配器:"vmxnet3"
VirtualBox 签名:
- BIOS 供应商:"innotek GmbH"
- 系统产品名称:"VirtualBox"
- 网络适配器:MAC 前缀 08:00:27
Hyper-V 签名:
- 系统制造商:"Microsoft Corporation"
- 网络适配器:MAC 前缀 00:15:5D
KVM/QEMU 签名:
- 系统制造商:"QEMU"
- CPU 型号:"QEMU Virtual CPU"
这些硬件 ID 通过各种浏览器 API 暴露给操作系统,成为设备指纹的一部分。报告"VMware Virtual Platform"作为系统板的机器明确是虚拟机。
虚拟 GPU 检测:WebGL 和 Canvas
GPU 是最可靠的指纹识别组件之一,因为浏览器通过 WebGL 暴露 GPU 信息。当指纹脚本调用 WebGL getParameter() 获取 UNMASKED_RENDERER_WEBGL 时,浏览器返回 GPU 渲染器字符串。
物理机返回真实的 GPU 标识符:"NVIDIA GeForce RTX 4070"、"AMD Radeon RX 7800 XT"。虚拟机返回虚拟 GPU 标识符:
- VMware:"VMware SVGA 3D"
- VirtualBox:"Chromium"或"VBoxVGA"
- Hyper-V:"Microsoft Basic Render Driver"
- QEMU:"Red Hat VirtIO GPU"
Canvas 指纹识别加剧了这个问题。虚拟 GPU 产生的渲染输出与物理 GPU 不同,而且这些输出在使用相同虚拟化管理程序的所有 VM 中是一致的——这意味着你所有"独立"的 VM 身份产生相同的 canvas 哈希。
虚拟网卡 MAC 地址前缀
网络接口卡有 MAC 地址——48 位标识符,其中前 24 位(OUI)分配给制造商。每个虚拟化平台都有注册的 OUI:
- VMware:00:0C:29, 00:50:56
- VirtualBox:08:00:27
- Hyper-V:00:15:5D
- Xen:00:16:3E
- KVM/QEMU:52:54:00
虽然标准浏览器 API 不直接向网站暴露 MAC 地址,但它们可以通过 WebRTC 本地 IP 发现、浏览器扩展或原生应用程序指纹识别泄露。
反检测浏览器通常允许你在软件级别伪造 MAC 地址。然而,这造成了不一致:报告的 MAC 前缀可能显示"Intel Corporation",但实际的网络行为和驱动程序堆栈仍显示虚拟网络适配器特征。
BIOS 和固件字符串
系统 BIOS、UEFI 固件和 SMBIOS 表包含暴露给操作系统的标识字符串。在物理硬件上,这些包含真实的制造商数据。在虚拟机上,它们包含虚拟化管理程序标识符。
揭示虚拟化的关键 SMBIOS 字段:
- 系统制造商 — "VMware, Inc."、"QEMU"、"Microsoft Corporation"
- 系统产品名称 — "VMware Virtual Platform"、"VirtualBox"、"Virtual Machine"
- BIOS 供应商 — "Phoenix Technologies"(VMware)、"SeaBIOS"(QEMU)
浏览器指纹识别不能直接读取 SMBIOS 数据,但原生应用程序和浏览器扩展可以。信息也通过物理和虚拟 BIOS 实现之间不同的系统行为模式间接泄露。
计时侧信道:最难伪造
即使每个硬件标识符都被完美伪造,计时分析仍然可以检测虚拟化。虚拟机在特定操作中引入可测量的延迟,因为虚拟化管理程序必须拦截和模拟某些指令。
CPUID 指令计时。 在物理硬件上,CPUID 以可预测的 CPU 周期执行。在 VM 上,虚拟化管理程序拦截 CPUID,增加可测量的开销。
内存访问模式。 VM 使用影子页表或扩展页表进行内存虚拟化,在内存密集型操作中造成可检测的计时差异。
I/O 操作计时。 VM 上的磁盘和网络 I/O 通过虚拟化管理程序的虚拟设备层传递,计时特征与物理硬件明显不同。
时钟漂移和精度。 VM 时钟由虚拟化管理程序维护,表现出与硬件时钟不同的漂移特征。
这些基于计时的检测方法特别难以击败,因为它们利用了虚拟化本身的基本属性。只要虚拟化管理程序位于客户操作系统和物理硬件之间,就会有计时伪影。
为什么反检测浏览器无法解决这个问题
反检测浏览器在浏览器级别运行。它们可以修改 JavaScript API 返回值、伪造 canvas 渲染、更改 WebGL 字符串。但它们无法修改浏览器以下发生的事情:
- 无法改变 CPU 中的虚拟化管理程序位
- 无法在固件级别更改 SMBIOS/BIOS 字符串
- 无法改变虚拟网卡的实际 OUI
- 无法消除虚拟化管理程序引起的计时开销
- 无法使虚拟 GPU 与特定物理 GPU 完全相同地渲染
反检测浏览器处理浏览器指纹识别层。VM 检测在硬件和操作系统层运行。这些是堆栈中根本不同的深度。
物理硬件的优势
物理硬件产生零 VM 检测信号,因为没有虚拟化层可供检测。一台具有真实 CPU、真实 GPU、真实网卡和真实 BIOS 的真实计算机就是它声称的样子。没有虚拟化管理程序位、没有虚拟硬件 ID、没有合成 GPU 渲染器、没有虚拟化供应商的 MAC 前缀、没有虚拟化管理程序开销的计时异常。
这不是通过巧妙工程获得的优势,而是真实计算机的默认状态。指纹是真实的,因为硬件是真实的。
在物理运营环境中,每个工作站都是独立的物理机。设备指纹自然是唯一的——不同的 CPU、不同的 GPU、不同的网卡、不同的 BIOS 版本。没有两台物理机产生相同的指纹,也没有机器产生 VM 检测伪影。
关于云桌面和 VPS 服务如何未能通过 VM 检测,请参阅云桌面和 VPS:亚马逊如何检测虚拟化。有关设备指纹技术的更广泛概述,请阅读什么是浏览器指纹和设备识别。