使用 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_CRYPTO、SW_SECURE_DECODE、HW_SECURE_CRYPTO、HW_SECURE_DECODE、HW_SECURE_ALL。支持集合因设备而异。 - DRM 环境下的 codec 能力:某些 codec 在一般播放场景中支持,但在 DRM 环境中可能不支持,反之亦然。
研究表明,单靠 EME 能力查询就能区分 30 多种平台配置,并在与其他指纹信号结合时显著提高唯一识别率。此类查询快速(<50ms)、无需权限且不产生可见提示,普通用户通常不会意识到它们被用于除播放以外的目的。
技术背景
EME 工作流程
当网站想要播放 DRM 内容时,通常遵循:
- 使用
navigator.requestMediaKeySystemAccess(keySystem, configs)请求密钥系统访问(如com.widevine.alpha)。 - 若支持,浏览器返回一个
MediaKeySystemAccess对象,描述达成的能力。 - 使用该对象创建
MediaKeys,并绑定到 CDM。 - 将
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_CRYPTO、SW_SECURE_DECODE、HW_SECURE_CRYPTO、HW_SECURE_DECODE、HW_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(如cenc、keyids、webm)audioCapabilities与videoCapabilities(含 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 对应
distinctiveIdentifier与persistentState的行为与 Windows Chrome 一致
这种跨平台一致性对于在所有指纹面上维持连贯身份至关重要。
一致的配置对象
当 requestMediaKeySystemAccess() 成功时,返回的 MediaKeySystemAccess.getConfiguration() 应揭示达成的能力。BotBrowser 确保这些对象与配置文件一致,包括 initDataTypes、videoCapabilities、audioCapabilities 与会话类型支持。
配置与使用
基本 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 与配置对象在各模式及重启间一致等。
最佳实践
- 始终使用完整配置文件。 DRM 信号必须与配置文件的目标平台、浏览器版本和硬件相匹配。
- 验证 headless 下的 Widevine。 在无头模式下确认 Widevine 查询成功。
- 使配置文件平台与期望 DRM 特性一致。 Linux 不应报告 PlayReady 支持等不一致情况。
- 将 DRM 与 codec 能力一并保护。 使用单一配置文件以保证两者的一致性。
- 有关 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));
关键检查项:
- Widevine 可用性与配置文件的平台匹配
- 鲁棒性级别在无头和有头模式之间一致
- 不同配置文件产生不同的平台适当响应