En 2018, rastrear a un visitante de un sitio web parecía un problema de JavaScript: un script dispara una baliza al cargar la página o al hacer clic, y si el scripting está bloqueado, deshabilitado o filtrado, todo el canal se apaga. Crooked Style Sheets, una prueba de concepto del desarrollador jbtronics, demostró que se puede rastrear una página sin JavaScript alguno, usando únicamente el propio motor CSS del navegador.

Los enfoques obvios se apoyaban todos en scripts o píxeles: un fragmento de rastreo que llama a casa, una etiqueta de imagen, un SDK de analítica de terceros. Todos ellos son una clase de solicitud visible que los bloqueadores de scripts y los filtros de anuncios fueron creados para detectar, y ninguno se dispara en una página donde el scripting nunca se ejecuta.

El truco estaba en cuándo los navegadores obtienen los recursos url() de CSS: solo cuando un selector coincide. Un estilo :active de un enlace con content: url(track.php?action=link2_clicked) hace, por tanto, que el navegador solicite esa URL exactamente cuando se hace clic en el enlace. El mismo principio abarcaba el pasar el cursor por encima, las casillas marcadas, el texto que coincide con un patrón mediante :valid, la detección del navegador mediante @supports y la detección de fuentes instaladas mediante una reserva de @font-face que se carga cuando falta Calibri. Cada solicitud llegaba a una página PHP que registraba la marca de tiempo y la acción codificada en su URL.

Como las solicitudes son cargas de recursos ordinarias impulsadas por CSS, no llevan ninguna llamada de script que un bloqueador pueda identificar, y las hojas de estilo siguen aplicándose cuando JavaScript está desactivado. La publicación en Hacker News de enero de 2018 atrajo 532 puntos y 175 comentarios, y el repositorio había crecido hasta aproximadamente 3,3 mil estrellas y 132 bifurcaciones para 2026. La defensa que provocó incluyó la extensión CSS Exfil Protection, y el autor sostuvo que la solución robusta era que los navegadores obtuvieran el contenido externo referenciado por CSS al cargar la página en lugar de bajo demanda, un cambio que reconoció que tendría un costo en el rendimiento.

Tratar las obtenciones perezosas de recursos CSS del navegador como balizas de eventos: los selectores que coinciden solo al hacer clic, al pasar el cursor o ante una fuente faltante disparan una solicitud que el servidor puede registrar

Los navegadores deciden cuándo obtener el contenido de url() de CSS, de modo que un selector que coincide produce una solicitud de red sin ninguna llamada de JavaScript que un bloqueador de anuncios pueda atacar.

Las solicitudes parecen cargas ordinarias de imágenes o fuentes, indistinguibles de los recursos legítimos en los registros y en la mayoría de las herramientas de bloqueo.

Los selectores dependientes del estado codifican el significado en la propia URL: la ruta del recurso nombra el evento, y el servidor solo registra las marcas de tiempo de llegada.

El CSS sigue aplicándose en páginas donde el scripting está deshabilitado, cerrando la brecha que hacía que la ausencia de JavaScript pareciera privacidad.

Los formatos declarativos siguen realizando trabajo condicional: cualquier carga de recursos dependiente del estado es una señal observable, por lo que las defensas deben tratar las solicitudes originadas en CSS como un comportamiento que vale la pena restringir

El repositorio llegó a Hacker News el 16 de enero de 2018 y atrajo 532 puntos y 175 comentarios; para el rastreo de 2026 mostraba aproximadamente 3,3 mil estrellas y 132 bifurcaciones. La demostración sembró al menos una defensa, la extensión CSS Exfil Protection enlazada desde su propio README, y el escrito del autor sostuvo que la solución duradera es que los navegadores carguen el contenido externo referenciado por CSS cuando se carga la página en lugar de cuando coincide un selector, un cambio que señaló que tendría un costo en el rendimiento. El sitio de demostración original quedó fuera de línea posteriormente, dejando las muestras de código del repositorio como el registro funcional de la técnica.

CONSULTA LAS PRUEBAS

Las fuentes

  1. CrookedStyleSheets - Webpage tracking only using CSS (and no JS) GitHub · github.com
  2. Crooked Style Sheeding - Webpage tracking using only CSS Hacker News · news.ycombinator.com ·