Saltar al contenido principal
es/blog/obscura/research/uncontrollable/cpu-platform/

obscura/research/uncontrollable/cpu-platform

5 min de lectura

Categoría: Hardware / Arquitectura de Procesador


1. Descripción

El fingerprinting de CPU mide características del procesador y la plataforma que se exponen a través de JavaScript y WebAssembly. Estas señales derivan de:

  • Comportamiento de la unidad de punto flotante (FPU)
  • Extensiones del conjunto de instrucciones de CPU (SIMD, AES-NI, AVX, BMI, POPCNT)
  • Jerarquía de caché y temporización
  • Resolución de performance.now() (temporizador hardware)
  • Velocidad de ejecución de WebAssembly (benchmark relativo)

2. Vectores

2.1 Fingerprinting Matemático / FPU

// Diferencias de precisión de punto flotante
function mathFingerprint() {
  const inputs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
  return inputs.map(x => {
    // Operaciones que exponen diferencias de precisión
    return Math.sin(x) * Math.cos(x) + Math.tan(x) - Math.asin(x) * Math.atan(x)
  }).join(',')
}
// Diferentes CPUs producen resultados sutilmente diferentes

Entropía: ~4-6 bits

Estabilidad: Muy Alta — el comportamiento FPU de la CPU es fijo

Mecanismo: El cumplimiento de IEEE 754 varía ligeramente entre fabricantes y modelos de CPU. Las instrucciones FMA (fused multiply-add) producen resultados diferentes que operaciones separadas de multiplicar+sumar.

2.2 Detección de Características WebAssembly

// Módulo Wasm que prueba soporte de características CPU
const wasmCode = new Uint8Array([
  0x00, 0x61, 0x73, 0x6d, // magic
  0x01, 0x00, 0x00, 0x00, // version
  // ... detección de SIMD, AES-NI mediante instrucciones wasm
])
const module = await WebAssembly.instantiate(wasmCode)
const result = module.instance.exports.test()

Características detectables:

  • SIMD (instrucciones vectoriales de 128 bits)
  • Operaciones de extensión de signo
  • Mutables globales
  • Operaciones de memoria masiva
  • Tipos de referencia
  • Tail calls
  • SIMD de ancho fijo

Entropía: ~8-12 bits (qué características están soportadas)

Estabilidad: Muy Alta — las características de CPU son fijas

2.3 Resolución de Performance.now()

// Medir resolución del temporizador
const t1 = performance.now()
const t2 = performance.now()
const resolution = t2 - t1 // Intervalo mínimo medible

Entropía: ~2-3 bits

Estabilidad: Moderada — el SO y navegador pueden cambiar la resolución

2.4 Benchmarking WebAssembly

// Benchmark de velocidad relativa de CPU
const start = performance.now()
// Ejecutar código wasm intensivo en CPU
const elapsed = performance.now() - start
// La velocidad relativa es identificadora

Entropía: ~4-8 bits

Estabilidad: Baja-Moderada — afectada por throttling de CPU, procesos en segundo plano, gestión de energía


3. Fortalezas del Atacante

Fortaleza Explicación
Bloqueado al hardware Las características de CPU no pueden cambiarse sin reemplazar el hardware
Wasm es rápido Detección de características en <1ms
Sin permisos necesarios Wasm y Math APIs no requieren consentimiento del usuario
Multi-navegador La misma CPU produce fingerprints similares entre navegadores
Pasivo No se requiere interacción del usuario

4. Debilidades del Atacante

Fortaleza Explicación
Baja entropía por vector El fingerprint matemático solo es insuficiente
El navegador reduce la precisión del temporizador La resolución de performance.now() está intencionalmente reducida
Wasm puede bloquearse La configuración del navegador puede deshabilitar WebAssembly
Varianza de benchmark El throttling de CPU hace que las mediciones sean ruidosas
Agrupa usuarios por clase de CPU Todos los usuarios con la misma CPU se ven iguales

5. Detección de Manipulación

Técnica Cómo Funciona
Comparación de resultados matemáticos Métodos Math anulados devuelven valores sospechosos
Tiempo de ejecución Wasm Wasm bloqueado es detectable (falla la instanciación)
Resolución del temporizador Resolución inusualmente redonda sugiere anulación

6. Mitigaciones para Obscura

6.1 Lo Que Obscura Puede Hacer

Mitigación Efectividad Detectabilidad Implementación
Anular precisión de performance.now() Baja Baja Redondear a 100ms
Bloquear Wasm por completo Alta Media JS: WebAssembly → undefined
Anular hardwareConcurrency Alta Baja Inyección JS (ya en lista controlable)
Anular deviceMemory Alta Baja Inyección JS (ya en lista controlable)

6.2 Lo Que Obscura No Puede Hacer

No Puede Por Qué
Cambiar el comportamiento FPU El hardware CPU ejecuta instrucciones directamente
Prevenir la detección de CPU mediante Wasm Wasm se ejecuta de forma nativa, el proxy no puede interceptar
Normalizar la velocidad de ejecución La velocidad de CPU es física
Eliminar canales laterales de temporización Cualquier ejecución JS revela temporización

6.3 Enfoque Recomendado

1. Anular hardwareConcurrency + deviceMemory  (ya planeado)
2. Anular precisión de performance.now()       (bajo esfuerzo, beneficio parcial)
3. Aceptar detección matemática FPU + Wasm CPU (baja entropía individual)

7. Referencias de Investigación

  • Mowery, K. et al. (2011). "Are These Your Keys? Using Cryptographic Fingerprints to Detect Malicious Applets." IEEE S&P 2011.
  • Mulazzani, M. et al. (2013). "Fast and Reliable Browser Fingerprinting." ACSAC 2013.
  • Olejnik, L. et al. (2015). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014 (sección de temporización de CPU).