Come un bug del driver grafico sul Samsung Galaxy S6 ha trapelato i dati della scheda Google Chrome

Alla fine di marzo, una start-up con sede nel Regno Unito specializzata nel test dell'affidabilità della GPU ci ha contattato con un bug GPU scoperto che fa riavviare il Samsung Galaxy S9 / S9 + di Qualcomm Snapdragon 845 quando si visita una pagina web. L'azienda, denominata GraphicsFuzz, ha lavorato con noi per segnalare il problema a Qualcomm e Samsung. Alcuni dei nostri lettori erano interessati a sapere come un'azienda come GraphicsFuzz è in grado di trovare queste vulnerabilità, quindi abbiamo collaborato con l'azienda per mostrare come hanno scoperto una vulnerabilità della GPU più vecchia. Questa vulnerabilità già patchata ha permesso a un utente malintenzionato di "spiare" in remoto i contenuti delle schede del browser Google Chrome sul Samsung Galaxy S6.

Questo utente stava visualizzando il sito Web della propria banca prima di visitare la pagina Web dannosa. I contenuti sono stati acquisiti e caricati su un server remoto. Fonte: GraphicsFuzz.

Come GraphicsFuzz trova i bug della GPU

Un driver grafico funziona prendendo un programma shader e inviandolo alla GPU per essere eseguito e quindi renderizzare l'immagine. Prima di inviare lo shader alla GPU, il driver grafico lo traduce in un modulo comprensibile dalla GPU; una traduzione errata può causare errori di rendering, crash del programma o del dispositivo, immagini errate e persino problemi di sicurezza. GraphicsFuzz ha una suite di test automatizzata che consente loro di trovare questi bug sulla base di una serie di shader di riferimento. Quando un utente esegue il test, tutte le immagini risultanti dovrebbero avere lo stesso aspetto. Qualsiasi immagine che sembra diversa significa che c'era un bug.

Risultati di numerosi dispositivi popolari che eseguono la suite di test GraphicsFuzz. Samsung Galaxy S6, Samsung Galaxy S7 e Samsung Galaxy S8 sono inclusi in questi grafici. Fonte: GraphicsFuzz.

Per il Samsung Galaxy S6, GraphicsFuzz ha scoperto che le immagini in una delle file mostravano immagini che avrebbero dovuto essere in un'altra tabella. Ciò significa che le immagini dei test precedenti perdevano nei test successivi. Il team ha quindi rieseguito la suite di test in Google Chrome e ha scoperto che parti della pagina Web stavano comparendo nell'immagine. Inoltre, hanno scoperto che l'apertura di un'altra scheda faceva sì che l'immagine mostrasse parti di altre schede. In sostanza, questo bug ha permesso a una scheda di Google Chrome di perdere informazioni su un'altra scheda di Chrome! Il team dietro GraphicsFuzz non stava cercando intenzionalmente bug di sicurezza, ma alla fine hanno trovato uno come risultato dei loro test. (Va notato che il team ha riprodotto il bug sul browser Samsung di serie sul Galaxy S6 e su Mozilla Firefox.)

Come funziona il bug

Immagine utilizzata per attivare il bug di lunga durata sul Samsung Galaxy S6. Fonte: GraphicsFuzz.

La pagina Web "dannosa" creata da GraphicsFuzz utilizza WebGL per tentare di disegnare una scena spaziale all'interno di una tela come mostrato sopra. Il colore di ciascun pixel è determinato da uno shader di frammenti, un programma fornito dalla pagina Web da eseguire sulla GPU. Il framework GraphicsFuzz ha modificato lo shader di frammenti che lo ha causato per molto tempo. Quando uno shader viene eseguito troppo a lungo, il browser o il sistema operativo in genere interrompe il rendering. Tuttavia, mentre la GPU ha interrotto il rendering dopo aver disegnato alcuni pixel, il driver GPU non ha segnalato questo a Google Chrome. (Se dai un'occhiata all'immagine nella parte superiore dell'articolo che mostra la memoria video di immondizia, puoi effettivamente vedere parti della scena spaziale in alto a sinistra.) Ciò significa che i pixel che sono stati renderizzati prima dell'interruzione non vengono toccati, il che significa che l'immagine di rendering finale è principalmente memoria video spazzatura. Poiché la memoria video viene continuamente utilizzata per il rendering di altre pagine Web, i dati di "immondizia" in realtà contengono rendering precedenti di altre pagine Web. Pertanto, altre pagine Web vengono visualizzate sulla pagina Web "dannosa". Fondamentalmente, WebGL consente alla pagina Web di catturare i contenuti di tutto ciò che viene reso; questa immagine viene quindi caricata su un server remoto.

Diagramma che spiega il bug di lunga durata della GPU che causa la "perdita" dei dati della scheda Chrome. Fonte: GraphicsFuzz.

Google Chrome utilizza più processi, quindi diverse schede sono spesso isolate, il che rende questo exploit impossibile in superficie. Tuttavia, Chrome interagisce con la GPU utilizzando un singolo "processo GPU", il che significa che tutte le schede condividono la stessa memoria GPU, permettendo così a questo exploit di funzionare. Il diagramma sopra mostra questo in modo più dettagliato.

Il bug è dimostrato in questo video durante i primi 22 secondi. Vengono inoltre dimostrati altri problemi di sicurezza rilevati da GraphicsFuzz.

Lezioni da imparare

Una GPU che si comporta in modo inappropriato può bypassare tutte le misure di sicurezza di Google Chrome e Android poiché WebGL consente a qualsiasi pagina Web dannosa di inviare codice alla GPU per l'esecuzione. Google non può correggere i bug della GPU poiché la società non controlla l'hardware e i driver. In questo caso, spetta al fornitore della GPU (in questo caso, ARM) correggere il bug e all'OEM i cui dispositivi sono interessati (in questo caso, Samsung) per integrare la correzione in un aggiornamento. Aggiungi operatori al mix ed è facile vedere come un bug come questo può richiedere molto tempo per essere risolto: ci sono voluti almeno 5 mesi per la maggior parte degli utenti di Samsung Galaxy S6 per ricevere la patch.

GraphicsFuzz aiuta i venditori di GPU a trovare bug difficili da rilevare come errori di compilazione errata che causano la generazione e l'esecuzione di codice errato sulla GPU. Il loro framework di test automatizzato consente loro di trovare bug come quello mostrato in questo articolo. Il loop di lunga durata causato dalla pagina Web "dannosa" ha anche dimostrato di causare problemi su altri dispositivi come l'HTC One M7 e più recentemente il Samsung Galaxy S9. GraphicsFuzz testa gli smartphone di punta e pubblica una tabella dei risultati che classifica questi dispositivi in ​​base alle loro prestazioni in un sottoinsieme dei loro test. Centinaia di arresti anomali ed errori di rendering sono stati rilevati durante i test, ma la maggior parte non viene esaminata per vedere se rappresentano una minaccia per la sicurezza. Tuttavia, come dimostrato da questo exploit, una GPU che si comporta in modo inappropriato è un rischio per la sicurezza ed è possibile che una o più vulnerabilità di sicurezza critiche siano in attesa di essere scoperte. GraphicsFuzz spera che i fornitori di GPU diano priorità al miglioramento della qualità dei driver in futuro.

Affidabilità comparativa dei driver grafici, ordinata in base al numero di problemi totali. Fonte: GraphicsFuzz.

Cronologia delle informazioni

  • Nel dicembre 2016, GraphicsFuzz ha segnalato il bug al tracker dei bug di Google Chromium perché era idoneo per il programma di ricompensa di Chrome. Dopo che GraphicsFuzz ha inviato il bug al tracker dei bug di Google Chromium, il bug è stato accettato da Google e lo ha inoltrato a ARM e Samsung per il patching.
  • Google ha inoltrato il rapporto ai contatti di ARM e Samsung.
  • Samsung ha corretto il bug in modo silenzioso e ha implementato la correzione nell'aggiornamento di Android 7.0 Nougat che è stato rilasciato tra marzo e giugno del 2017. Sebbene non esistesse CVE creato da Samsung, Google o ARM e né Samsung né ARM hanno rilasciato alcuna informazione sulla patch, si noti che GraphicsFuzz non ha segnalato il bug tramite il processo corretto.
  • Successivamente, GraphicsFuzz è stata in grado di confermare che sia Samsung che ARM avevano visto il rapporto e che ARM era in grado di risolvere il problema a causa del rapporto.
  • Nell'agosto 2017, GraphicsFuzz ha ricevuto $ 2, 000 da Google per la segnalazione di bug.
  • Nel novembre 2017, la segnalazione di bug è stata resa pubblica.