Har du nogensinde spekuleret på, hvordan sikkerhedssårbarheder findes? Det britiske firma GraphicsFuzz forklarer, hvordan de stødte på en grafikdriverfejl på Samsung Galaxy S6, som de kunne udnytte til at se data fra åbnede faner i Google Chrome.
Tilbage i slutningen af marts henvendte et britisk baseret nystartet firma, der var specialiseret i at teste GPU-pålidelighed, os med en GPU-fejl, de opdagede der forårsager Qualcomm Snapdragon 845Samsung Galaxy S9/S9+ for at genstarte, når du besøger en webside. Firmaet, kaldet GraphicsFuzz, arbejdede sammen med os for at rapportere problemet til Qualcomm og Samsung. Nogle af vores læsere var interesserede i at lære, hvordan en virksomhed kan lide GraphicsFuzz er i stand til at finde disse sårbarheder, så vi samarbejdede med virksomheden for at vise, hvordan de opdagede en ældre GPU-sårbarhed. Denne allerede patchede sårbarhed gjorde det muligt for en angriber at fjernspionere på indholdet af Google Chrome browserfaner på Samsung Galaxy S6.
Denne bruger så deres banks hjemmeside, før han besøgte den ondsindede webside. Indholdet blev fanget og uploadet til en ekstern server. Kilde:
Hvordan GraphicsFuzz finder GPU-fejl
En grafikdriver fungerer ved at tage et shader-program og sende det til GPU'en for at blive eksekveret og dermed gengive billedet. Før du sender shaderen til GPU'en, oversætter grafikdriveren den til en form, som GPU'en kan forstå; en defekt oversættelse kan føre til gengivelsesfejl, program- eller enhedsnedbrud, forkerte billeder og endda sikkerhedsproblemer. GraphicsFuzz har en automatiseret testpakke der giver dem mulighed for at finde disse fejl baseret på et sæt reference shaders. Når en bruger kører deres test, skal alle de resulterende billeder se ens ud. Ethvert billede, der ser anderledes ud, betyder, at der var en fejl.
Resultater af flere populære enheder, der kører GraphicsFuzz-testpakken. Samsung Galaxy S6, Samsung Galaxy S7 og Samsung Galaxy S8 er inkluderet i disse diagrammer. Kilde: GraphicsFuzz.
Til Samsung Galaxy S6, GraphicsFuzz opdagede, at billederne i en af rækkerne viste billeder, der skulle være i en anden tabel. Det betyder, at billeder fra tidligere test sivede ind i senere tests. Holdet kørte derefter testpakken igen i Google Chrome og opdagede, at dele af websiden dukkede op på billedet. Desuden fandt de ud af, at åbning af en anden fane fik billedet til at vise dele af andre faner. I det væsentlige tillod denne fejl en Google Chrome-fane at lække oplysninger om en anden Chrome-fane! Holdet bag GraphicsFuzz ledte ikke med vilje efter sikkerhedsfejl, men de endte med at finde en som et resultat af deres test. (Det skal bemærkes, at holdet reproducerede fejlen på den almindelige Samsung-browser på Galaxy S6 såvel som Mozilla Firefox.)
Hvordan fejlen virker
Billede brugt til at udløse den langvarige fejl på Samsung Galaxy S6. Kilde: GraphicsFuzz.
Den "ondsindede" webside oprettet af GraphicsFuzz bruger WebGL til at forsøge at tegne en rumscene inde i et lærred som vist ovenfor. Farven på hver pixel bestemmes af en fragment shader, et program leveret af websiden til at udføre på GPU'en. Det GraphicsFuzz framework ændrede fragment shaderen, hvilket fik den til at køre i rigtig lang tid. Når en shader kører for længe, afbryder browseren eller operativsystemet typisk gengivelsen. Men mens GPU'en afbrød gengivelsen efter at have tegnet et par pixels, rapporterede GPU-driveren ikke dette til Google Chrome. (Hvis du tager et kig på billedet øverst i artiklen, der viser affaldsvideohukommelse, kan du faktisk se dele af rumscenen i toppen venstre.) Dette betyder, at de pixels, der blev gengivet før afbrydelsen, efterlades uberørte, hvilket betyder, at det endelige gengivede billede for det meste er skraldvideo hukommelse. Da videohukommelsen løbende bruges til at gengive andre websider, indeholder "skrald"-dataene faktisk tidligere gengivelser af andre websider. Således ender andre websider med at blive vist på den "ondsindede" webside. Det er afgørende, at WebGL tillader websiden at fange indholdet af det, der gengives; dette billede uploades derefter til en ekstern server.
Diagram, der forklarer den langvarige GPU-fejl, der får Chrome-fanedata til at "lække". Kilde: GraphicsFuzz.
Google Chrome bruger flere processer, så forskellige faner er ofte isolerede, hvilket får denne udnyttelse til at virke umulig på overfladen. Chrome interagerer dog med GPU'en ved hjælp af en enkelt "GPU-proces", hvilket betyder, at alle faner deler den samme GPU-hukommelse, og dermed tillader denne udnyttelse at fungere. Diagrammet ovenfor viser dette mere detaljeret.
Fejlen demonstreres i denne video i løbet af de første 22 sekunder. Andre sikkerhedsproblemer fundet af GraphicsFuzz er også demonstreret.
Lektioner, der skal læres
En fejlagtig GPU kan omgå alle Google Chrome og Androids sikkerhedsforanstaltninger, da WebGL tillader enhver ondsindet webside at sende kode til GPU'en til udførelse. Google kan ikke rette GPU-fejl da virksomheden ikke kontrollerer hardwaren og driverne. I dette tilfælde er det op til GPU-leverandøren (i dette tilfælde ARM) at rette fejlen og den OEM, hvis enheder er berørt (i dette tilfælde Samsung), at integrere rettelsen i en opdatering. Tilføj transportører til blandingen, og det er nemt at se, hvordan en fejl som denne kan tage rigtig lang tid at rette op – det tog mindst 5 måneder for de fleste Samsung Galaxy S6-brugere at modtage patchen.
GraphicsFuzz hjælper GPU-leverandører med at finde svære at opdage fejl såsom fejlkompileringsfejl, der forårsager, at den forkerte kode genereres og udføres på GPU'en. Deres automatiserede testramme giver dem mulighed for at finde fejl som den, der er vist i denne artikel. Den langvarige loop forårsaget af den "ondsindede" webside har også vist sig at forårsage problemer på andre enheder som f.eks. HTC One M7 og for nylig Samsung Galaxy S9. GraphicsFuzz tester flagskibssmartphones og udgiver en resultattabel som rangerer disse enheder baseret på deres ydeevne på en undergruppe af deres tests. Hundredvis af nedbrud og gengivelsesfejl er blevet fundet under deres test, men de fleste er ikke undersøgt for at se, om de udgør en sikkerhedstrussel. Men som vist af denne udnyttelse, er en fejlagtig GPU en sikkerhedsrisiko, og det er muligt, at en eller flere kritiske sikkerhedssårbarheder venter på at blive opdaget. GraphicsFuzz håber, at GPU-leverandører prioriterer at forbedre driverkvaliteten i fremtiden.
Komparativ pålidelighed af grafikdrivere, sorteret efter antallet af samlede problemer. Kilde: GraphicsFuzz.
Tidslinje for offentliggørelse
- I december 2016 GraphicsFuzz rapporterede fejlen til Google Chromium fejlsporing fordi den var kvalificeret til Chrome Reward-programmet. Efter at GraphicsFuzz indsendte fejlen til Google Chromium-fejlsporingen, blev fejlen accepteret af Google og videresendt den til ARM og Samsung til patching.
- Google fremsendte rapporten til kontakter hos ARM og Samsung.
- Samsung rettede lydløst fejlen og udrullede rettelsen i Android 7.0 Nougat-opdateringen, der blev udgivet mellem marts og juni 2017. Selvom der ikke var nogen CVE oprettet af Samsung, Google eller ARM, og hverken Samsung eller ARM frigav nogen information om patchen, skal du bemærke, at GraphicsFuzz rapporterede ikke fejlen via ordentlig proces.
- Senere, GraphicsFuzz kunne bekræfte, at både Samsung og ARM havde set rapporten, og at ARM var i stand til at løse problemet på grund af rapporten.
- I august 2017, GraphicsFuzz blev belønnet $2.000 af Google for fejlrapporten.
- I november 2017, fejlrapporten blev offentliggjort.