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.
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.
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 Chrome i Microsoftu), 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.

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.