Kako je greška grafičkog upravljačkog programa na Samsung Galaxy S6 dovela do curenja podataka kartice Google Chrome

Jeste li se ikada zapitali kako se pronalaze sigurnosne ranjivosti? Firma GraphicsFuzz sa sjedištem u Velikoj Britaniji objašnjava kako su naišli na pogrešku grafičkog upravljačkog programa na Samsung Galaxy S6 koju su mogli iskoristiti za pregled podataka s otvorenih kartica u Google Chromeu.

Još krajem ožujka, nova tvrtka sa sjedištem u Ujedinjenom Kraljevstvu specijalizirana za testiranje pouzdanosti GPU-a obratila nam se s GPU bug koji su otkrili koji uzrokuje Qualcomm Snapdragon 845Samsung Galaxy S9/S9+ za ponovno pokretanje prilikom posjeta web stranici. Firma, tzv GraphicsFuzz, surađivao je s nama u prijavi problema Qualcomm i Samsung. Neki od naših čitatelja bili su zainteresirani saznati kako to izgleda neka tvrtka GraphicsFuzz može pronaći te ranjivosti, pa smo surađivali s tvrtkom kako bismo pokazali kako su otkrili stariju ranjivost GPU-a. Ova već zakrpana ranjivost omogućila je napadaču da daljinski "špijunira" sadržaj Google Chrome kartice preglednika na Samsung Galaxy S6.

Ovaj korisnik je pregledavao web stranicu svoje banke prije nego što je posjetio zlonamjernu web stranicu. Sadržaj je snimljen i prenesen na udaljeni poslužitelj. Izvor:

GraphicsFuzz.

Kako GraphicsFuzz pronalazi GPU greške

Grafički upravljački program radi tako da uzima program za shader i šalje ga GPU-u da se izvrši i tako renderira sliku. Prije slanja shadera GPU-u, grafički upravljački program ga prevodi u oblik koji GPU može razumjeti; neispravan prijevod može dovesti do greške u prikazivanju, pada programa ili uređaja, pogrešnih slika, pa čak i sigurnosnih problema. GraphicsFuzz ima automatizirani paket za testiranje koji im omogućuje da pronađu te greške na temelju skupa referentnih shadera. Kada korisnik izvodi njihov test, sve bi nastale slike trebale izgledati isto. Svaka slika koja izgleda drugačije znači da postoji greška.

Rezultati nekoliko popularnih uređaja koji pokreću paket testova GraphicsFuzz. Samsung Galaxy S6, Samsung Galaxy S7 i Samsung Galaxy S8 uključeni su u ove ljestvice. Izvor: GraphicsFuzz.

Za Samsung Galaxy S6, GraphicsFuzz otkrio da slike u jednom od redaka prikazuju slike koje su trebale biti u drugoj tablici. To znači da su slike iz ranijih testova curile u kasnije testove. Tim je zatim ponovno pokrenuo paket testova u Google Chromeu i otkrio da se dijelovi web stranice pojavljuju na slici. Nadalje, otkrili su da je otvaranje druge kartice uzrokovalo prikaz dijelova drugih kartica na slici. U biti, ovaj bug je omogućio da jedna kartica Google Chromea procuri informacije o drugoj kartici Chrome! Tim iza GraphicsFuzz nije namjerno tražio sigurnosne greške, ali su na kraju pronašli jednu kao rezultat testiranja. (Treba napomenuti da je tim reproducirao grešku na standardnom Samsung pregledniku na Galaxy S6, kao i Mozilla Firefox.)

Kako bug radi

Slika korištena za pokretanje dugotrajne greške na Samsung Galaxy S6. Izvor: GraphicsFuzz.

"Zlonamjerna" web stranica koju je izradio GraphicsFuzz koristi WebGL za pokušaj crtanja svemirske scene unutar platna kao što je prikazano gore. Boju svakog piksela određuje shader fragmenta, program koji nudi web stranica za izvršavanje na GPU-u. The GraphicsFuzz Framework je modificirao fragment shader zbog čega je radio jako dugo. Kada shader radi predugo, preglednik ili operativni sustav obično prekida iscrtavanje. Međutim, iako je GPU prekinuo renderiranje nakon crtanja nekoliko piksela, GPU upravljački program nije to prijavio Google Chromeu. (Ako pogledate sliku na vrhu članka koja prikazuje smeće video memorije, zapravo možete vidjeti dijelove svemirske scene na vrhu lijevo.) To znači da su pikseli koji su generirani prije prekida ostali netaknuti, što znači da je konačna generirana slika uglavnom otpadni video memorija. Budući da se video memorija neprestano koristi za prikazivanje drugih web stranica, podaci o "smeću" zapravo sadrže prethodna prikazivanja drugih web stranica. Tako se druge web stranice prikazuju na "zlonamjernoj" web stranici. Ono što je ključno, WebGL omogućuje web stranici da uhvati sadržaj svega što se prikazuje; ta se slika zatim učitava na udaljeni poslužitelj.

Dijagram koji objašnjava dugotrajnu pogrešku GPU-a koja uzrokuje "curenje" podataka kartice Chrome. Izvor: GraphicsFuzz.

Google Chrome koristi višestruke procese pa su različite kartice često izolirane, zbog čega se ovo iskorištavanje čini nemogućim na površini. Međutim, Chrome stupa u interakciju s GPU-om pomoću jednog "GPU procesa", što znači da sve kartice dijele istu GPU memoriju, čime se omogućuje rad ovog iskorištavanja. Gornji dijagram to detaljnije prikazuje.

Bug je prikazan u ovom videu tijekom prve 22 sekunde. Prikazani su i drugi sigurnosni problemi koje je pronašao GraphicsFuzz.

Lekcije koje treba naučiti

GPU koji se loše ponaša može zaobići sve sigurnosne mjere Google Chromea i Androida jer WebGL dopušta svakoj zlonamjernoj web stranici da pošalje kod GPU-u na izvršenje. Google ne može popraviti greške GPU-a budući da tvrtka ne kontrolira hardver i upravljačke programe. U ovom slučaju, na dobavljaču GPU-a (u ovom slučaju, ARM-u) je da popravi pogrešku, a na OEM-u čiji su uređaji pogođeni (u ovom slučaju, Samsung) da integrira popravak u ažuriranje. Dodajte operatere u mješavinu i lako je vidjeti kako popravak ovakve pogreške može trajati jako dugo – trebalo je najmanje 5 mjeseci kako bi većina korisnika Samsung Galaxy S6 primila zakrpu.

GraphicsFuzz pomaže prodavačima GPU-a da pronađu greške koje je teško otkriti, kao što su pogreške pogrešnog kompiliranja koje uzrokuju generiranje i izvođenje pogrešnog koda na GPU-u. Njihov okvir za automatizirano testiranje omogućuje im pronalaženje grešaka poput one prikazane u ovom članku. Pokazalo se da dugotrajna petlja uzrokovana "zlonamjernom" web stranicom također uzrokuje probleme na drugim uređajima kao što su HTC One M7 a u novije vrijeme i Samsung Galaxy S9. GraphicsFuzz testira vodeće pametne telefone i objavljuje a tablica rezultata koji rangira te uređaje na temelju njihove izvedbe na podskupu njihovih testova. Stotine rušenja i pogrešaka u prikazivanju su pronađeni tijekom testiranja, ali većina nije istražena da bi se vidjelo predstavljaju li sigurnosnu prijetnju. Međutim, kao što pokazuje ovaj exploit, GPU koji se loše ponaša predstavlja sigurnosni rizik i moguće je da jedna ili više kritičnih sigurnosnih ranjivosti čekaju da budu otkrivene. GraphicsFuzz nada se da će proizvođači grafičkih procesora u budućnosti dati prednost poboljšanju kvalitete upravljačkih programa.

Usporedna pouzdanost grafičkih upravljačkih programa, poredana po broju ukupnih problema. Izvor: GraphicsFuzz.

Vremenska linija otkrivanja

  • U prosincu 2016. GraphicsFuzz prijavio je grešku u Google Chromium alat za praćenje bugova jer je ispunjavao uvjete za Chromeov program nagrađivanja. Nakon što je GraphicsFuzz poslao bug u Google Chromium bug tracker, bug je prihvatio Google i proslijedio ga ARM-u i Samsungu na zakrpanje.
  • Google proslijedio izvještaj na kontakte u ARM-u i Samsungu.
  • Samsung je tiho zakrpao pogrešku i izveo popravak u ažuriranju za Android 7.0 Nougat koje je objavljeno između ožujka i lipnja 2017. Iako nije postojao CVE koji su izradili Samsung, Google ili ARM, a niti Samsung niti ARM nisu objavili nikakve informacije o zakrpi, imajte na umu da GraphicsFuzz nije prijavio grešku putem pravilan proces.
  • Kasnije, GraphicsFuzz je mogao potvrditi da su i Samsung i ARM vidjeli izvješće te da je ARM uspio riješiti problem zahvaljujući izvješću.
  • U kolovozu 2017. GraphicsFuzz Google ga je nagradio s 2000 USD za izvješće o pogrešci.
  • U studenom 2017. izvješće o bugu je javno objavljeno.