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 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.
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.
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.