Volver al Blog
Huella digital

Protección de señales DRM con BotBrowser

Cómo BotBrowser controla EME, Widevine y las señales de capacidad DRM a nivel de motor para prevenir el fingerprinting basado en DRM en diversas plataformas.

Introducción

Encrypted Media Extensions (EME) es una especificación W3C que permite a los navegadores interactuar con módulos de descifrado de contenido (CDM) para reproducir medios protegidos con DRM. El CDM más usado es Widevine de Google, integrado en Chrome, Firefox, Edge y la mayoría de navegadores basados en Chromium. EME permite a servicios como Netflix o Disney+ entregar contenido protegido directamente en el navegador.

La API EME permite que los sitios consulten qué sistemas de claves DRM soporta el navegador, a qué nivel de seguridad y con qué combinaciones de códecs. Estas respuestas varían según plataforma, versión del navegador, hardware y versión del CDM, por lo que constituyen una fuente valiosa de señales de fingerprinting que no requieren permiso del usuario.

Impacto en la privacidad

El fingerprinting basado en capacidades DRM es preocupante porque revela información de plataforma profunda y difícil de obtener por otros medios. Las señales incluyen:

  • Soporte de sistemas de clave: Widevine, PlayReady, FairPlay, ClearKey. Widevine es común; PlayReady es Windows-only; FairPlay es exclusivo de Apple.
  • Nivel de seguridad: Widevine opera en niveles como L1 (hardware) y L3 (software), indicando presencia de TEE o no.
  • Strings de robustness: Valores como SW_SECURE_CRYPTO, SW_SECURE_DECODE, HW_SECURE_CRYPTO, HW_SECURE_DECODE, HW_SECURE_ALL dependen del dispositivo.
  • Capacidades de códecs en contexto DRM: Algunas combinaciones de códec/DRM difieren del soporte multimedia general.

Estudios muestran que las consultas EME pueden distinguir decenas de configuraciones de plataforma y, combinadas con otras señales, incrementan la identificabilidad. Son rápidas (<50ms), sin permisos y sin indicadores visibles.

Antecedentes técnicos

Flujo EME

El flujo estándar para reproducir contenido DRM es:

  1. navigator.requestMediaKeySystemAccess(keySystem, configs) pide acceso al sistema de claves.
  2. Si es compatible, el navegador retorna un MediaKeySystemAccess describiendo capacidades.
  3. Se crean MediaKeys asociados al CDM.
  4. Se asignan MediaKeys al HTMLMediaElement para descifrado en reproducción.

El paso 1 es el que más interesa para fingerprinting, ya que el navegador evalúa las configuraciones y devuelve la coincidencia más adecuada.

Identificadores de sistemas de clave comunes

  • com.widevine.alpha (Widevine)
  • com.microsoft.playready (PlayReady)
  • com.apple.fps (FairPlay)
  • org.w3.clearkey (ClearKey)

La presencia o ausencia de estos es un fuerte indicador de plataforma.

Niveles de robustness

De menor a mayor seguridad: vacío, SW_SECURE_CRYPTO, SW_SECURE_DECODE, HW_SECURE_CRYPTO, HW_SECURE_DECODE, HW_SECURE_ALL. El soporte máximo depende de TEE y la integración del CDM.

Detección de headless

Headless Chrome estándar no incluye Widevine CDM; por tanto, requestMediaKeySystemAccess('com.widevine.alpha', ...) suele fallar en headless. Esa ausencia es una señal fuerte de entorno automatizado.

Detalles de la configuración

Los objetos de configuración pueden incluir initDataTypes, audioCapabilities, videoCapabilities, distinctiveIdentifier y persistentState, cada uno aportando respuestas con variaciones por plataforma.

Enfoques comunes de protección y límites

VPN y proxies

No afectan las consultas EME porque operan localmente en el CDM.

No cambia las respuestas de DRM.

Extensiones

No pueden añadir CDMs nativos ni alterar respuestas sin ser detectadas; bloquear la API rompe la reproducción DRM.

Parches para headless

Simular Widevine por stubbing falla en el intercambio real de claves porque el CDM nativo no está presente.

Enfoque de BotBrowser a nivel de motor

BotBrowser controla las señales DRM en el motor, haciendo que todas las consultas EME devuelvan resultados coherentes con el perfil cargado.

Configuración basada en perfil

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

El perfil define sistema de claves, niveles de robustness, combinaciones de códecs y demás metadatos. Los datos provienen de dispositivos reales para mantener coherencia.

Widevine en modo headless

BotBrowser mantiene disponibilidad de Widevine en headless, eliminando ese vector de detección.

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

Identidad DRM consistente entre plataformas

Un perfil Windows ejecutado en Linux reportará características DRM compatibles con Windows (Widevine + PlayReady, robustness adecuados, codecs acorde a Windows Media Foundation).

Configuración y uso

CLI básico

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

Integración con Playwright / Puppeteer

Los ejemplos de código en el original se mantienen sin cambios y funcionan con el binario de BotBrowser.

Verificación

Ejecuta chequeos mediante navigator.requestMediaKeySystemAccess() para los key systems esperados y verifica getConfiguration() y consistencia entre modos.

Buenas prácticas

  1. Usa un perfil completo y coherente.
  2. Verifica Widevine en headless.
  3. Asegura que el perfil reporte solo las características DRM apropiadas para la plataforma.
  4. Protege capacidades de codec junto con DRM.

FAQ y resumen

Headless Chrome normalmente no trae Widevine; DRM no identifica un dispositivo individualmente pero reduce el conjunto de candidatos; BotBrowser controla las señales de capacidad para evitar detección basada en EME.

title: "Proteccion de senales DRM con BotBrowser" description: "Como BotBrowser controla las respuestas de EME y Widevine a traves de perfiles de huella digital para senales DRM consistentes entre plataformas." date: "2025-07-30" locale: es category: fingerprint tags: ["drm", "widevine", "eme", "fingerprinting", "privacy"] published: true

El riesgo de privacidad

La API de Extensiones de Medios Cifrados (EME) permite a los sitios web consultar el soporte de sistemas de claves DRM sin permiso del usuario. Las respuestas revelan informacion especifica del dispositivo: sistemas de claves soportados, niveles de seguridad y capacidades de codecs. Estas senales varian por plataforma y no cambian entre sesiones.

La solucion de BotBrowser

BotBrowser gestiona las senales relacionadas con DRM a traves de su sistema de perfiles. Cuando se carga un perfil, todas las respuestas EME se alinean con la plataforma objetivo y configuracion del navegador del perfil.

Configuracion DRM basada en perfil

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

El perfil controla que sistemas de claves aparecen como soportados, que niveles de robustez se reportan y como el navegador responde a las consultas de capacidad.

Widevine en modo headless

Los navegadores headless estandar a menudo carecen de soporte Widevine, lo cual es en si mismo una senal fuerte. BotBrowser mantiene la disponibilidad de Widevine en modo headless, de modo que las consultas de capacidad DRM devuelven los mismos resultados con o sin ventana visible.

Consistencia entre plataformas

Un perfil de Windows Chrome ejecutandose en un servidor Linux reporta caracteristicas DRM apropiadas para Windows, incluyendo el nivel de seguridad correcto, valores de robustez y capacidades de codecs.

Verificacion

Despues de cargar un perfil, verifica las senales 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('Senales DRM:', JSON.stringify(drmInfo, null, 2));

Verificaciones clave:

  1. La disponibilidad de Widevine coincide con la plataforma del perfil
  2. Los niveles de robustez son consistentes entre modo headless y con ventana
  3. Diferentes perfiles producen respuestas distintas y apropiadas para la plataforma

Primeros pasos

  1. Descarga BotBrowser desde GitHub
  2. Carga un perfil con --bot-profile para aplicar proteccion de senales DRM
  3. Verifica que las respuestas EME coincidan con la plataforma objetivo del perfil
  4. Consulta la documentacion para detalles de configuracion de perfiles
#drm#widevine#eme#fingerprinting#privacy#encrypted-media