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).