返回博客
指纹

使用 BotBrowser 的 DRM 信号保护

BotBrowser 如何在引擎层控制 EME、Widevine 与 DRM 能力信号,以防止基于 DRM 的跨平台指纹识别。

介绍

加密媒体扩展(EME)是一个 W3C 规范,允许浏览器与内容解密模块(CDM)交互以播放受 DRM 保护的媒体。最常见的 CDM 是 Google 的 Widevine,已集成在 Chrome、Firefox、Edge 及多数 Chromium 衍生浏览器中。EME 使得像 Netflix、Disney+、Amazon Prime Video 这样的视频服务可以在浏览器内直接播放受保护内容而无需插件。

EME API 提供方法让网站查询浏览器支持哪些 DRM 密钥系统、支持什么安全级别以及哪些编码组合。此类查询旨在帮助媒体服务为每个访客选择合适的流质量与 DRM 配置。但这些查询的响应会因平台、浏览器版本、硬件,甚至 Widevine 模块版本不同而异,因而成为一种无需用户许可即可被查询的强指纹源。

隐私影响

DRM 能力指纹特别令人担忧,因为其暴露了难以通过其他方式获得的深层平台信息。具体信号包括:

  • 密钥系统支持:哪些 DRM 系统可用(Widevine、PlayReady、FairPlay、ClearKey)。Widevine 在 Chrome/Firefox/Edge 上普遍存在,PlayReady 仅在 Windows,FairPlay 仅在 Apple 设备上可用。
  • 安全级别:Widevine 有不同的安全级别。L1(硬件支持)仅在带有硬件受信执行环境(TEE)的设备上可用,L3(软件)为回退。这反映了设备是否具备硬件安全模块。
  • robustness 字符串:例如 SW_SECURE_CRYPTOSW_SECURE_DECODEHW_SECURE_CRYPTOHW_SECURE_DECODEHW_SECURE_ALL。支持集合因设备而异。
  • DRM 环境下的 codec 能力:某些 codec 在一般播放场景中支持,但在 DRM 环境中可能不支持,反之亦然。

研究表明,单靠 EME 能力查询就能区分 30 多种平台配置,并在与其他指纹信号结合时显著提高唯一识别率。此类查询快速(<50ms)、无需权限且不产生可见提示,普通用户通常不会意识到它们被用于除播放以外的目的。

技术背景

EME 工作流程

当网站想要播放 DRM 内容时,通常遵循:

  1. 使用 navigator.requestMediaKeySystemAccess(keySystem, configs) 请求密钥系统访问(如 com.widevine.alpha)。
  2. 若支持,浏览器返回一个 MediaKeySystemAccess 对象,描述达成的能力。
  3. 使用该对象创建 MediaKeys,并绑定到 CDM。
  4. MediaKeys 设置到 HTMLMediaElement 以在播放时解密。

第 1 步是与指纹相关的关键步骤:浏览器会根据实际能力评估请求的配置并返回最优匹配。通过系统化地查询不同密钥系统、robustness 级别与 codec 组合,网站可以绘制出浏览器完整的 DRM 能力画像。

常见密钥系统标识

  • com.widevine.alpha:Google Widevine,Chrome/Firefox/Edge/Android 支持。
  • com.microsoft.playready:Microsoft PlayReady,仅 Windows/Xbox。
  • com.apple.fps:Apple FairPlay,仅 Safari/Apple 设备。
  • org.w3.clearkey:ClearKey,作为参考实现普遍支持。

每种密钥系统的有无本身就是强平台指示符:同时支持 Widevine 与 PlayReady 的浏览器几乎可以确定运行在 Windows 上,而仅有 Widevine 则可能是 Linux、macOS 或 Chrome OS。

Robustness 等级

Widevine 定义了多级 robustness,从弱到强:空字符串、SW_SECURE_CRYPTOSW_SECURE_DECODEHW_SECURE_CRYPTOHW_SECURE_DECODEHW_SECURE_ALL。设备是否支持顶级 robustness 依赖其是否有硬件 TEE 及 Widevine 的集成。桌面通常最多为 SW_SECURE_DECODE(L3),部分 Android 设备可到 HW_SECURE_ALL(L1)。

Headless 浏览器检测

一个重要的 DRM 指纹信号来自 headless 环境:标准 headless Chrome 不包含 Widevine CDM,因此 requestMediaKeySystemAccess('com.widevine.alpha', ...) 在 headless 上会失败。该缺失是自动化/无头环境的强指纹信号。

配置对象细节

传递给 requestMediaKeySystemAccess() 的配置对象通常包含:

  • initDataTypes(如 cenckeyidswebm
  • audioCapabilitiesvideoCapabilities(含 codec 与 robustness 要求)
  • distinctiveIdentifier(是否允许硬件标识)
  • persistentState(是否支持持久许可证存储)

这些参数的回应都有平台差异,增加了指纹维度。

常见防护方法与局限

VPN 与代理

VPN 对 EME 查询无效。EME 在浏览器/CDM 内部运行,与网络路径无关。

隐私/无痕模式

隐私模式不会改变 DRM 能力响应。Widevine 支持、robustness 与密钥系统的可用性在隐私窗口中与常规窗口一致。

浏览器扩展

扩展无法有效地控制 EME:屏蔽 requestMediaKeySystemAccess 会破坏所有 DRM 播放体验;篡改返回值可以被属性描述符检测到;扩展也无法在系统层面添加缺失的 CDM。

Headless 伪装

有些自动化框架尝试通过桩(stub)API 来让 headless Chrome 显示支持 Widevine,但由于 requestMediaKeySystemAccess() 实际与本地 CDM 交互,简单桩返回在实际密钥交换环节会失败并被检测。

BotBrowser 的引擎级方法

BotBrowser 在浏览器引擎层控制 DRM 信号,确保所有 EME 查询返回与所加载指纹配置一致的结果。

基于配置文件的 DRM 配置

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

配置文件定义完整的 DRM 能力集:支持哪些密钥系统、支持的 robustness、哪些 codec 组合,以及应返回的配置细节。所有数据均来自真实设备以保证内部一致性。

Headless 中的 Widevine

BotBrowser 保持 headless 模式下的 Widevine 可用性。这是防护中极其重要的一环,因为 headless Chrome 缺失 Widevine 是常被检测的信号之一。

chrome --bot-profile="/path/to/profile.enc" \
       --headless \
       --user-data-dir="$(mktemp -d)"

在 headless 与有头模式下,DRM 查询返回相同结果,消除了该检测向量。

跨平台 DRM 身份一致性

在 Linux 服务器上运行的 Windows 配置文件会报告与 Windows 相匹配的 DRM 特征:

  • 同时报告 Widevine 与 PlayReady 可用
  • Robustness 与 Windows Chrome 的能力一致
  • DRM 环境下的 codec 支持与 Windows Media Foundation 对应
  • distinctiveIdentifierpersistentState 的行为与 Windows Chrome 一致

这种跨平台一致性对于在所有指纹面上维持连贯身份至关重要。

一致的配置对象

requestMediaKeySystemAccess() 成功时,返回的 MediaKeySystemAccess.getConfiguration() 应揭示达成的能力。BotBrowser 确保这些对象与配置文件一致,包括 initDataTypesvideoCapabilitiesaudioCapabilities 与会话类型支持。

配置与使用

基本 CLI 用法

加载配置文件后,DRM 信号保护会自动生效:

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

与 Playwright 集成

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
  });

  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  const drmInfo = await page.evaluate(async () => {
    const results = {};
    // ...
  });

  console.log('DRM signals:', JSON.stringify(drmInfo, null, 2));
  await browser.close();
})();

(示例代码保持不变)

验证

启动 BotBrowser 后验证 DRM 信号:

async function checkDRM() {
  const keySystems = [
    'com.widevine.alpha',
    'com.microsoft.playready',
    'org.w3.clearkey',
  ];

  for (const ks of keySystems) {
    try {
      const access = await navigator.requestMediaKeySystemAccess(ks, [{
        initDataTypes: ['cenc'],
        videoCapabilities: [{
          contentType: 'video/mp4; codecs="avc1.42E01E"',
        }],
      }]);
      const config = access.getConfiguration();
      console.log(`${ks}: SUPPORTED`, JSON.stringify(config));
    } catch {
      console.log(`${ks}: NOT SUPPORTED`);
    }
  }
}

await checkDRM();

需要检查的项包含 Widevine 可用性、PlayReady 仅在 Windows、robustness 与配置对象在各模式及重启间一致等。

最佳实践

  1. 始终使用完整配置文件。 DRM 信号必须与配置文件的目标平台、浏览器版本和硬件相匹配。
  2. 验证 headless 下的 Widevine。 在无头模式下确认 Widevine 查询成功。
  3. 使配置文件平台与期望 DRM 特性一致。 Linux 不应报告 PlayReady 支持等不一致情况。
  4. 将 DRM 与 codec 能力一并保护。 使用单一配置文件以保证两者的一致性。
  5. 有关 Widevine 播放的设置,请参见 Widevine DRM setup

常见问题

Headless Chrome 是否默认支持 Widevine?

默认不支持。标准 headless Chrome 缺少 Widevine CDM 模块,BotBrowser 在无头模式下维持 Widevine 可用性。

DRM 指纹能否精确识别设备?

单靠 DRM 无法做到逐设备识别,但能大幅缩小候选集。与其他指纹信号结合后,会对设备识别有明显贡献。

BotBrowser 会解密 DRM 内容吗?

BotBrowser 的 DRM 保护是对能力查询的控制;实际播放配置参考 Widevine 指南。

总结

EME 与 Widevine 能力查询暴露了平台、硬件与安全配置的细节,成为持久的指纹信号。BotBrowser 通过配置文件在引擎层面控制这些信号,在 headless 模式下维持 Widevine 可用性并保证跨平台一致性。

title: "BotBrowser DRM 信号保护" description: "BotBrowser 如何通过指纹配置文件控制 EME 和 Widevine 响应,实现跨平台一致的 DRM 信号。" date: "2025-07-30" locale: zh category: fingerprint tags: ["drm", "widevine", "eme", "fingerprinting", "privacy"] published: true

隐私风险

加密媒体扩展 (EME) API 允许网站在无需用户权限的情况下查询 DRM 密钥系统支持。响应揭示设备特定信息: 支持的密钥系统、安全级别和编解码器能力。这些信号因平台而异,且不会在会话之间改变。

BotBrowser 的解决方案

BotBrowser 通过配置文件系统管理 DRM 相关信号。加载配置文件后,所有 EME 响应与配置文件的目标平台和浏览器配置一致。

基于配置文件的 DRM 配置

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

配置文件控制哪些密钥系统显示为支持、报告什么鲁棒性级别,以及浏览器如何响应能力查询。

无头模式下的 Widevine

标准无头浏览器通常缺少 Widevine 支持,这本身就是一个强信号。BotBrowser 在无头模式下保持 Widevine 可用性,DRM 能力查询在有无可见窗口时返回相同结果。

跨平台一致性

Windows Chrome 配置文件在 Linux 服务器上运行时,报告 Windows 平台适当的 DRM 特征,包括正确的安全级别、鲁棒性值和编解码器能力。

验证

加载配置文件后,验证 DRM 信号:

const { chromium } = require('playwright-core');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
  ],
  headless: true,
});

const page = await (await browser.newContext()).newPage();

const drmInfo = await page.evaluate(async () => {
  const config = [{
    initDataTypes: ['cenc'],
    videoCapabilities: [{
      contentType: 'video/mp4; codecs="avc1.42E01E"',
      robustness: 'SW_SECURE_DECODE'
    }],
  }];

  try {
    const access = await navigator.requestMediaKeySystemAccess(
      'com.widevine.alpha', config
    );
    return { widevine: true, config: access.getConfiguration() };
  } catch {
    return { widevine: false };
  }
});

console.log('DRM 信号:', JSON.stringify(drmInfo, null, 2));

关键检查项:

  1. Widevine 可用性与配置文件的平台匹配
  2. 鲁棒性级别在无头和有头模式之间一致
  3. 不同配置文件产生不同的平台适当响应

快速开始

  1. GitHub 下载 BotBrowser
  2. 使用 --bot-profile 加载配置文件以应用 DRM 信号保护
  3. 验证 EME 响应与配置文件的目标平台匹配
  4. 查看 文档 了解配置文件详情
#drm#widevine#eme#fingerprinting#privacy#encrypted-media