DRM 指纹追踪:EME 和 Widevine 信号如何追踪你
加密媒体扩展和 Widevine DRM 能力信号如何创建指纹向量,以及如何在引擎级别控制 DRM 身份。
简介
加密媒体扩展(EME)是一项 W3C 规范,允许 Web 浏览器与内容解密模块(CDM)交互以播放 DRM 保护的媒体。使用最广泛的 CDM 是 Google 的 Widevine,它集成在 Chrome、Firefox、Edge 和大多数基于 Chromium 的浏览器中。EME 使 Netflix、Disney+、Amazon Prime Video 等流媒体服务能够直接在浏览器中提供受保护的内容,无需插件。
虽然 EME 旨在促进媒体播放,但其能力查询已成为指纹数据的重要来源。网站可以使用这些查询来了解你浏览器的平台、安全硬件和软件配置,而没有任何可见指示或权限提示。这使得 DRM 能力成为远超媒体播放范畴的隐私问题,而大多数用户对此毫不知情。
隐私影响
DRM 能力指纹追踪尤其令人担忧,因为它暴露了通过其他方式难以获得的深层平台信息。这些信号包括:
- 密钥系统支持:浏览器上可用的 DRM 系统因平台而异。一些是单一操作系统独有的,意味着仅密钥系统的存在或缺失就能立即揭示你的平台。这是你可能不希望每个网站都知道的信息。
- 安全级别:DRM 根据设备的硬件以不同的安全级别运行。你的设备是否有硬件支持的安全性或依赖纯软件处理,这些信息都通过查询暴露,揭示了你系统的硬件细节。
- 健壮性能力:支持的健壮性级别集合是设备特定的,与你的硬件安全配置相关。这为网站可以静默查询的平台识别创建了另一个维度。
- DRM 上下文中的编解码器能力:DRM 上下文中可用的编解码器与一般播放可用的不同。这种 DRM 特定的编解码器矩阵为你设备的指纹增加了又一层。
柏林工业大学的研究发现,仅 EME 能力查询就能区分 30 多种不同的平台配置,当与其他指纹信号结合时,对唯一识别的贡献是显著的。这些查询速度快(低于 50ms)、不需要权限、不产生可见指示。
缺乏意识使这个问题特别严重。大多数用户不知道 DRM 能力查询可以用于媒体播放之外的目的,也没有机制来选择退出这些查询。这正是注重隐私的用户需要保护的那种静默追踪。
为什么这对你的隐私很重要
静默的平台识别
每次你访问网站时,它都可以通过 DRM 查询静默确定你的操作系统和硬件配置。这在没有任何通知、同意对话框或可见迹象的情况下发生。收集到的信息可以与其他指纹信号结合,构建你设备的详细且持久的配置文件。
Headless 浏览器检测
DRM 指纹追踪最具影响力的方面之一涉及 headless 浏览器。标准 headless Chrome 不包含 Widevine CDM,这意味着 DRM 能力查询在 headless 模式下会失败。由于几乎所有桌面 Chrome 安装都包含 Widevine,其缺失是一个强烈的信号,表明浏览器正在自动化或 headless 环境中运行。这对合法的隐私研究、自动化测试以及任何依赖 headless 浏览器的工作流构成了重大挑战。
没有退出选项
与 Cookie、位置访问或相机权限不同,用户无法选择退出 DRM 能力查询。该 API 不需要权限。任何网站都可以随时运行这些查询,使 DRM 指纹追踪成为未受保护浏览器的持久且不可避免的追踪向量。
跨平台身份泄露
在一个操作系统上运行浏览器但呈现不同平台身份的做法,会被 DRM 信号立即破坏。例如,Linux 上的用户即使希望避免平台特定的追踪,仍然会通过其实际环境独有的 DRM 信号被识别。
常见保护方案及其局限性
VPN 和代理服务器
VPN 对 DRM 能力查询没有影响。EME 完全在浏览器和 CDM 内部运行,能力检测期间没有网络请求。无论是否使用 VPN,DRM 指纹都是相同的。如果你仅依赖 VPN 进行隐私保护,你的 DRM 指纹仍然完全暴露。
隐身和隐私浏览
隐私浏览模式不会改变 DRM 能力响应。Widevine 支持、健壮性级别和密钥系统可用性在隐身模式和普通窗口中相同。隐私浏览可以防护基于 Cookie 的追踪,但对硬件级指纹追踪无效。
浏览器扩展
扩展无法有效控制 EME 响应。完全阻止 API 会破坏所有 DRM 保护的媒体播放(Netflix、Disney+ 和其他流媒体服务),而且会被立即检测到因为 API 不可用。尝试修改返回值会引入可检测的不一致,且扩展无法添加或删除对原生 CDM 二进制文件的支持。这是一个需要引擎级保护的问题。
Headless 浏览器变通方案
一些自动化框架试图通过存根 API 使 headless Chrome 看起来支持 Widevine。这种方案会失败,因为 API 与实际的 CDM 二进制文件交互。一个没有真实 CDM 就返回成功的存根会产生不正确的配置对象,并在任何进一步交互中失败。表面级的修补对 DRM 信号保护根本不起作用。
BotBrowser 的引擎级方案
BotBrowser 在浏览器引擎级别控制 DRM 信号,确保所有 EME 相关查询返回与加载的指纹配置文件一致的结果。这不是 JavaScript 覆盖或浏览器扩展。BotBrowser 修改浏览器的内部 DRM 报告,使原生 API 本身产生与配置文件一致的结果。
基于配置文件的 DRM 配置
chrome --bot-profile="/path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
配置文件定义完整的 DRM 能力集:哪些密钥系统受支持、在什么健壮性级别、使用什么编解码器组合,以及返回什么配置细节。所有这些数据从真实设备采集,确保内部一致性。你获得的是匹配真实设备的完整、真实的 DRM 身份。
Headless 模式下的 Widevine
BotBrowser 在 headless 模式下维护 Widevine CDM 可用性。这是最重要的 DRM 相关保护之一,因为 headless Chrome 中 Widevine 的缺失是环境检测最常检查的信号之一。
chrome --bot-profile="/path/to/profile.enc" \
--headless \
--user-data-dir="$(mktemp -d)"
DRM 能力查询在 headless 和 headed 模式下返回相同结果,无论你如何运行 BotBrowser 都能保证完全一致。无论你是进行隐私研究、运行自动化测试,还是构建需要 headless 操作的工作流,你的 DRM 信号始终与普通桌面浏览器无法区分。
跨平台 DRM 身份
在 Linux 服务器上运行的 Windows 配置文件会报告适合 Windows 的 DRM 特征。平台特定和通用的 DRM 系统都正确报告,健壮性级别匹配目标平台,DRM 上下文中的编解码器支持与预期配置一致。distinctiveIdentifier 和 persistentState 行为也匹配配置文件的平台。
这种跨平台一致性对于在所有指纹表面维护连贯身份至关重要。BotBrowser 确保你的 DRM 信号与浏览器配置文件的每个其他方面讲述相同的故事。
一致的配置对象
当 DRM 能力查询成功时,返回的配置对象揭示了协商的能力,包括初始化数据类型、视频和音频能力以及会话类型支持。BotBrowser 确保这些配置对象准确且与配置文件一致,每个细节都与真实设备报告的内容一致。
配置和用法
基本 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();
// 导航到指纹测试网站以验证 DRM 信号
await page.goto('https://example.com');
// 检查 DRM 信号一致性
const drmInfo = await page.evaluate(async () => {
const results = {};
// 验证 Widevine 可用性
try {
const access = await navigator.requestMediaKeySystemAccess(
'com.widevine.alpha',
[{
initDataTypes: ['cenc'],
videoCapabilities: [{
contentType: 'video/mp4; codecs="avc1.42E01E"',
robustness: 'SW_SECURE_DECODE',
}],
}]
);
results.widevine = {
available: true,
config: access.getConfiguration(),
};
} catch {
results.widevine = { available: false };
}
return results;
});
console.log('DRM signals:', JSON.stringify(drmInfo, null, 2));
await browser.close();
})();
Puppeteer 集成
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('about:blank');
// 验证 Widevine 在 headless 模式下可用
const widevineAvailable = await page.evaluate(async () => {
try {
await navigator.requestMediaKeySystemAccess(
'com.widevine.alpha',
[{ initDataTypes: ['cenc'],
videoCapabilities: [{
contentType: 'video/mp4; codecs="avc1.42E01E"',
}],
}]
);
return true;
} catch {
return false;
}
});
console.log('Widevine available in headless:', widevineAvailable);
await browser.close();
})();
验证
使用配置文件启动 BotBrowser 后,你可以确认 DRM 信号已正确保护。以下是检查要点:
- Widevine 可用性匹配预期。对于 Chrome 配置文件,Widevine 应在 headed 和 headless 模式下都可用。
- 平台特定密钥系统与你的配置文件一致。Windows 配置文件应显示 Linux 配置文件不会有的平台特定 DRM 支持,反之亦然。
- 健壮性级别匹配配置文件的安全层级和硬件配置。
- 配置细节正确且内部一致。
- Headless 和 headed 结果相同。 这是最重要的检查之一,因为通过 DRM 信号检测 headless 是一种常见的追踪技术。
- 结果在页面重载和浏览器重启之间一致。 你的 DRM 身份应该稳定且可重现。
你可以使用指纹测试网站或 BotBrowser 的内置验证工具来确认这些信号正确对齐。
最佳实践
-
始终使用完整配置文件。 DRM 信号必须与配置文件的平台、浏览器版本和硬件对齐。部分配置会造成可检测的不一致。完整的配置文件确保所有 DRM 信号协调一致。
-
验证 headless Widevine。 如果在 headless 模式下运行,确认 Widevine 查询成功。这是环境检测最常检查的信号之一,BotBrowser 的 headless Widevine 支持是关键优势。
-
将配置文件平台与预期 DRM 特性匹配。 Linux 配置文件不应报告 Windows 特定的 DRM 支持,Windows 配置文件应报告适当的密钥系统集。BotBrowser 配置文件从真实设备数据构建,因此当你使用正确的配置文件时这种对齐会自动发生。
-
与编解码器保护结合使用。 DRM 编解码器能力和一般媒体编解码器能力应对齐。使用单个配置文件确保两者一致。详见 MIME 和编解码器保护文章。
-
Widevine DRM 播放设置请参阅 Widevine DRM 设置指南。
常见问题
Headless Chrome 通常支持 Widevine 吗?
不支持。标准 headless Chrome 不包含 Widevine CDM 模块,这使 DRM 能力查询失败。这种缺失是众所周知的环境检测信号。BotBrowser 在 headless 模式下维护 Widevine 可用性,确保你的 DRM 信号无论显示模式如何都保持一致。
DRM 指纹追踪能识别特定设备吗?
不能单独识别,但 DRM 信号显著缩小了识别范围。密钥系统支持、健壮性级别和编解码器能力的组合创建了一个配置文件,当与其他指纹信号结合时,对设备识别有有意义的贡献。BotBrowser 的配置文件系统确保你的 DRM 信号匹配特定的真实设备配置而非你的实际硬件。
BotBrowser 实际解密 DRM 内容吗?
BotBrowser 的 DRM 信号保护控制的是网站用于指纹追踪的能力查询。实际的 DRM 内容播放请参阅 Widevine DRM 设置指南。这两个功能协同工作:信号保护确保你的指纹一致,DRM 设置指南涵盖媒体播放功能。
DRM 信号在浏览器版本之间会变化吗?
会。浏览器更新可以更改 Widevine 模块版本、添加对新健壮性级别的支持或修改 DRM 上下文中的编解码器能力。BotBrowser 配置文件是版本化的以匹配特定浏览器版本,因此你的 DRM 信号始终对应有效的真实世界配置。
ClearKey 对指纹追踪有用吗?
ClearKey 被普遍支持,单独提供有限的指纹追踪价值。然而,具体的配置细节在平台之间略有不同,可以贡献于整体指纹。BotBrowser 配置文件包含适当的 ClearKey 响应以维护完全一致性。
这与 HDCP 检测有何关系?
HDCP(高带宽数字内容保护)状态可以影响设备报告的健壮性级别。BotBrowser 配置文件包含适合目标设备配置的健壮性级别,与宿主的实际 HDCP 状态无关。这意味着你报告的能力始终与配置设备一致。
网站能强制进行 DRM 能力检查吗?
能。DRM 能力查询不需要权限,不产生用户可见的提示。任何网站都可以随时查询 DRM 能力,这就是为什么通过 BotBrowser 进行主动保护比反应式措施更为必要。
总结
EME 和 Widevine 能力查询暴露了详细的平台、硬件和安全配置信息,作为持久的指纹追踪信号。headless 浏览器中 DRM 的缺失本身就是一个众所周知的追踪向量。BotBrowser 通过其配置文件系统在引擎级别控制所有 DRM 相关信号,在 headless 模式下维护 Widevine 可用性,并确保所有 EME 能力查询的跨平台一致性。使用 BotBrowser,你的 DRM 身份是真实的、一致的,并与浏览器指纹的每个其他方面完全对齐。相关保护请参阅 MIME 和编解码器保护、Audio 指纹控制和 Widevine DRM 设置。