Bezpieczeństwo pamięci

Niebezpieczeństwo pamięci

Błędy bezpieczeństwa pamięci, błędy w obsłudze pamięci w natywnych językach programowania, to najczęstszy problem w bazach kodów Androida. Stanowią one ponad 60% luk w zabezpieczeniach o dużej wadze i są przyczyną milionów awarii widocznych dla użytkownika.

Błędy związane z bezpieczeństwem pamięci wpływają na wygodę użytkownika, koszty i bezpieczeństwo.
Rysunek 1 : Błędy bezpieczeństwa pamięci i ich negatywny wpływ na jakość, bezpieczeństwo i koszty

Błędy bezpieczeństwa pamięci negatywnie wpływają na jakość i stabilność i są przyczyną znacznej części awarii obserwowanych na urządzeniach użytkowników końcowych. Dlatego duża gęstość błędów bezpieczeństwa pamięci bezpośrednio koreluje ze złym doświadczeniem użytkownika.
Kod natywny zapisany w niebezpiecznych językach, takich jak C, C++ i Assembly, stanowi ponad 70% kodu platformy Android i jest obecny w około 50% aplikacji w Sklepie Play.
Biorąc pod uwagę stale rosnącą złożoność kodu, pozostawienie go bez nadzoru spowoduje zwiększenie liczby błędów związanych z bezpieczeństwem pamięci. Dlatego zapewnienie naszemu ekosystemowi narzędzi i technologii umożliwiających wykrywanie i łagodzenie takich błędów ma kluczowe znaczenie dla naszego długoterminowego sukcesu.
Przez ostatnie kilka lat blisko współpracowaliśmy z naszymi partnerami sprzętowymi nad rozwojem technologii sprzętowych, takich jak Arm Memory Tagging, i wprowadziliśmy Rust do bazy kodu Androida.
Technologie te przyspieszą naszą drogę do bezpieczeństwa pamięci i pomogą szerszej branży oprogramowania rozwiązać kluczowy obszar problemów.

Błędy bezpieczeństwa pamięci negatywnie wpływają na jakość

Ukryte błędy bezpieczeństwa pamięci mogą powodować niedeterministyczne wyniki, w zależności od stanu systemu. To nieprzewidywalne zachowanie prowadzi do awarii i irytacji dla naszych użytkowników.

Każdego dnia obserwujemy miliony natywnych awarii urządzeń użytkowników końcowych, a wraz z wprowadzeniem GWP-ASan przypisaliśmy większość z nich błędom związanym z bezpieczeństwem pamięci.
Ten punkt danych potwierdza korelację między jakością i gęstością błędów związanych z bezpieczeństwem pamięci i jest zgodny z obserwacjami naszych kolegów z Chrome (patrz gorąca lista błędów GWP-ASan Chrome).

Błędy bezpieczeństwa pamięci negatywnie wpływają na bezpieczeństwo

Błędy związane z bezpieczeństwem pamięci niezmiennie stanowią główną przyczynę luk w zabezpieczeniach Androida, począwszy od pierwszej wersji Androida.

Błędy bezpieczeństwa pamięci negatywnie wpływają na bezpieczeństwo.
Rysunek 2 : Błędy związane z bezpieczeństwem pamięci przyczyniają się do luk w zabezpieczeniach Androida

Chociaż świadomość, że nie jest to tylko problem Androida (zobacz statystyki Chrome i Microsoft ), pociesza, musimy zrobić więcej dla bezpieczeństwa naszych użytkowników.
Zespół Project Zero w Google śledzi exploity dnia zerowego, które zostały wykorzystane w rzeczywistych atakach na użytkowników jako luki dnia zerowego. Nie są to hipotetyczne błędy, ale exploity aktywnie wykorzystywane w atakach na użytkowników. Błędy związane z bezpieczeństwem pamięci (uszkodzenie pamięci i użycie po zwolnieniu) stanowią zdecydowaną większość.

Błędy zabezpieczające pamięć zwiększają koszty

Aktualizowanie urządzeń za pomocą poprawek zabezpieczeń zapewnia bezpieczeństwo naszym użytkownikom, ale wiąże się z kosztami pieniężnymi dla naszego ekosystemu.

Duża gęstość błędów związanych z bezpieczeństwem pamięci w kodzie dostawcy niskiego poziomu, który często zawiera niestandardowe modyfikacje, znacznie zwiększa koszty napraw i testów. Jednak wykrycie tych błędów na wczesnym etapie cyklu rozwojowego może obniżyć te koszty.

Badania pokazują, że wcześniejsze wykrycie błędów może obniżyć koszty nawet sześciokrotnie. Biorąc jednak pod uwagę złożoność naszego ekosystemu, średnią liczbę baz kodów utrzymywanych przez dostawcę i stale rosnącą złożoność oprogramowania, oszczędności mogą być większe.

Bezpieczeństwo pamięci

Począwszy od Androida 12, wprowadziliśmy zmiany systemowe, aby zmniejszyć gęstość błędów związanych z bezpieczeństwem pamięci w bazach kodów Androida. Rozszerzamy narzędzia zabezpieczające pamięć Androida i wprowadzamy nowe wymagania, które zachęcają nasz ekosystem do zajęcia się tą kategorią błędów. Z biegiem czasu powinno to przełożyć się na wyższą jakość i większe bezpieczeństwo dla naszych użytkowników oraz niższe koszty dla naszych dostawców.

Bezpieczeństwo pamięci prawdopodobnie stanie się w nadchodzących latach wyróżnikiem jakości i bezpieczeństwa, a Android planuje przodować.

Wymagania wspierające bezpieczeństwo pamięci

Dokument definicji zgodności systemu Android (CDD) zdecydowanie zaleca korzystanie z narzędzi zapewniających bezpieczeństwo pamięci podczas programowania.
Ściśle współpracujemy z naszym ekosystemem, aby zwiększyć wykorzystanie narzędzi zapewniających bezpieczeństwo pamięci i zintegrować je z procesami ciągłej integracji i testowania.
Z biegiem czasu chcielibyśmy mieć pewność, że każde urządzenie przejdzie pełny pakiet testów zgodności ( CTS ) przy użyciu narzędzi zabezpieczających pamięć, który wykaże, że nie znaleziono takich błędów. Na przykład platformy Arm v9 będą wymagane do zapewnienia uruchomienia CTS z włączoną funkcją Memory Tagging, podczas gdy platformy Arm v8 będą wymagane do zapewnienia uruchomienia CTS przy użyciu HWASAN i KASAN.

Rust jako nowy język programowania dla kodu platformy

W Androidzie 12 wprowadzono Rust jako język platformy . Rust zapewnia bezpieczeństwo pamięci i wątków na poziomie wydajności podobnym do C/C++. Oczekujemy, że Rust będzie preferowanym wyborem w przypadku większości nowych projektów natywnych. Jednak przepisanie całego kodu niebezpiecznego dla pamięci, który obecnie stanowi ponad 70% kodu platformy Android, w Rust jest niewykonalne. Idąc dalej, Rust będzie uzupełnieniem narzędzi zapewniających bezpieczeństwo pamięci.

Narzędzia zabezpieczające pamięć

Android obsługuje szeroką gamę narzędzi pomagających wykryć błędy związane z bezpieczeństwem pamięci. Poniższy rysunek przedstawia taksonomię dostępnych narzędzi zapewniających bezpieczeństwo pamięci Androida.

Błędy bezpieczeństwa pamięci negatywnie wpływają na bezpieczeństwo.
Rysunek 3 : Krajobraz narzędzi zapewniających bezpieczeństwo pamięci Androida

Nasze narzędzia obejmują szeroką gamę scenariuszy i celów wdrożeniowych. Poniższa dokumentacja opisuje każde narzędzie i zawiera informacje dotyczące ich stosowania w produktach.