Cum o eroare a driverului grafic de pe Samsung Galaxy S6 a scurs datele din fila Google Chrome

V-ați întrebat vreodată cum sunt găsite vulnerabilitățile de securitate? Firma GraphicsFuzz din Marea Britanie explică cum au dat peste o eroare a driverului grafic pe Samsung Galaxy S6 pe care l-ar putea exploata pentru a vedea datele din filele deschise în Google Chrome.

La sfârșitul lunii martie, o firmă start-up cu sediul în Regatul Unit specializată în testarea fiabilității GPU-ului ne-a abordat cu o Bug GPU pe care l-au descoperit care provoacă Qualcomm Snapdragon 845Samsung Galaxy S9/S9+ pentru a reporni când accesați o pagină web. Firma, a sunat GraphicsFuzz, a colaborat cu noi pentru a raporta problema către Qualcomm și Samsung. Unii dintre cititorii noștri au fost interesați să afle cum le place unei companii GraphicsFuzz este capabil să găsească aceste vulnerabilități, așa că am colaborat cu compania pentru a arăta cum au descoperit o vulnerabilitate mai veche a GPU-ului. Această vulnerabilitate deja corectată a permis unui atacator să „spione” de la distanță conținutul Google Chrome filele browserului de pe Samsung Galaxy S6.

Acest utilizator a văzut site-ul web al băncii sale înainte de a vizita pagina web rău intenționată. Conținutul a fost capturat și încărcat pe un server la distanță. Sursă: GraphicsFuzz.

Cum găsește GraphicsFuzz erorile GPU

Un driver grafic funcționează luând un program de shader și trimițându-l la GPU pentru a fi executat și astfel reda imaginea. Înainte de a trimite shader-ul la GPU, driverul grafic îl traduce într-o formă pe care GPU-ul o poate înțelege; o traducere greșită poate duce la eșecuri de redare, blocări ale programului sau dispozitivului, imagini greșite și chiar probleme de securitate. GraphicsFuzz are o suită de testare automată care le permite să găsească aceste erori pe baza unui set de shadere de referință. Când un utilizator își execută testul, toate imaginile rezultate ar trebui să arate la fel. Orice imagine care arată diferit înseamnă că a existat o eroare.

Rezultatele mai multor dispozitive populare care rulează suita de testare GraphicsFuzz. Samsung Galaxy S6, Samsung Galaxy S7 și Samsung Galaxy S8 sunt incluse în aceste diagrame. Sursă: GraphicsFuzz.

Pentru Samsung Galaxy S6, GraphicsFuzz a descoperit că imaginile dintr-unul dintre rânduri arătau imagini care trebuiau să fie într-un alt tabel. Aceasta înseamnă că imaginile din testele anterioare se scurgeau în testele ulterioare. Apoi, echipa a rulat din nou suita de testare în Google Chrome și a descoperit că părți ale paginii web apăreau în imagine. Mai mult, au descoperit că deschiderea unei alte file a făcut ca imaginea să arate părți ale altor file. În esență, această eroare a permis unei file Google Chrome să scurgă informații despre o altă filă Chrome! Echipa din spate GraphicsFuzz nu a căutat în mod intenționat erori de securitate, dar au ajuns să găsească una ca urmare a testării lor. (Trebuie remarcat faptul că echipa a reprodus bug-ul pe browserul Samsung stoc de pe Galaxy S6, precum și Mozilla Firefox.)

Cum funcționează bug-ul

Imagine folosită pentru a declanșa bug-ul de lungă durată pe Samsung Galaxy S6. Sursă: GraphicsFuzz.

Pagina web „răuțioasă” creată de GraphicsFuzz folosește WebGL pentru a încerca să deseneze o scenă spațială în interiorul unei pânze, așa cum se arată mai sus. Culoarea fiecărui pixel este determinată de un fragment shader, un program furnizat de pagina web pentru a fi executat pe GPU. The GraphicsFuzz framework-ul a modificat fragment shader, ceea ce a făcut ca acesta să ruleze pentru o perioadă foarte lungă de timp. Când un shader rulează prea mult timp, browserul sau sistemul de operare întrerupe de obicei redarea. Cu toate acestea, în timp ce GPU-ul a renunțat la redarea după ce a desenat câțiva pixeli, driverul GPU nu a raportat acest lucru la Google Chrome. (Dacă aruncați o privire la imaginea din partea de sus a articolului care arată memoria video de gunoi, puteți vedea de fapt părți ale scenei spațiale în partea de sus stânga.) Aceasta înseamnă că pixelii care au fost redați înainte de anulare sunt lăsați neatinsi, ceea ce înseamnă că imaginea finală redată este în mare parte un video gunoi memorie. Deoarece memoria video este utilizată în mod continuu pentru a reda alte pagini web, datele „gunoi” conțin de fapt redări anterioare ale altor pagini web. Astfel, alte pagini web ajung să fie afișate pe pagina web „răuțioasă”. În mod crucial, WebGL permite paginii web să capteze conținutul a ceea ce este redat; această imagine este apoi încărcată pe un server la distanță.

Diagramă care explică eroarea GPU de lungă durată care provoacă „scurgerea” datelor din fila Chrome. Sursă: GraphicsFuzz.

Google Chrome utilizează mai multe procese, astfel încât diferite file sunt adesea izolate, ceea ce face ca această exploatare să pară imposibilă la suprafață. Cu toate acestea, Chrome interacționează cu GPU-ul folosind un singur „proces GPU”, ceea ce înseamnă că toate filele au aceeași memorie GPU, permițând astfel să funcționeze acest exploit. Diagrama de mai sus arată acest lucru mai detaliat.

Bug-ul este demonstrat în acest videoclip în primele 22 de secunde. Sunt demonstrate și alte probleme de securitate găsite de GraphicsFuzz.

Lecții de învățat

Un GPU care se comportă greșit poate ocoli toate măsurile de securitate ale Google Chrome și Android, deoarece WebGL permite oricărei pagini web rău intenționate să trimită cod la GPU pentru execuție. Google nu poate remedia erorile GPU deoarece compania nu controlează hardware-ul și driverele. În acest caz, revine furnizorului de GPU (în acest caz, ARM) să remedieze bug-ul și OEM ale cărui dispozitive sunt afectate (în acest caz, Samsung) să integreze remedierea într-o actualizare. Adăugați operatori de transport la combinație și este ușor să vedeți cum o problemă ca aceasta poate dura foarte mult timp să fie remediată - a fost nevoie cel putin 5 luni pentru ca majoritatea utilizatorilor Samsung Galaxy S6 să primească patch-ul.

GraphicsFuzz ajută furnizorii de GPU să găsească erori greu de detectat, cum ar fi erori de compilare greșită, care fac ca codul greșit să fie generat și executat pe GPU. Cadrul lor de testare automatizată le permite să găsească erori precum cea prezentată în acest articol. De asemenea, s-a demonstrat că bucla de lungă durată cauzată de pagina web „răuțioasă” cauzează probleme pe alte dispozitive, cum ar fi HTC One M7 iar mai recent cel Samsung Galaxy S9. GraphicsFuzz testează smartphone-uri emblematice și publică a tabelul cu rezultate care clasifică aceste dispozitive în funcție de performanța lor pe un subset al testelor lor. Sute de blocări și erori de randare au fost găsite în timpul testării lor, dar majoritatea nu sunt investigate pentru a vedea dacă reprezintă o amenințare pentru securitate. Cu toate acestea, după cum arată această exploatare, un GPU care se comportă greșit reprezintă un risc de securitate și este posibil ca una sau mai multe vulnerabilități critice de securitate să aștepte să fie descoperite. GraphicsFuzz speră ca furnizorii de GPU să acorde prioritate îmbunătățirii calității driverelor în viitor.

Fiabilitatea comparativă a driverelor grafice, sortate după numărul total de probleme. Sursă: GraphicsFuzz.

Cronologia dezvăluirii

  • În decembrie 2016, GraphicsFuzz a raportat bug-ul către Urmăritorul de erori Google Chromium deoarece era eligibil pentru Programul de recompense Chrome. După ce GraphicsFuzz a trimis eroarea la instrumentul de urmărire a erorilor Google Chromium, eroarea a fost acceptată de Google și a trimis-o către ARM și Samsung pentru corecție.
  • Google a transmis raportul la contactele de la ARM și Samsung.
  • Samsung a corectat în tăcere bug-ul și a lansat remedierea în actualizarea Android 7.0 Nougat, care a fost lansată între martie și iunie 2017. Deși nu a existat niciun CVE creat de Samsung, Google sau ARM și nici Samsung, nici ARM nu au lansat nicio informație despre corecție, rețineți că GraphicsFuzz nu a raportat eroarea prin intermediul proces adecvat.
  • Mai tarziu, GraphicsFuzz a putut confirma că atât Samsung, cât și ARM au văzut raportul și că ARM a reușit să remedieze problema datorită raportului.
  • În august 2017, GraphicsFuzz a fost recompensat cu 2.000 USD de către Google pentru raportul de eroare.
  • În noiembrie 2017, raportul de eroare a fost făcut public.