Bezpieczeństwo pamięci

Na tej stronie opisujemy błędy związane z bezpieczeństwem pamięci i narzędzia do ich wykrywania.

Brak bezpieczeństwa pamięci

Błędy związane z bezpieczeństwem pamięci, czyli błędy w obsłudze pamięci w natywnych językach programowania, są najczęstszym problemem w bazach kodu Androida. Stanowią one ponad 60% luk w zabezpieczeniach o dużej wadze i są przyczyną milionów awarii widocznych dla użytkowników.

 Błędy związane z bezpieczeństwem pamięci mają wpływ na wygodę użytkowników, koszty i bezpieczeństwo.

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

Błędy związane z bezpieczeństwem pamięci negatywnie wpływają na jakość i stabilność oraz stanowią znaczną część awarii obserwowanych na urządzeniach użytkowników. Dlatego duża liczba błędów związanych z bezpieczeństwem pamięci jest bezpośrednio powiązana z niskim komfortem użytkowania.
Kod natywny napisany w językach niebezpiecznych pod względem zarządzania pamięcią, takich jak C, C++ i Assembly, stanowi ponad 70% kodu platformy Android i jest obecny w około 50% aplikacji w Sklepie Google Play.
Biorąc pod uwagę stale rosnącą złożoność kodu, jeśli nie zostaną podjęte odpowiednie działania, błędy związane z bezpieczeństwem pamięci będą z czasem narastać. Dlatego udostępnianie naszego ekosystemu narzędzi i technologii, które mogą wykrywać i ograniczać takie błędy, ma kluczowe znaczenie dla naszego długoterminowego sukcesu.
W ciągu ostatnich kilku lat ściśle współpracowaliśmy z naszymi partnerami w zakresie sprzętu, aby opracować technologie sprzętowe, takie jak tagowanie pamięci Arm, oraz wprowadziliśmy język Rust do bazy kodu Androida.
Te technologie przyspieszą nasze działania na rzecz bezpieczeństwa pamięci i pomogą całej branży oprogramowania w rozwiązaniu kluczowego problemu.

Błędy związane z bezpieczeństwem pamięci negatywnie wpływają na jakość

Ukryte błędy związane z bezpieczeństwem pamięci mogą powodować niedeterministyczne wyniki w zależności od stanu systemu. Takie nieprzewidywalne działanie powoduje awarie i irytuje użytkowników.

Codziennie obserwujemy miliony awarii natywnych na urządzeniach użytkowników. Wprowadzenie GWP-ASan pozwoliło nam powiązać większość z nich z błędami bezpieczeństwa 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 zespołu Chrome (patrz lista najczęstszych błędów GWP-ASan w Chrome).

Błędy związane z bezpieczeństwem pamięci negatywnie wpływają na bezpieczeństwo

Błędy związane z bezpieczeństwem pamięci od samego początku były główną przyczyną luk w zabezpieczeniach Androida.

Błędy związane z bezpieczeństwem pamięci negatywnie wpływają na bezpieczeństwo.

Rysunek 2. Błędy związane z bezpieczeństwem pamięci przyczyniają się do powstawania luk w zabezpieczeniach Androida.

To dobrze, że nie jest to tylko problem Androida (zobacz statystyki dotyczące ChromeMicrosoftu), ale musimy zrobić więcej, aby zapewnić bezpieczeństwo naszym użytkownikom.
Zespół Project Zero w Google śledzi exploity typu zero-day, które były używane w prawdziwych atakach na użytkowników jako luki w zabezpieczeniach typu zero-day. Nie są to hipotetyczne błędy, ale luki w zabezpieczeniach aktywnie wykorzystywane w atakach na użytkowników. Błędy związane z bezpieczeństwem pamięci (uszkodzenie pamięci i odwołanie do pamięci po jej zwolnieniu) stanowią zdecydowaną większość.

Błędy związane z bezpieczeństwem pamięci zwiększają koszty

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

Duża liczba 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 poprawek i testów. Wykrycie tych błędów na wczesnym etapie cyklu rozwoju może jednak obniżyć te koszty.

Badania wykazują, że wykrywanie błędów na wcześniejszym etapie może zmniejszyć koszty nawet 6-krotnie. Biorąc jednak pod uwagę złożoność naszego ekosystemu, średnią liczbę baz kodu utrzymywanych przez dostawcę i stale rosnącą złożoność oprogramowania, oszczędności mogą być większe.

Bezpieczeństwo pamięci

Android 12 i nowsze wersje zawierają systemowe zmiany, które zmniejszają gęstość błędów związanych z bezpieczeństwem pamięci w bazach kodu Androida. Rozszerzamy zakres narzędzi do zapewniania bezpieczeństwa pamięci na Androidzie i wprowadzamy nowe wymagania, które zachęcają nasz ekosystem do rozwiązywania problemów z tą kategorią błędów. Z czasem 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 najbliższych latach czynnikiem wyróżniającym jakość i bezpieczeństwo, a Android planuje być w tym zakresie liderem.

Wymagania dotyczące bezpieczeństwa pamięci

Dokument definicji zgodności Androida (CDD) zdecydowanie zaleca używanie narzędzi do zapewniania bezpieczeństwa pamięci podczas tworzenia aplikacji.

Ściśle współpracujemy z naszym ekosystemem, aby zwiększyć wykorzystanie narzędzi do zapewniania bezpieczeństwa pamięci i zintegrować je z procesami trybu ciągłej integracji i testowania.

Z czasem chcemy mieć pewność, że każde urządzenie przejdzie pełny Compatibility Test Suite (CTS) z użyciem narzędzi do sprawdzania bezpieczeństwa pamięci, co będzie dowodem na to, że nie znaleziono żadnych błędów. Na przykład platformy Arm v9 będą musiały przeprowadzić test CTS z włączonym tagowaniem pamięci, a platformy Arm v8 będą musiały przeprowadzić test CTS z użyciem HWASAN i KASAN.

Rust jako nowy język programowania kodu platformy

W Androidzie 12 wprowadzono język Rust jako język platformy. Rust zapewnia bezpieczeństwo pamięci i wątków na poziomie wydajności podobnym do C/C++. Spodziewamy się, że Rust będzie preferowanym wyborem w przypadku większości nowych projektów natywnych. Przepisanie w Rust wszystkich fragmentów kodu, które nie są bezpieczne pod względem zarządzania pamięcią, a które obecnie stanowią ponad 70% kodu platformy Android, nie jest jednak możliwe. W przyszłości język Rust będzie uzupełniać narzędzia zapewniające bezpieczeństwo pamięci.

Narzędzia do zapewniania bezpieczeństwa pamięci

Android obsługuje wiele narzędzi, które pomagają wykrywać błędy związane z bezpieczeństwem pamięci. Na rysunku poniżej przedstawiono taksonomię dostępnych narzędzi do zapewniania bezpieczeństwa pamięci w Androidzie.

Błędy związane z bezpieczeństwem pamięci negatywnie wpływają na bezpieczeństwo.

Rysunek 3. Przegląd narzędzi do zapewniania bezpieczeństwa pamięci na Androidzie.

Nasze narzędzia obejmują szeroki zakres scenariuszy i celów wdrażania. Dokumentacja w tej sekcji zawiera opis każdego narzędzia i informacje o tym, jak używać go w swoich usługach.