Czy zastanawiałeś się kiedyś, w jaki sposób wykrywane są luki w zabezpieczeniach? Brytyjska firma GraphicsFuzz wyjaśnia, w jaki sposób natrafiła na błąd sterownika graficznego w telefonie Samsung Galaxy S6, który można wykorzystać do przeglądania danych z otwartych kart w przeglądarce Google Chrome.
Pod koniec marca brytyjska firma typu start-up specjalizująca się w testowaniu niezawodności procesorów graficznych zwróciła się do nas z propozycją Odkryli błąd GPU to powoduje Qualcomma Snapdragona 845Samsunga Galaxy S9/S9+ do ponownego uruchomienia podczas odwiedzania strony internetowej. Firma tzw GrafikaFuzz, współpracowaliśmy z nami i zgłosiliśmy problem Qualcomm I SAMSUNG. Niektórzy z naszych czytelników byli zainteresowani dowiedzeniem się, jak lubi się dana firma GrafikaFuzz jest w stanie znaleźć te luki, dlatego nawiązaliśmy współpracę z tą firmą, aby pokazać, jak odkryła ona starszą lukę w zabezpieczeniach procesora graficznego. Ta już załatana luka umożliwiła osobie atakującej zdalne „szpiegowanie” zawartości GoogleChrome zakładki przeglądarki na Samsunga Galaxy S6.
Ten użytkownik przeglądał witrynę swojego banku przed odwiedzeniem złośliwej strony internetowej. Zawartość została przechwycona i przesłana na zdalny serwer. Źródło: GrafikaFuzz.
Jak GraphicsFuzz znajduje błędy GPU
Sterownik graficzny pobiera program cieniujący i wysyła go do procesora graficznego w celu wykonania, a tym samym wyrenderowania obrazu. Przed wysłaniem modułu cieniującego do procesora graficznego sterownik graficzny tłumaczy go na formę zrozumiałą dla procesora graficznego; błędne tłumaczenie może prowadzić do awarii renderowania, awarii programu lub urządzenia, błędnych obrazów, a nawet problemów z bezpieczeństwem. GrafikaFuzz ma zestaw testów automatycznych co pozwala im znaleźć te błędy w oparciu o zestaw referencyjnych shaderów. Kiedy użytkownik przeprowadza swój test, wszystkie powstałe obrazy powinny wyglądać tak samo. Każdy obraz, który wygląda inaczej, oznacza, że wystąpił błąd.
Wyniki kilku popularnych urządzeń, na których działa zestaw testów GraphicsFuzz. Na tych wykresach uwzględniono Samsunga Galaxy S6, Samsunga Galaxy S7 i Samsunga Galaxy S8. Źródło: GrafikaFuzz.
Dla Samsunga Galaxy S6, GrafikaFuzz odkrył, że obrazy w jednym z wierszy przedstawiały obrazy, które miały znajdować się w innej tabeli. Oznacza to, że obrazy z wcześniejszych testów przedostawały się do późniejszych testów. Następnie zespół ponownie uruchomił zestaw testów w przeglądarce Google Chrome i odkrył, że na obrazie pojawiły się części strony internetowej. Co więcej, odkryli, że otwarcie innej karty powodowało, że obraz pokazywał części innych kart. Zasadniczo ten błąd umożliwiał wyciek informacji z jednej karty przeglądarki Google Chrome na temat innej karty przeglądarki Chrome! Zespół z tyłu GrafikaFuzz nie szukali celowo błędów bezpieczeństwa, ale w wyniku testów znaleźli jeden. (Należy zauważyć, że zespół odtworzył błąd w standardowej przeglądarce Samsung na Galaxy S6, a także Mozilla Firefox.)
Jak działa błąd
Obraz użyty do wywołania długotrwałego błędu w Samsungu Galaxy S6. Źródło: GrafikaFuzz.
„Szkodliwa” strona internetowa utworzona przez GrafikaFuzz używa WebGL, aby spróbować narysować scenę kosmiczną na płótnie, jak pokazano powyżej. Kolor każdego piksela jest określany przez moduł cieniujący fragmenty, program udostępniany przez stronę internetową i uruchamiany na procesorze graficznym. The GrafikaFuzz framework zmodyfikował moduł cieniujący fragmenty, co spowodowało, że działał on naprawdę długo. Gdy moduł cieniujący działa zbyt długo, przeglądarka lub system operacyjny zazwyczaj przerywa renderowanie. Jednakże, chociaż procesor graficzny przerwał renderowanie po narysowaniu kilku pikseli, sterownik GPU nie zgłosił tego do przeglądarki Google Chrome. (Jeśli spojrzysz na obraz na górze artykułu, przedstawiający śmieciową pamięć wideo, w rzeczywistości możesz zobaczyć fragmenty sceny kosmicznej na górze Oznacza to, że piksele wyrenderowane przed przerwaniem pozostają nietknięte, co oznacza, że ostatecznie wyrenderowany obraz to w większości śmieciowe wideo pamięć. Ponieważ pamięć wideo jest stale używana do renderowania innych stron internetowych, „śmieciowe” dane w rzeczywistości zawierają poprzednie renderowania innych stron internetowych. W ten sposób inne strony internetowe są wyświetlane na „złośliwej” stronie internetowej. Co najważniejsze, WebGL umożliwia stronie internetowej przechwytywanie zawartości wszystkiego, co jest renderowane; obraz ten jest następnie przesyłany na zdalny serwer.
Diagram wyjaśniający długotrwały błąd procesora graficznego powodujący „wyciek danych na karcie Chrome”. Źródło: GrafikaFuzz.
Przeglądarka Google Chrome wykorzystuje wiele procesów, dlatego często różne karty są izolowane, co sprawia, że na pierwszy rzut oka ten exploit wydaje się niemożliwy. Jednak Chrome współpracuje z procesorem graficznym za pomocą pojedynczego „procesu GPU”, co oznacza, że wszystkie karty korzystają z tej samej pamięci procesora graficznego, co pozwala na działanie tego exploita. Powyższy diagram pokazuje to bardziej szczegółowo.
Błąd jest pokazany w tym filmie w ciągu pierwszych 22 sekund. Pokazano także inne problemy bezpieczeństwa wykryte przez GraphicsFuzz.
Lekcje do odrobienia
Źle działający procesor graficzny może ominąć wszystkie zabezpieczenia przeglądarki Google Chrome i Androida, ponieważ WebGL umożliwia każdej złośliwej stronie internetowej wysłanie kodu do procesora graficznego w celu wykonania. Google nie może naprawić błędów GPU ponieważ firma nie kontroluje sprzętu i sterowników. W takim przypadku do dostawcy procesora graficznego (w tym przypadku ARM) należy naprawienie błędu, a do producenta OEM, którego urządzenia dotyczy problem (w tym przypadku do firmy Samsung), należy włączenie poprawki do aktualizacji. Dodaj do tego przewoźników, a łatwo zobaczyć, jak naprawa takiego błędu może zająć naprawdę dużo czasu — zajęło co najmniej 5 miesięcy dla większości użytkowników Samsunga Galaxy S6, aby otrzymać łatkę.
GrafikaFuzz pomaga dostawcom procesorów graficznych znajdować trudne do wykrycia błędy, takie jak błędy błędnej kompilacji, które powodują wygenerowanie i wykonanie nieprawidłowego kodu na GPU. Ich zautomatyzowane środowisko testowania pozwala im znaleźć błędy, takie jak ten przedstawiony w tym artykule. Wykazano również, że długotrwała pętla powodowana przez „złośliwą” stronę internetową powoduje problemy na innych urządzeniach, np. HTC One M7 a ostatnio Samsunga Galaxy S9. GrafikaFuzz testuje flagowe smartfony i publikuje m.in tabela wyników który klasyfikuje te urządzenia na podstawie ich wydajności w podzbiorze ich testów. Setki awarii i błędów renderowania zostały wykryte podczas testów, ale większość z nich nie jest sprawdzana pod kątem zagrożenia bezpieczeństwa. Jednakże, jak pokazuje ten exploit, źle działający procesor graficzny stanowi zagrożenie dla bezpieczeństwa i możliwe, że jedna lub więcej krytycznych luk w zabezpieczeniach czeka na odkrycie. GrafikaFuzz ma nadzieję, że dostawcy procesorów graficznych w przyszłości priorytetowo potraktują poprawę jakości sterowników.
Porównawcza niezawodność sterowników graficznych, posortowana według całkowitej liczby problemów. Źródło: GrafikaFuzz.
Harmonogram ujawnień
- W grudniu 2016 r. GrafikaFuzz zgłosił błąd do Narzędzie do śledzenia błędów Google Chromium ponieważ kwalifikował się do programu nagród Chrome. Po tym, jak GraphicsFuzz wysłał błąd do narzędzia do śledzenia błędów Google Chromium, błąd został zaakceptowany przez Google i przekazany do ARM i Samsunga w celu załatania.
- Google przekazał raport do kontaktów w ARM i Samsungu.
- Samsung po cichu załatał błąd i udostępnił poprawkę w aktualizacji Androida 7.0 Nougat, która została wydana między marcem a czerwcem 2017 roku. Chociaż nie było CVE stworzonego przez Samsunga, Google ani ARM i ani Samsung, ani ARM nie opublikowały żadnych informacji na temat łatki, należy pamiętać, że GrafikaFuzz nie zgłosił błędu poprzez właściwy proces.
- Później, GrafikaFuzz był w stanie potwierdzić, że zarówno Samsung, jak i ARM zapoznały się z raportem i że ARM był w stanie rozwiązać problem dzięki raportowi.
- W sierpniu 2017 r. GrafikaFuzz został nagrodzony przez Google kwotą 2000 dolarów za zgłoszenie błędu.
- W listopadzie 2017 r. raport o błędzie został upubliczniony.