Categoría: Hardware / Renderizado de Bajo Nivel
1. Descripción
El fingerprinting de GPU explota el hecho de que el renderizado gráfico no es bit-idéntico entre diferentes hardware. El mismo código JavaScript produce diferentes salidas de píxeles en diferentes GPUs debido a:
- Microarquitectura GPU (cantidad de ALUs, unidades de rasterización, TMUs, ROPs)
- Versión del controlador y optimizaciones del compilador de shaders
- Precisión de punto flotante en cálculos de shaders
- Algoritmos de anti-aliasing y su implementación
- Orden de renderizado subpíxel (RGB vs BGR)
- Matrices de conversión de espacio de color
- Soporte de compresión de texturas
- Tamaño máximo de textura y otros límites hardware
2. Vectores
2.1 Fingerprinting de Canvas
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
ctx.font = '14px Arial'
ctx.fillStyle = '#f60'
ctx.fillRect(125, 1, 62, 20)
ctx.fillStyle = '#069'
ctx.fillText('Test string', 2, 15)
const hash = md5(canvas.toDataURL())
Entropía: ~5-7 bits (32-128 dispositivos distinguibles)
Estabilidad: Alta — estable entre reinicios del navegador, moderada entre actualizaciones del navegador
2.2 Fingerprinting de WebGL
const gl = canvas.getContext('webgl')
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
// Modelo exacto de GPU:
const renderer = debugInfo.UNMASKED_RENDERER_WEBGL
// "NVIDIA GeForce RTX 3080/PCIe/SSE2"
const vendor = debugInfo.UNMASKED_VENDOR_WEBGL
// "NVIDIA Corporation"
Señales adicionales de WebGL:
- Hash de renderizado de escena WebGL (renderizar una escena 3D, hashear píxeles)
- Precisión de shader (soporte highp, mediump, lowp y precisión)
MAX_TEXTURE_SIZE,MAX_VERTEX_ATTRIBS,MAX_VIEWPORT_DIMS(50+ parámetros numéricos)- Lista de extensiones WebGL
Entropía: ~20-25 bits (renderizador + extensiones + límites)
Estabilidad: Muy Alta — cambia solo con actualizaciones del controlador GPU
2.3 Fingerprinting de WebGPU
const adapter = await navigator.gpu.requestAdapter()
const info = await adapter.requestAdapterInfo()
// { vendor: "nvidia", architecture: "ampere", device: "GA102", driver: "535.129.03", backend: "Vulkan" }
// adapter.limits contiene 50+ capacidades numéricas
// adapter.features contiene ~30+ flags de características
Entropía: ~30+ bits (información del adaptador + límites + características)
Estabilidad: Muy Alta — bloqueado al hardware
3. Fortalezas del Atacante
| Fortaleza | Explicación |
|---|---|
| Bloqueado al hardware | El fingerprint GPU no puede cambiar sin reemplazar el hardware |
| Multi-navegador | La misma GPU produce fingerprints similares en Chrome, Firefox, Edge |
| Pasivo | No requiere interacción del usuario, se ejecuta en segundo plano |
| Sin dependencia de red | El renderizado es local, no se necesita petición |
| Preciso | El modelo exacto de GPU es altamente identificador (GPUs raras son muy únicas) |
| Consistente | Misma versión de controlador GPU → misma salida de renderizado cada vez |
4. Debilidades del Atacante
| Debilidad | Explicación | Explotable? |
|---|---|---|
| Bloqueable | WebGL/WebGPU puede deshabilitarse en la configuración del navegador | Sí — pero detectable |
| Inyección de ruido | CanvasBlocker añade píxeles aleatorios a la salida del canvas, rompiendo el fingerprint | Sí — pero detectable |
| Actualizaciones de controladores | Nuevos controladores cambian la salida de renderizado, invalidando fingerprints almacenados | Ocasional |
| Tor Browser | El renderizado por software normaliza toda la salida GPU | Sí — pero con gran costo de rendimiento |
| Identifica GPU, no usuario | Todos los usuarios con el mismo modelo de GPU se ven idénticos | Solo para GPUs comunes |
5. Detección de Manipulación
Los atacantes pueden detectar la falsificación de canvas/WebGL mediante:
| Técnica | Cómo Funciona |
|---|---|
| Comparación de lectura secuencial | Leer canvas 2-3 veces, comparar hashes. La inyección de ruido produce diferentes hashes. |
| Análisis estadístico | La salida de hardware real tiene patrones de ruido característicos; el ruido inyectado se ve diferente |
| Correlación entre APIs | El hash de canvas + renderizador WebGL + AudioContext deberían ser consistentes |
| Presencia de características | WEBGL_debug_renderer_info devolviendo null es sospechoso |
| Información de WebGPU faltante | Si WebGL funciona pero WebGPU no, eso es inusual |
6. Mitigaciones para Obscura
6.1 Lo Que Obscura Puede Hacer
| Mitigación | Efectividad | Detectabilidad | Implementación |
|---|---|---|---|
Bloquear WEBGL_debug_renderer_info |
Alta (oculta modelo GPU) | Media | Inyección JS: return null |
| Bloquear información de WebGPU adapter | Alta (oculta info GPU) | Media | Inyección JS: requestAdapter → null |
| Inyección de ruido en Canvas | Media | Alta | Inyección JS: algoritmo CanvasBlocker |
| Bloquear WebGL por completo | Muy Alta | Alta | Inyección JS: getContext → null |
| Bloquear WebGPU por completo | Muy Alta | Alta | Inyección JS: requestAdapter → null |
| Redondear dimensiones de canvas | Baja | Media | Inyección JS: Math.round() |
6.2 Lo Que Obscura No Puede Hacer
| No Puede | Por Qué |
|---|---|
| Cambiar el renderizado GPU real | El renderizado ocurre en el hardware GPU local |
| Falsificar el hash de renderizado de escena WebGL | La salida de renderizado depende del hardware |
| Falsificar los límites de WebGPU | Los límites se consultan del adaptador físico |
| Normalizar la salida de canvas entre usuarios | Requiere GPU por software (SwiftShader) — solo Tor Browser |
6.3 Enfoque Recomendado
1. Bloquear WEBGL_debug_renderer_info (oculta modelo GPU — alto valor, bajo costo)
2. Bloquear WebGPU adapterInfo (oculta info GPU de próxima gen — alto valor, bajo costo)
3. Inyectar ruido en canvas (rompe fingerprint de canvas — valor medio, costo medio)
4. Si el dispositivo es potente: sugerir Tor (protección completa — alto valor, alto costo para el usuario)
7. Referencias de Investigación
- Mowery, K. & Shacham, H. (2012). "Pixel Perfect: Fingerprinting Canvas in HTML5." WOOT 2012.
- Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
- Cao, Y. et al. (2017). "WebRTC and Canvas-based Device Fingerprinting." PET Symposium 2017.
- FingerprintJS (2026). "Canvas Fingerprinting: What It Is and How It Works." fingerprintjs.com/blog.