Saltar al contenido principal
es/blog/obscura/research/uncontrollable/gpu-rendering/

obscura/research/uncontrollable/gpu-rendering

5 min de lectura

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.