Najlepsze praktyki dotyczące bezpieczeństwa aplikacji

W tej sekcji znajdują się zalecenia mające na celu zapewnienie bezpieczeństwa aplikacji na urządzeniach z systemem Android.

Przegląd kodu źródłowego

Przegląd kodu źródłowego może wykryć szeroki zakres problemów związanych z bezpieczeństwem, w tym te zidentyfikowane w tym dokumencie. Android zdecydowanie zachęca do ręcznego i automatycznego sprawdzania kodu źródłowego.

  • Podczas przeprowadzania przeglądów postępuj zgodnie z kompleksowymi wytycznymi dotyczącymi bezpieczeństwa, aby zapewnić ochronę. Korzystaj z odpowiednich standardów wewnętrznych lub zewnętrznych, aby zapewnić spójne i kompletne recenzje.
  • Uruchom linter, taki jak linter Android Studio , na całym kodzie aplikacji przy użyciu zestawu SDK systemu Android i napraw wszelkie zidentyfikowane problemy.
  • Analizuj kod natywny za pomocą zautomatyzowanego narzędzia, które może wykryć problemy z zarządzaniem pamięcią, takie jak przepełnienia bufora i błędy „off-by-one”.
  • System kompilacji Androida obsługuje wiele narzędzi dezynfekcyjnych LLVM, takich jak AddressSanitizer i UnknownBehaviorSanitizer , których można używać do analizy problemów związanych z pamięcią w czasie wykonywania. W połączeniu z fuzzingiem, obsługiwanym w systemie Android za pośrednictwem biblioteki libFuzzer , środki dezynfekujące mogą wykryć nietypowe przypadki brzegowe wymagające dalszego zbadania.
  • Doświadczony audytor bezpieczeństwa powinien dokonać przeglądu kodów o podwyższonym ryzyku, takich jak kryptowaluty, przetwarzanie płatności i przetwarzanie danych osobowych.

Zautomatyzowane testowanie

Zautomatyzowane testy mogą pomóc w wykryciu szerokiego zakresu problemów związanych z bezpieczeństwem i powinny być przeprowadzane regularnie.

  • Regularnie uruchamiaj najnowszą wersję CTS przez cały proces programowania, aby wcześnie wykryć problemy i skrócić czas wprowadzania poprawek. Android korzysta z CTS w ramach ciągłej integracji w naszym zautomatyzowanym procesie kompilacji, który jest tworzony wiele razy dziennie.
  • Automatyzuj testy bezpieczeństwa interfejsów, w tym testowanie ze zniekształconymi danymi wejściowymi (testy fuzz). System kompilacji Androida obsługuje bibliotekę libFuzzer do pisania testów rozmytych.

Skanowanie podatności

Skanowanie pod kątem luk w zabezpieczeniach może pomóc upewnić się, że preinstalowane aplikacje są wolne od znanych luk w zabezpieczeniach. Zaawansowane wykrywanie może skrócić czas i koszty potrzebne do usunięcia tych luk i zapobiegania zagrożeniom dla użytkowników i urządzeń.

  • Skanuj wszystkie wstępnie zainstalowane aplikacje za pomocą uznanego w branży narzędzia do skanowania pod kątem luk w zabezpieczeniach aplikacji i usuwaj wykryte luki.

Potencjalnie szkodliwe aplikacje

Ważne jest, aby upewnić się, że aplikacje zainstalowane fabrycznie na urządzeniu nie są aplikacjami potencjalnie szkodliwymi (PHA). Ponosisz odpowiedzialność za zachowanie wszystkich aplikacji znajdujących się na Twoich urządzeniach. Przed uruchomieniem urządzenia przeskanuj wszystkie wstępnie załadowane aplikacje pod kątem luk w zabezpieczeniach.

Więcej informacji na temat PHA i tego, jak Google walczy z nimi w Sklepie Play, znajdziesz w dokumentacji dla programistów Google Play Protect .

Instalacja aplikacji i uprawnienia

Nadmierne uprawnienia dla wstępnie zainstalowanych aplikacji mogą stwarzać zagrożenie bezpieczeństwa. Ogranicz preinstalowane aplikacje do minimalnych niezbędnych uprawnień i upewnij się, że nie mają one dostępu do niepotrzebnych uprawnień ani przywilejów. Uprawnienia aplikacji są opisane w pliku AndroidManifest.xml .

  • Nie nadawaj niepotrzebnych uprawnień ani uprawnień wstępnie zainstalowanym aplikacjom. Dokładnie sprawdź aplikacje z uprawnieniami systemowymi, ponieważ mogą mieć bardzo wrażliwe uprawnienia.
  • Upewnij się, że wszystkie wymagane uprawnienia są odpowiednie i niezbędne do działania tej konkretnej aplikacji.
  • Upewnij się, że wszystkie preinstalowane aplikacje, które korzystają z uprawnienia INSTALL_PACKAGES , zostały ujawnione użytkownikom.
  • Upewnij się, że programista jest zobowiązany umową do nieinstalowania żadnych aplikacji o identyfikatorze UID 0.
  • Oceń uprawnienia zadeklarowane w manifeście wszystkich aplikacji, które mają zostać zainstalowane za pośrednictwem sieci programisty.
  • Upewnij się, że programista jest zobowiązany umową do skanowania wszystkich adresów URL pobierania aplikacji z automatyczną aktualizacją i instalatorem za pomocą interfejsu API Google Safe Browsing przed udostępnieniem aplikacji na urządzeniu.

Podpisywanie aplikacji

Podpisy aplikacji odgrywają ważną rolę w bezpieczeństwie urządzenia i służą do sprawdzania uprawnień i aktualizacji oprogramowania. Wybierając klucz do podpisywania aplikacji, należy wziąć pod uwagę, czy aplikacja będzie dostępna tylko na jednym urządzeniu, czy będzie wspólna dla wielu urządzeń.

  • Upewnij się, że aplikacje nie są podpisane przy użyciu publicznie znanego klucza, takiego jak klucz programisty AOSP.
  • Upewnij się, że klucze używane do podpisywania aplikacji są zarządzane w sposób zgodny ze standardowymi praktykami branżowymi dotyczącymi obsługi poufnych kluczy, w tym ze sprzętowym modułem zabezpieczeń (HSM), który zapewnia ograniczony dostęp podlegający kontroli.
  • Upewnij się, że aplikacje nie są podpisane kluczem platformy. Dzięki temu aplikacja uzyska dostęp do uprawnień podpisu platformy, które są bardzo potężne i przeznaczone do użytku wyłącznie przez składniki systemu operacyjnego. Aplikacje systemowe powinny korzystać z uprawnień uprzywilejowanych.
  • Upewnij się, że aplikacje o tej samej nazwie pakietu nie są podpisane różnymi kluczami. Często zdarza się to podczas tworzenia aplikacji na różne urządzenia, szczególnie przy korzystaniu z klucza platformy. Jeśli aplikacja jest niezależna od urządzenia, użyj tego samego klucza na wszystkich urządzeniach. Jeśli aplikacja jest specyficzna dla urządzenia, utwórz unikalne nazwy pakietów dla każdego urządzenia i klucza.

Izolowanie aplikacji i procesów

Model piaskownicy w systemie Android zapewnia dodatkowe bezpieczeństwo aplikacji i procesów, jeśli jest prawidłowo używany.

Izolowanie procesów korzeniowych

Procesy root są najczęstszym celem ataków polegających na eskalacji uprawnień; zmniejszenie liczby procesów root zmniejsza ryzyko eskalacji uprawnień.

  • Upewnij się, że urządzenia uruchamiają minimalny niezbędny kod jako root. Jeśli to możliwe, używaj zwykłego procesu Androida zamiast procesu rootowania. Jeśli proces musi działać na urządzeniu jako root, udokumentuj go w żądaniu funkcji AOSP, aby można było go publicznie przejrzeć.
  • Tam, gdzie to możliwe, kod główny powinien być odizolowany od niezaufanych danych i dostępny za pośrednictwem komunikacji międzyprocesowej (IPC). Na przykład zmniejsz funkcjonalność roota do małej usługi dostępnej za pośrednictwem Bindera i udostępnij usługę z uprawnieniami do podpisu aplikacji z niskimi uprawnieniami lub bez nich do obsługi ruchu sieciowego.
  • Procesy root nie mogą nasłuchiwać na gnieździe sieciowym.
  • Procesy główne nie mogą obejmować środowiska wykonawczego ogólnego przeznaczenia, takiego jak maszyna wirtualna Java).

Izolowanie aplikacji systemowych

Ogólnie rzecz biorąc, wstępnie zainstalowane aplikacje nie powinny działać ze wspólnym unikalnym identyfikatorem systemu (UID). Jeśli konieczne jest, aby aplikacja korzystała ze wspólnego UID systemu lub innej uprzywilejowanej usługi (np. telefonu), aplikacja nie powinna eksportować żadnych usług, odbiorników transmisji ani dostawców treści, do których mogą uzyskać dostęp aplikacje innych firm zainstalowane przez użytkowników .

  • Upewnij się, że urządzenia uruchamiają minimalny niezbędny kod jako system. Jeśli to możliwe, używaj procesu Androida z własnym UID, zamiast ponownie używać systemowego UID.
  • Tam, gdzie to możliwe, kod systemowy powinien być odizolowany od niezaufanych danych i udostępniać IPC tylko innym zaufanym procesom.
  • Procesy systemowe nie mogą nasłuchiwać na gnieździe sieciowym. Jest to wymóg CTS.

Izolowanie procesów

Piaskownica aplikacji dla systemu Android zapewnia aplikacjom oczekiwanie izolacji od innych procesów w systemie, w tym procesów głównych i debugerów. Żadna aplikacja nie powinna naruszać tych oczekiwań, chyba że aplikacja i użytkownik specjalnie włączą debugowanie.

  • Upewnij się, że procesy główne nie uzyskują dostępu do danych w poszczególnych folderach danych aplikacji, chyba że korzystają z udokumentowanej metody debugowania systemu Android.
  • Upewnij się, że procesy root nie uzyskują dostępu do pamięci aplikacji, chyba że korzystają z udokumentowanej metody debugowania Androida.
  • Upewnij się, że na urządzeniach nie ma żadnej aplikacji uzyskującej dostęp do danych lub pamięci innych aplikacji lub procesów.