Entraste en modo incógnito. Borraste tus cookies. Y aun así el sitio te trató como al mismo visitante que vio hace diez minutos. Una de las razones más silenciosas de que esto siga ocurriendo está en una esquina de tu pantalla: el indicador de batería.
Durante casi toda la última década, cualquier sitio web podía preguntarle a tu navegador exactamente cuánta carga le quedaba a tu portátil, con un número sospechosamente preciso, y cuántos segundos de vida le quedaban. Lee esos números en dos sitios distintos con pocos instantes de diferencia y tienes suficiente para concluir que los dos visitantes son una misma persona. El panel de esta página le hace a tu navegador esa misma pregunta ahora mismo y te muestra la respuesta.
Los cuatro números que entrega la Battery Status API
Llama a navigator.getBattery() y obtienes un objeto con cuatro campos: level de 0 a 1, charging verdadero o falso, chargingTime en segundos hasta la carga completa y dischargingTime en segundos hasta agotarse. Ningún número de serie, nada que parezca un identificador. Justo por eso entró en los navegadores a principios de la década de 2010 casi sin oposición. ¿Qué podría llegar a revelar un porcentaje de batería?
Entropía, resulta ser. dischargingTime por sí solo cae en algún punto de un rango de miles de segundos de amplitud. Combínalo con un level que en su día se reportaba con muchos decimales y tienes un valor que muy pocas otras personas conectadas comparten en ese segundo exacto. No es un nombre. Es un número lo bastante raro como para funcionar como uno durante un rato.
Cómo dos sitios se encuentran gracias a él
El mecanismo lo detallaron en 2015 Olejnik, Acar, Castelluccia y Díaz en un artículo titulado The leaking battery. La lectura es una clave de reidentificación con fecha de caducidad. El sitio A registra tu level y tu dischargingTime; un instante después el sitio B registra casi la misma pareja; ambos pueden unirse sin que medie ninguna cookie. Sobrevive a un borrado de cookies y a un cambio a navegación privada, porque nada de esto se almacena en el navegador. Se lee directamente del hardware cada vez que lo pides.
La ventana es corta. Los números se desplazan a medida que tu batería se descarga, así que la coincidencia solo se mantiene durante algo así como treinta segundos a un par de minutos. Treinta segundos bastan de sobra para coser dos cargas de página en un mismo visitante. Un año después del artículo, un rastreo de Princeton sobre un millón de sitios encontró scripts de rastreo reales, ya en circulación, que leían la API, así que el ataque ya había salido del laboratorio.
El truco de la capacidad: leer los mAh de la nada
Esta es la parte que los otros análisis pasan por alto. El sistema operativo calcula level como charge_now / charge_full, dos enteros en las unidades propias de la batería, microamperios-hora en un portátil Linux típico. Así que la fracción que reporta tu navegador no es arbitraria. Es un cociente cuyo denominador es la capacidad de carga completa de tu batería. Firefox en Linux llegó a devolver el cociente en bruto con toda su precisión, algo como 0.9301926, y a partir de una lectura tan exacta puedes recorrer la fracción a la inversa y recuperar el denominador que hay debajo.
Ese denominador es tu capacidad en mAh, y es un identificador mejor de lo que el nivel llegó a ser jamás, porque la capacidad de carga completa de una batería desciende poco a poco a medida que envejece. Es específico de tu celda física, en su punto actual de desgaste. El Chromium moderno cerró en gran medida esta vía redondeando level a un porcentaje entero, así que el único denominador que puedes volver a extraer es 100 y la capacidad real desaparece. El panel de esta página ejecuta la reconstrucción sobre tu lectura en directo, y casi con toda seguridad reportará el valor como cuantizado. Ese fallo es la mitigación cumpliendo su función.
Por qué Firefox simplemente eliminó todo el asunto
Mozilla no parcheó la API de batería. La eliminó, en Firefox 52 en 2017, y toda la superficie de navigator.getBattery desapareció. Apple, para empezar, nunca la incluyó en Safari. Es una respuesta contundente para una funcionalidad web, y te dice cómo terminó viendo el mundo de los estándares esta función en concreto: un vector de rastreo sin ninguna ventaja para la persona rastreada. Chrome y Edge todavía la mantienen, ahora restringida a páginas seguras de nivel superior y redondeada a la baja, y la propia especificación ahora abre con una advertencia de privacidad que no tenía en 2012. Si estás leyendo esto en Firefox o Safari, la prueba de arriba sale limpia, porque no hay nada ahí que responder. La misma división se da en los teléfonos: Chrome en Android también expone la lectura, mientras que Safari en iOS y Firefox para Android no revelan nada.
Nunca fue solo la batería
La batería es una línea de una lista más larga que tu navegador le recita a cualquier sitio que lo pida, sin ninguna solicitud de permiso por ningún lado. navigator.hardwareConcurrency revela el número de núcleos lógicos de tu CPU. navigator.deviceMemory reporta tu RAM, redondeada a una potencia de dos, durante mucho tiempo limitada a 8 en el escritorio, aunque el Chrome actual ya entrega también 16 y 32. maxTouchPoints indica si tienes una pantalla táctil. El adaptador de WebGPU entrega el fabricante y la arquitectura de tu GPU en cadenas de texto planas. Ninguno de estos te identifica por sí solo. Apilados juntos, reducen la multitud en la que te escondes a un puñado de personas, del mismo modo que lo hacen el renderizado de canvas y el procesamiento de audio en nuestros análisis de fingerprinting de canvas y fingerprinting de audio. El panel de Hardware del escaneo completo del navegador muestra los valores exactos que tu navegador está entregando ahora mismo.
Qué hacer realmente al respecto
- Comprueba lo que filtras antes de dar por hecho que estás protegido. Ejecuta el escaneo del navegador y lee los paneles de batería y de hardware. Suponer lo que filtras no es lo mismo que mirarlo.
- El modo incógnito no ayuda aquí. La revinculación pasa por el hardware, no por las cookies, así que una ventana privada con la misma batería y la misma GPU es el mismo visitante. Conviene recordarlo allí donde estuvieras contando con él.
- Firefox y Safari ya cierran el vector de la batería. Si usas Chrome, mantenerte al día es lo que conserva el nivel cuantizado en lugar de en bruto.
- Si manejas varias identidades, haz que toda la historia del hardware sea coherente. Falsear un valor mientras los demás no concuerdan es justo la contradicción que los sistemas de fingerprinting buscan. Incogniton construye cada perfil de modo que la batería, la GPU, los núcleos y la memoria que presenta encajen como una única máquina creíble en lugar de un montón de contradicciones.
El indicador de batería es algo muy pequeño para haber revelado tanto. Apunta tu propio navegador al escaneo y comprueba qué sigue diciendo el tuyo.