Cadenas de renderizador WebGL y señales de hardware: cuánto dice tu GPU de ti

El hardware sobre el que funciona un navegador se filtra a la página de varias formas pequeñas. Ninguna nombra el equipo, pero juntas lo describen con la precisión suficiente para distinguirlo de la mayoría de los demás.
La cadena del renderizador
WebGL expone una extensión llamada WEBGL_debug_renderer_info con dos valores: el fabricante sin enmascarar y el renderizador sin enmascarar. En Windows con Chromium, el renderizador suele leerse algo así: ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11). Esa sola línea da el fabricante de la GPU, el modelo exacto, su id de dispositivo PCI, la API gráfica y el modelo de shaders, que además es una pista fuerte sobre el sistema operativo, porque esa cadena solo existe en Windows.
Firefox y Safari han enmascarado o generalizado en distintos momentos esta cadena; Chromium la expone. Un navegador que la enmascara devuelve un valor genérico, y un diagnóstico muestra «información del renderizador enmascarada» en lugar de adivinar.
Cantidades y tamaños
navigator.hardwareConcurrency devuelve el número de hilos lógicos de CPU. navigator.deviceMemory devuelve una cantidad aproximada de RAM, redondeada a un pequeño conjunto de valores y limitada a 8 en Chromium, de modo que un equipo con 32 GB informa 8. screen.width y screen.height dan el tamaño de la pantalla, availWidth y availHeight restan la barra de tareas y devicePixelRatio revela el escalado. screen.colorDepth es casi siempre 24. navigator.maxTouchPoints separa los dispositivos táctiles del resto.
Algunos de estos tienen un poder de identificación inusualmente alto para lo inocentes que parecen. El número de hilos tiene solo un puñado de valores comunes, pero es uno de los campos a los que un conocido servicio comercial de fingerprinting da mucho peso, precisamente porque es barato y estable. El tamaño de pantalla combinado con la relación de píxeles y la altura disponible acota un equipo más que un user agent.
Dispositivos multimedia
navigator.mediaDevices.enumerateDevices() devuelve las cámaras, micrófonos y altavoces del sistema. Sin permiso, los navegadores modernos devuelven los tipos y las cantidades pero con etiquetas vacías, de modo que una página sabe «una cámara, un micrófono, una salida» y nada más. Conceder acceso a cualquier sitio revela las etiquetas. Un diagnóstico que muestra solo cantidades se comporta como lo haría una página sin permiso.
El enfoque de la coherencia, otra vez
Las señales de hardware son donde más a menudo sale mal la suplantación. Un perfil que declara un MacBook con un renderizador NVIDIA Direct3D, 24 hilos y una pantalla de 1366×768 describe una máquina que no existe. Los sitios no necesitan una base de datos para notarlo; basta con unas pocas reglas. Si un perfil cambia cualquiera de estos valores, tiene que cambiarlos todos a una combinación que un dispositivo real se venda de verdad, y mantenerla así entre visitas.
Qué comprobar
Lee la cadena del renderizador y pregúntate si concuerda con el sistema operativo del user agent. Lee el tamaño de pantalla y pregúntate si concuerda con la relación de píxeles y la altura disponible. Lee el número de hilos y la memoria y pregúntate si el par es plausible para esa GPU. Un diagnóstico los presenta uno junto a otro precisamente con ese fin; el juicio es tuyo.


