Un gruppo di ricercatori provenienti da diverse università americane, israeliane e australiane ha sviluppato tre attacchi funzionanti nei web browser per estrarre informazioni sul contenuto della cache della CPU. Un metodo funziona in browser senza JavaScript, mentre gli altri due bypassano i metodi esistenti di protezione contro gli attacchi tramite canali laterali, inclusi quelli utilizzati in Tor browser e DeterFox. Il codice per dimostrare gli attacchi, così come i 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 del tempo di accesso ad essi durante il riempimento ripetuto. Per eludere i meccanismi di protezione presenti nei browser che ostacolano la misurazione precisa del tempo, in due varianti l'attacco effettua una richiesta a un server DNS o WebSocket controllato dall'attaccante, sul quale viene registrato il log del tempo di arrivo delle richieste. In una variante, il tempo di risposta DNS fisso viene utilizzato come riferimento temporale.
Le misurazioni effettuate utilizzando 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 una precisione del 98% nel miglior scenario possibile (in media 80-90%). I metodi di attacco sono stati testati su diverse piattaforme hardware (Intel, AMD Ryzen, Apple M1, Samsung Exynos) e si sono dimostrati universali.

Nella prima variante dell'attacco "DNS Racing", viene utilizzata l'implementazione classica del metodo Prime+Probe, che utilizza array JavaScript. Le differenze riguardano l'uso di un timer esterno basato su DNS e un gestore onerror, che si attiva quando si tenta di caricare un'immagine da un dominio inesistente. Il timer esterno consente di effettuare l'attacco Prime+Probe nei browser che limitano o disattivano completamente l'accesso ai timer JavaScript.
Per un server DNS situato nella stessa rete Ethernet, la precisione del timer è stimata a circa 2 ms, sufficiente per condurre un attacco tramite canali esterni (a titolo di confronto, la precisione del timer JavaScript standard nel Tor Browser è ridotta a 100 ms). Per l'attacco non è necessario controllare il server DNS, poiché il tempo di esecuzione dell'operazione è calibrato in modo che il tempo di risposta del DNS serva da indicatore di una conclusione anticipata del controllo (a seconda che il gestore onerror si attivi prima o dopo, si deduce la velocità dell'operazione di verifica con la cache).
Il secondo metodo di attacco «String and Sock» mira a eludere i metodi di protezione che limitano l'uso a basso livello degli array in JavaScript. Invece di utilizzare array, «String and Sock» impiega operazioni con stringhe molto grandi, la cui dimensione viene scelta in modo che la variabile copra l'intero cache LLC (Last level cache). Successivamente, tramite la funzione indexOf(), viene cercata una piccola sottostringa che non è presente nella stringa originale, cioè l'operazione di ricerca comporta la scansione dell'intera stringa. Poiché la dimensione della stringa corrisponde a quella della cache LLC, la scansione consente di eseguire un'operazione di controllo della cache senza manipolare gli array. Per misurare le latenze, invece del DNS, viene utilizzato un server WebSocket controllato dall'attaccante: vengono inviati richieste prima e dopo il completamento dell'operazione di ricerca nella stringa, sulla base delle quali server viene calcolata la latenza utilizzata per analizzare il contenuto della cache.
La terza variante dell'attacco "CSS PP0" è realizzata tramite 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 viene creato un insieme di selettori CSS che eseguono ricerche in base a un modello. La stringa iniziale di grandi dimensioni, che riempie la cache, è impostata creando un tag div con un nome di classe molto lungo. All'interno viene collocato un insieme di altri div con i propri identificatori. Per ciascuno di questi div nidificati viene definito uno stile con un selettore che esegue la ricerca di una sottostringa. Durante il rendering della pagina, il browser tenta inizialmente di elaborare i div interni, il che porta all'esecuzione dell'operazione di ricerca nella grande stringa. La ricerca viene eseguita su un modello noto per essere assente, portando a un'iterazione dell'intera stringa, dopo di che scatta la condizione "not" e si tenta di caricare un'immagine di sfondo che si riferisce a 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 su un server DNS dell'attaccante, che può misurare i ritardi nella ricezione delle richieste. Per tutte le richieste, il server DNS restituisce NXDOMAIN e tiene un log dell'orario esatto delle richieste. Di conseguenza, l'elaborazione di un set di div sul server DNS dell'attaccante produce una serie di richieste, i cui ritardi sono correlati con il risultato del controllo del contenuto della cache.

Fonte: opennet.ru
