检测 Web 流量中的模拟器与虚拟机
模拟器和虚拟机为规模化欺诈提供支撑——设备农场、移动应用模拟、云浏览器。检测它们意味着读取虚拟化环境无法完全复现的硬件、时序与一致性信号。
大多数规模化运行的欺诈都跑在虚拟化基础设施上,因为替代方案——一屋子实体手机和笔记本电脑——既无法规模化,也无法隐藏。模拟器或虚拟机让单一操控者能够按需启动数千台看似彼此独立的设备,每一台看起来都像一个全新的消费级终端。检测这种虚拟化是设备智能层能做的最具杠杆效应的事情之一,因为它识别的是规模化滥用的基础设施,而不是逐个追查单次的欺诈行为。
本文讲述模拟器和虚拟机如何在 Web 与应用流量中暴露自己:虚拟化环境难以复现的硬件、时序与一致性信号,为什么任何单一信号都不够,以及如何在不破坏合法虚拟化的前提下依据检测结果采取行动。目标读者是构建或评估机器人检测的工程师和反欺诈团队。
为什么模拟器和虚拟机对欺诈至关重要
模拟器和虚拟机之所以重要,是因为它们是量产式欺诈成本最低的载体——它们把一台机器变成一支看起来干净的设备舰队,而这正是大多数欺诈经济学所要求的。
欺诈中反复出现的问题是规模。单个假账号或单笔欺诈交易很少划算;钱是靠做上千次赚来的。做上千次需要上千个设备身份,因为平台越来越多地以设备为单位关联滥用行为(参见设备指纹如何工作)。实体硬件是获取大量设备身份的诚实途径,但代价高昂得令人望而却步,而且速度缓慢。虚拟化则是廉价的途径。
具体来说,虚拟化支撑着:
设备农场。 一整机架的模拟移动设备或无头浏览器实例,被编排起来批量创建账号、领取促销、发布虚假评论,或大规模运行撞库和账号创建滥用。每个模拟实例都呈现为一台独立的手机或笔记本电脑。
移动应用模拟。 在桌面或服务器硬件上的模拟器中运行 Android 或 iOS 应用,以自动化那些本应要求真实手机的应用内流程——移动端注册、需要应用才能领取的促销、应用内欺诈。
云浏览器与浏览器即服务。 运行在云端 VM 中的完整浏览器,被自动化用于爬取、广告欺诈和账号滥用。它们比粗糙的机器人更精密,因为它们会完整渲染页面并执行 JavaScript。
共同点在于:一台实体机器,多个虚拟身份。如果你能检测到虚拟化,就能把整支舰队还原到它的真实规模——一群实际上只是一个模拟主机的"一千名用户",与一千台真实设备是截然不同的风险决策。这就是为什么虚拟化检测是一个力量倍增器:它攻击的是使量产式欺诈得以成立的成本结构。
什么会暴露一台虚拟机
虚拟机会通过它必须合成而非真正拥有的物理信号暴露自己——GPU、时序行为、传感器,以及它所运行其上的 hypervisor 的底层痕迹。真实消费级硬件产生这些信号是"真实存在"的副产品;而 VM 必须伪造它们,并且要把它们全部一致地伪造出来非常困难。
虚拟化的 GPU 特征。 这是最强的破绽之一。图形渲染取决于实际的 GPU、它的驱动程序,以及它的浮点行为。VM 通常使用虚拟化或软件渲染的图形——SwiftShader、llvmpipe、VMware/VirtualBox/QEMU 虚拟 GPU,或者一个仍会报告标志性字符串的直通 GPU。WebGL 的 renderer 和 vendor 字符串经常直接点名虚拟化环境("SwiftShader""llvmpipe""VMware SVGA""Google SwiftShader"),而即便这些字符串被伪造,canvas 和 WebGL 的渲染输出本身也会以微妙、难以伪造的方式与实体 GPU 不同。真实的 GPU 渲染复杂场景时会带有特定驱动的标志性伪影;软件渲染则产生不同的特征。
过于干净的时序。 真实硬件是有噪声的。JIT 编译、垃圾回收、热节流、操作系统中断,以及内存层级效应,都会给时序测量引入持续的抖动。虚拟化环境——尤其是运行在高质量基础设施上的云托管环境——往往运行得过于平滑,其时序方差低于实体消费级设备所表现出的水平。对特定计算模式进行高分辨率计时,可以揭示出一个性能画像异常均匀的环境。矛盾的是,数据中心 VM 的这种"干净"本身就是信号。
Hypervisor 痕迹。 虚拟化会留下底层痕迹:在 hypervisor 之下有差异的 CPU 特性标志和指令时序怪癖、特定的 TSC(时间戳计数器)行为,以及——在可观测的情况下——聚集在 VM 典型配置而非消费级典型配置附近的硬件并发数和内存值。一台设备一边报告非常像服务器的核心数和内存画像,一边声称自己是消费级笔记本电脑,这是自相矛盾的。
音频及其他硬件指纹。 AudioContext 指纹取决于音频子系统;虚拟化或缺失的音频硬件产生的浮点输出与真实声音硬件不同。单独看很微小,组合起来则有用。
网络情境。 模拟器和 VM 舰队常常运行在数据中心,因此网络层——数据中心 ASN、托管服务商 IP——可以佐证终端信号。VM 特征加上数据中心 IP,是比其中任何一个单独出现都强得多的模式。(老练的操控者会用住宅代理为其 VM 打掩护以隐藏网络一侧,而这恰恰是终端层面 VM 检测独立发挥作用的重要原因——它能挺过代理。)
移动模拟器如何暴露自己
移动模拟器暴露自己所依据的原理与手机相同:它们必须合成一台实体设备特定的硬件、传感器和渲染特征,而这种合成是不完整的。一个在桌面硬件上的模拟器中运行的 Android 或 iOS 应用并不是一台手机,有十几种信号都在这么说。
硬件身份字符串。 模拟器带有标志性的设备型号、build fingerprint 和硬件名称值。Android 模拟器历来会报告"generic""goldfish""ranchu""sdk_gphone"等 build 标识符,以及模拟器典型的型号名称。即便这些被打补丁修改以模仿真实设备,型号、主板、CPU ABI 与 build fingerprint 的组合也往往与任何一款真正出货过的真实设备对不上——一台声称是旗舰机却带 x86 ABI 的手机(真实手机是 ARM)就是破绽。
缺失或伪造的传感器。 真实手机拥有加速度计、陀螺仪、磁力计、环境光传感器和气压计,而且——关键在于——当设备被握持和移动时,这些传感器会产生连续、相关、有噪声的数据。模拟器要么缺少这些传感器,要么报告静态值,要么回放不具备真实设备被人手握持时那种自然方差和跨传感器相关性的合成模式。一台加速度计读数为完美常量,或者其陀螺仪和加速度计并不像物理规律所要求的那样同步运动的"手机",就是被模拟出来的。
渲染与 GPU 差异。 正如在桌面端一样,移动 GPU 的渲染特征在实体手机的移动 GPU(Adreno、Mali、Apple GPU)与模拟或软件渲染的 GPU 之间存在差异。本应与所声称的特定手机型号相符的屏幕密度、分辨率和渲染伪影,往往并不相符。
时序与性能画像。 一款手机应用在模拟器中运行于服务器级硬件上,其表现与同一款应用运行在实体手机的 SoC 上不同——通常比真实设备更快、更流畅,这又是"过于干净"破绽的一个实例。
移动场景是传感器数据变得决定性的地方,因为它确实很难伪造得好。要复现一台真实手机运动传感器那种连续、物理上自洽的输出——加速度计和陀螺仪就同一次运动达成一致,并带有真实人手的微抖动——远比编辑一个型号名称字符串费力,而大多数模拟配置都做不到令人信服。
为什么任何单一信号都不够
没有任何单一信号能可靠地检测虚拟化,因为任何一个信号都可能被了解它的操控者伪造——这正是为什么稳健的检测依赖于跨信号一致性,而不是任何单项检查。这与支配反检测浏览器检测的原理相同:单个破绽是可以打补丁的;而它们全部之间的一致性则不能。
一个铁了心的操控者会:
- 伪造 WebGL 的 vendor/renderer 字符串,以点名一个真实的 GPU。
- 修补 Android 的 build fingerprint 和型号,使其与真实手机相符。
- 注入合成的传感器值以伪造运动数据。
- 用住宅代理为 VM 打掩护,以清理网络信号。
其中任何一项都能击败依赖那一个信号的检测器。只检查 WebGL renderer 字符串的系统,会被一次字符串编辑打败。只检查 build fingerprint 的系统,会被一次打补丁打败。
难的是同时把所有这些都做到一致。伪造 WebGL 字符串以声称一颗 Adreno GPU 的操控者,产生的 canvas 渲染输出仍然与真实的 Adreno 对不上。伪造型号名称的操控者,仍然报告 x86 ABI,或一个此款手机不该有的核心数,或缺乏真实跨传感器相关性的传感器数据,或对其所声称的 SoC 而言过于干净的时序。他们每添加一层伪造,就是又多出一个必须与其他所有信号保持一致的表面,而约束条件会成倍增加。
这就是环境一致性原理:检测的问题不是"这一个值看起来是否被虚拟化了",而是"这些值是否全都描述同一台单一、真实、物理上可能存在的设备"。一台声称的 iPhone,其 GPU 渲染得像软件,其传感器读数恒定,其 ABI 是 x86,其时序又是数据中心般平滑,它并非在一个方面自相矛盾——而是在四个方面自相矛盾,而要同时把这四个都调和好才是昂贵的部分。在每一个信号上都维持完全一致性的成本,正是使基于一致性的检测在单信号检查失效之处依然成立的原因。更广泛的军备竞赛及其现状,在机器人流量现状中有所涵盖。
如何依据虚拟化检测采取行动
不要条件反射式地封禁虚拟化——要在具体情境中将其作为风险信号来加权,因为合法的虚拟化确实存在,而一刀切的封禁会造成误报。正确的应对取决于该流量的其他情况为何。
用户身处 VM 或模拟器中,存在真实、合法的理由:开发者在模拟器上测试、安全研究人员、注重隐私而在 VM 中运行浏览器的用户、企业虚拟桌面基础设施、无障碍配置。彻底封禁所有虚拟化会惩罚这些用户。虚拟化是一个风险信号,而不是一个判决。
行之有效的做法是把它当作分级决策的一项输入:
- 仅有虚拟化,其余情境正常: 低至中等风险。一个开发者在模拟器上并不是欺诈。记录它,不要封禁它。
- 虚拟化 + 数据中心网络 + 全新账号 + 高速率: 高风险。这是设备农场的特征——一个模拟终端,处于托管基础设施上,快速创建账号。这些信号相互佐证,形成一个可信的判决。
- 虚拟化 + 一致性违背(伪造的字符串与渲染对不上、不可能的硬件组合): 高风险。虚拟化加上主动隐藏它的企图,本身就是最强的信号——合法的 VM 用户不会去修补自己的 build fingerprint 来冒充旗舰手机。
- 舰队关联: 当许多"彼此独立"的设备共享同一标志性的虚拟化特征并以协调一致的方式行动时,舰队检测会把它们还原到其真实源头,无论任何单个账号看起来如何,这都是决定性的。
这一模式与无头浏览器检测以及机器人检测总体上是一致的:单个信号为分数提供依据,信号的组合产生判决,而应对是分级的——放行、质询或封禁——而不是仅凭虚拟化本身就粗暴封禁。模拟器和 VM 检测最有价值之处,不在于作为一道独立的关卡,而在于作为一个被大幅加权的信号,与网络和行为情境结合起来,揭露量产式欺诈背后的基础设施。
Tracio 将虚拟化检测作为其设备智能的一部分,横跨 130 多个信号——GPU 和渲染特征、时序与硬件一致性检查、移动传感器与 build 身份分析——并结合IP 智能的网络情境和跨信号一致性检查,捕捉单信号检测器会漏掉的伪造企图。它通过机器人检测层运行,并在 50 毫秒内返回一个判决,同时附上底层信号。
想看看虚拟化检测在你自己漏斗中面对设备农场和模拟器流量时的表现吗?