volver al inicio Más artículos

Fingerprinting de fuentes: tus fuentes instaladas te delatan

Generando huella digital de fuentes...

Tu lista de fuentes tardó años en formarse. El sistema operativo puso ahí unos cientos de fuentes, Office añadió las suyas, Adobe sumó más con cada aplicación, y aquella fuente display que instalaste para un proyecto en 2021 nunca se marchó. Cualquier sitio web puede leer el resultado en unos cientos de milisegundos, sin diálogo de permisos, y cuanto más ha crecido esa lista, menos probable es que la de cualquier otra persona coincida con ella.

Los navegadores nunca han dado a las webs una forma de pedir la lista de fuentes sin más, precisamente porque identifica demasiado. Resultó que daba igual. Un script puede medir las fuentes en lugar de pedirlas, sin más herramientas que una línea de texto invisible y dos lecturas de anchura. El widget de esta página ejecuta esa medición contra 175 fuentes candidatas y te enseña lo que tu navegador entrega, además de lo común que es tu conjunto concreto entre todos los que han ejecutado el análisis.

La versión corta: el fingerprinting de fuentes funciona porque las webs no pueden pedir tu lista de fuentes, así que la miden: renderizan una cadena de prueba oculta, cambian a una fuente candidata y comprueban si la anchura varía. Repite eso unos cientos de veces y el resultado es una lista lo bastante distintiva para seguirte a través de borrados de cookies, ventanas de incógnito y cambios de VPN. Bloquear el truco a medias solo le entrega al script un fingerprint más raro.

Cómo funciona el fingerprinting de fuentes: el truco de medir

Aquí va la técnica entera. El script crea un <span> invisible con una cadena sin sentido, mmmmmmmmmmlli, a 72 píxeles, y le pregunta al navegador qué anchura ha salido en una familia genérica como monospace. Luego cambia la familia a "Segoe UI", monospace y vuelve a leer la anchura. Si Segoe UI está instalada, el navegador la renderiza y la anchura se mueve. Si no lo está, entra en juego la fuente de respaldo y el número se queda quieto. Una fuente candidata, dos lecturas de anchura, ninguna API de por medio.

La cadena tampoco es casual: las emes y las eles son, en la mayoría de las tipografías, la minúscula más ancha y la más estrecha, así que sustituir una fuente por otra desplaza la anchura total todo lo posible. Míralo ocurrir en tu propia máquina:

La prueba de anchura, en vivo en tu navegador
font-family: monospace
mmmmmmmmmmlli
font-family: "Segoe UI", monospace
mmmmmmmmmmlli
Midiendo…
Leyendo las dos anchuras en tu navegador.
Dos lecturas de anchura responden a «¿tienes esta fuente?» para una candidata. El widget de esta página lo repite 175 veces; un script de rastreo hace lo mismo. Mediciones tomadas a 72 px, el tamaño que usan los scripts reales para amplificar las diferencias.

Hay formas más pulcras de obtener la misma respuesta. document.fonts.check() la devuelve como un booleano en una sola llamada —en los navegadores Chromium, gracias a una peculiaridad que incumple la especificación; Firefox y Safari contestan que sí a cualquier fuente que les nombres— y medir texto en un canvas evita tocar el DOM por completo. La plataforma web tiene exactamente una API educada en este terreno, queryLocalFonts(), que devuelve nombres reales de fuentes e incluso los propios archivos, previa aprobación de un diálogo de permisos por parte del usuario. Ningún rastreador te ha enseñado jamás ese diálogo.

Toda esta familia de técnicas responde al nombre de enumeración de fuentes (font enumeration), y los rastreadores no son sus únicos clientes. Los sistemas antifraude y de detección de bots ejecutan el mismo sondeo para comprobar que un dispositivo es lo que dice ser, y por eso el resultado te sigue hasta sitios a los que un simple anunciante nunca llegaría: procesos de pago, puntuación de riesgo al iniciar sesión, revisiones de cuenta.

Qué revelan tus fuentes instaladas

Lo que hace valiosa la lista no es lo larga que sea, sino lo que confiesa cada entrada. Las fuentes llegan a tu máquina como efectos secundarios de todo lo demás que instalas. Segoe UI significa Windows. Helvetica Neue significa Apple. DejaVu Sans significa Linux. Bahnschrift acota Windows a la versión 10 o posterior, y Segoe UI Variable dice 11. Minion Pro o Myriad Pro significan que por esta máquina ha pasado software de Adobe. Un Windows configurado para chino lleva fuentes que uno estadounidense no tiene ningún motivo para tener. Tus fuentes son un registro de lo que usas y de, más o menos, cuándo lo montaste:

Lo que confiesa tu lista de fuentes
Sistema operativo
Segoe UI viene con Windows
Helvetica Neue viene con macOS e iOS
DejaVu Sans viene con los escritorios Linux
Generación del SO
Bahnschrift añadida en Windows 10, ausente antes
Segoe UI Variable añadida en Windows 11
Software instalado
Minion Pro la instalan las aplicaciones de Adobe
Myriad Pro la instalan las aplicaciones de Adobe
Sondeado en vivo en tu navegador ahora mismo, con el mismo truco de anchura que usa un rastreador. Las filas que se iluminan esbozan tu máquina: qué sistema operativo, más o menos cómo de reciente, y parte de lo que tienes instalado. No ha hecho falta ningún diálogo de permisos.

Es la misma clase de fuga que recorrimos en Un navegador, cinco declaraciones de sistema operativo: las etiquetas que reporta un navegador se pueden editar, pero la máquina que hay detrás sigue comportándose como ella misma. Un User-Agent de macOS falsificado sentado sobre una lista de fuentes llena de Segoe y Calibri es una contradicción que cualquier script detecta en milisegundos.

En el estudio Panopticlick de la EFF, la lista de fuentes —recogida entonces mediante Flash y Java— aportaba 13,9 bits de información identificativa, más que cualquier otra señal de fingerprinting del navegador medida, salvo la lista de plugins. Desde entonces los navegadores han neutralizado los plugins —navigator.plugins reporta en todas partes la misma lista corta de visores de PDF, o directamente nada—, mientras que las fuentes siguen siendo exactamente igual de medibles que en 2010. Además, la lista se filtra dos veces: una como lista y otra a través del fingerprinting de canvas, donde las fuentes disponibles para el renderizador ayudan a decidir los píxeles exactos que produce un dibujo en canvas.

Y la lista es paciente. No cambia cuando borras las cookies, no cambia en una ventana de incógnito y tu VPN le trae absolutamente sin cuidado. Cambia cuando instalas o desinstalas software, algo que para la mayoría de la gente ocurre unas pocas veces al año. Para lo que suele durar un identificador de rastreo, eso es mucha vida útil.

¿Se puede evitar el fingerprinting de fuentes? La trampa del bloqueo

Hay extensiones que prometen frenar la medición, ya sea bloqueando los sondeos o alimentándolos con ruido. El problema es el mismo que caza las falsificaciones a medias en todo este sitio: la defensa es más rara que aquello que esconde.

Un Chrome de escritorio en Windows que no reporta más que un puñado de fuentes «web-safe» no es anónimo; es peculiar, y de lo peculiar vive el fingerprinting. Los aleatorizadores son peores. Una lista de fuentes real se mantiene estable durante meses, así que una lista que muta entre visitas te señala como una de las pocas personas que usan exactamente esa extensión. Y las extensiones que falsean los números lo hacen sobrescribiendo justo las funciones con las que una página mide. Eso fabrica un segundo problema: una función nativa sobrescrita deja de reportar [native code] cuando la inspeccionan, el mismo delator que expone a los plugins de sigilo.

Los navegadores que se defienden de esto en serio lo hacen por entero. Tor Browser incluye sus propias fuentes y restringe a las webs a esa lista fija, de modo que todos los usuarios de Tor presentan más o menos el mismo conjunto reducido. Funciona, y le dice a cada sitio que usas Tor. Brave, en cambio, difumina la lista («farbling», lo llaman): por sitio y por sesión enseña a los rastreadores las fuentes de tu sistema operativo más una selección aleatoria de las que tienes instaladas, de modo que la lista que un rastreador recoge hoy discrepa discretamente de la de mañana sin parecer nunca imposible. Ambos enfoques funcionan porque el navegador entero se construyó alrededor de ellos, y no como un parche que pelea contra el navegador en el que vive.

Qué hacer en la práctica

  1. Mira primero tu propia lista. El widget de esta página ya ha medido tu navegador. Despliega la lista de fuentes para ver lo que ve cualquier web y comprueba lo común que es tu conjunto exacto entre todos los análisis que ha ejecutado este sitio. Un conjunto único en el mundo conviene conocerlo antes de que importe.
  2. No lo parchees por piezas. Una extensión que bloquea fuentes sobre un navegador por lo demás normal te hace más raro, no más seguro. Si quieres esta defensa en tu navegación diaria, usa un navegador diseñado alrededor de ella, Brave o Tor, y asume sus contrapartidas a sabiendas.
  3. Si gestionas varias identidades, la lista de fuentes es parte de la identidad. Cada perfil necesita fuentes que concuerden con el sistema operativo que afirma tener, sesión tras sesión. Incogniton da a cada perfil su propia lista de fuentes y la mantiene estable de una sesión a otra, de modo que la biografía que lee un sitio pertenece al perfil, no a tu máquina.

Tus fuentes llevan respondiendo preguntas sobre ti desde que tienes esta máquina. El widget de arriba muestra lo que han estado contando, y el análisis completo del navegador muestra lo que el resto de tu navegador añade junto a ellas.

Logotipo de Incogniton

Mejora tu privacidad

Flecha