Ta sekcja zawiera rekomendacje dotyczące zapewnienia bezpieczeństwa aplikacji na urządzeniach z Androidem.
Weryfikacja kodu źródłowego
Weryfikacja kodu źródłowego może wykryć wiele problemów z bezpieczeństwem, w tym te wymienione w tym dokumencie. Android zdecydowanie zaleca zarówno ręczny, jak i automatyczny przegląd kodu źródłowego.
- Podczas przeprowadzania kontroli przestrzegaj kompleksowych wytycznych dotyczących bezpieczeństwa, aby zapewnić kompleksową ochronę. Stosuj odpowiednie standardy wewnętrzne lub zewnętrzne, aby zapewnić spójne i pełne przeglądy.
- Uruchom linter, np. linter Android Studio, na całym kodzie aplikacji korzystającym z Android SDK i popraw wszystkie wykryte problemy.
- Analizuj kod natywny za pomocą automatycznego narzędzia, które może wykrywać problemy z zarządzaniem pamięci, takie jak przepełnienie bufora i błędy typu off-by-one.
- System kompilacji Androida obsługuje wiele narzędzi do sprawdzania LLVM, takich jak AddressSanitizer i UndefinedBehaviorSanitizer, które można wykorzystać do analizy problemów związanych z pamięcią w czasie wykonywania. W połączeniu z fuzzingiem (obsługiwanym w Androidzie przez libFuzzer) walidatory mogą wykrywać nietypowe przypadki wymagające dalszego zbadania.
- Doświadczony audytor bezpieczeństwa powinien sprawdzić kod o wyższym poziomie ryzyka, taki jak kryptowaluty, przetwarzanie płatności i przetwarzanie danych osobowych.
Testowanie automatyczne
Testy automatyczne mogą pomóc wykryć wiele problemów z zabezpieczeniami i powinny być przeprowadzane regularnie.
- Regularnie uruchamiaj najnowszą wersję CTS w trakcie całego procesu tworzenia, aby wcześnie wykrywać problemy i skracać czas potrzebny na ich rozwiązanie. Android używa CTS w ramach ciągłej integracji w zautomatyzowanym procesie kompilacji, który jest wykonywany wielokrotnie w ciągu dnia.
- Automatyzowanie testowania zabezpieczeń interfejsów, w tym testowania z nieprawidłowymi danymi wejściowymi (testowanie nieprawidłowego działania). System kompilacji Androida obsługuje bibliotekę libFuzzer do pisania testów fuzzingu.
Skanowanie pod kątem luk w zabezpieczeniach
Skanowanie pod kątem luk w zabezpieczeniach może pomóc w uniknięciu znanych luk w zabezpieczeniach w wstępnie zainstalowanych aplikacjach. Zaawansowane wykrywanie może skrócić czas i zredukować koszty związane z eliminowaniem tych luk w zabezpieczeniach oraz zapobieganiem zagrożeniom dla użytkowników i urządzeń.
- Skanowanie wszystkich wstępnie zainstalowanych aplikacji za pomocą uznanego w branży narzędzia do skanowania aplikacji pod kątem luk w zabezpieczeniach i usuwanie wykrytych luk.
Potencjalnie szkodliwe aplikacje
Upewnij się, że wstępnie zainstalowane aplikacje na urządzeniu nie są potencjalnie szkodliwymi aplikacjami (PHA). Odpowiadasz za działanie wszystkich aplikacji zainstalowanych na Twoich urządzeniach. Przed uruchomieniem urządzenia sprawdź, czy w zainstalowanych aplikacjach nie ma luk w zabezpieczeniach.
Więcej informacji o potencjalnie szkodliwych aplikacjach i o tym, jak Google zwalcza je w Sklepie Play, znajdziesz w dokumentacji dla deweloperów Google Play Protect.
Instalowanie aplikacji i uprawnienia
Nadmierne uprawnienia w przypadku wstępnie zainstalowanych aplikacji mogą stanowić zagrożenie dla bezpieczeństwa. Ogranicz wstępnie zainstalowane aplikacje do minimalnego zestawu uprawnień i upewnij się, że nie mają dostępu do niepotrzebnych uprawnień ani przywilejów. Uprawnienia aplikacji są opisane w pliku AndroidManifest.xml.
- Nie przyznawaj niepotrzebnych uprawnień w przypadku wstępnie zainstalowanych aplikacji. Dokładnie sprawdź aplikacje z uprawnieniami systemowymi, ponieważ mogą one mieć bardzo wrażliwe uprawnienia.
- Upewnij się, że wszystkie wymagane uprawnienia są odpowiednie i niezbędne do działania danej aplikacji.
- Zadbaj o to, aby w przypadku wszystkich wstępnie zainstalowanych aplikacji, które korzystają z uprawnień
INSTALL_PACKAGES
, użytkownicy byli informowani o tym. - Upewnij się, że deweloper jest zobowiązany umową do nieinstalowania żadnych aplikacji z identyfikatorem UID 0.
- Oceniać uprawnienia zadeklarowane w pliku manifestu wszystkich aplikacji, które mają być zainstalowane przez sieć dewelopera.
- Upewnij się, że deweloper jest zobowiązany skanować wszystkie adresy URL pobierania aplikacji do automatycznej aktualizacji i instalatora za pomocą interfejsu Google Safe Browsing API przed udostępnieniem aplikacji na urządzeniu.
Podpisywanie aplikacji
Podpisy aplikacji odgrywają ważną rolę w zabezpieczeniu urządzenia i służą do sprawdzania uprawnień oraz aktualizacji oprogramowania. Wybierając klucz do podpisywania aplikacji, weź pod uwagę, czy aplikacja jest dostępna tylko na jednym urządzeniu, czy na wielu urządzeniach.
- Upewnij się, że aplikacje nie są podpisane kluczem publicznym, takim jak klucz dewelopera AOSP.
- Zadbaj o to, aby klucze używane do podpisywania aplikacji były zarządzane zgodnie ze standardowymi metodami postępowania z kluczami poufnymi, w tym z modułem zabezpieczeń sprzętowych (HSM), który zapewnia ograniczony, możliwy do zweryfikowania dostęp.
- Upewnij się, że aplikacje nie są podpisane kluczem platformy. Daje to aplikacji dostęp do uprawnień do podpisywania platformy, które są bardzo zaawansowane i przeznaczone tylko do użytku przez komponenty systemu operacyjnego. Aplikacje systemowe powinny używać uprawnień uprzywilejowanych.
- Upewnij się, że aplikacje o tej samej nazwie pakietu nie są podpisane różnymi kluczami. Zdarza się to często podczas tworzenia aplikacji na różne urządzenia, zwłaszcza gdy używasz klucza platformy. Jeśli aplikacja nie jest powiązana z urządzeniem, używaj tego samego klucza na wszystkich urządzeniach. Jeśli aplikacja jest przeznaczona dla konkretnego urządzenia, utwórz unikalne nazwy pakietów dla każdego urządzenia i klucza.
Izolowanie aplikacji i procesów
Model piaskownicy w Androidzie zapewnia dodatkową ochronę aplikacji i procesów, jeśli są używane prawidłowo.
Izolowanie procesów root
Procesy root są najczęściej atakowane w celu podniesienia uprawnień. Zmniejszenie liczby procesów root zmniejsza ryzyko podniesienia uprawnień.
- Upewnij się, że na urządzeniach jest uruchamiany minimalny niezbędny kod jako root. W miarę możliwości używaj zwykłego procesu Androida zamiast procesu root. Jeśli proces musi być wykonywany na urządzeniu jako root, udokumentuj go w prośbie o funkcję w AOSP, aby można było go publicznie sprawdzić.
- W miarę możliwości kod roota należy odizolować od niesprawdzonych danych i dostępu do nich za pomocą komunikacji międzyprocesowej (IPC). Na przykład możesz ograniczyć funkcjonalność roota do niewielkiej usługi dostępnej przez Bindera i ujawnić tę usługę z uprawnieniem dotyczącym podpisu aplikacji z niewielkimi lub zerowymi uprawnieniami do obsługi ruchu sieciowego.
- Procesy root nie mogą nasłuchiwać na gniazdach sieciowych.
- Procesy główne nie mogą zawierać środowiska wykonawczego ogólnego przeznaczenia, takiego jak maszyna wirtualna Java.
Izolowanie aplikacji systemowych
Zainstalowane fabrycznie aplikacje nie powinny działać z użyciem wspólnego identyfikatora (UID) systemu. Jeśli aplikacja musi używać wspólnego identyfikatora UID systemu lub innej uprzywilejowanej usługi (np. telefonu), nie może eksportować żadnych usług, odbiorników transmisji ani dostawców treści, do których dostęp mają aplikacje innych firm zainstalowane przez użytkowników.
- Zapewnij, aby urządzenia uruchamiały minimalny wymagany kod jako system. W miarę możliwości używaj procesu Androida z własnym identyfikatorem UID zamiast ponownie używać identyfikatora UID systemu.
- W miarę możliwości kod systemu powinien być odizolowany od niesprawdzonych danych i przekazywać interfejs IPC tylko zaufanym procesom.
- Procesy systemowe nie mogą nasłuchiwać na gniazdach sieciowych. Jest to wymóg CTS.
Izolowanie procesów
Piaskownica aplikacji na Androida zapewnia aplikacjom odizolowanie od innych procesów w systemie, w tym od procesów roota i debugerów. O ile nie jest to wyraźnie określone przez aplikację i użytkownika, żadna aplikacja nie powinna naruszać tego założenia.
- Upewnij się, że procesy roota nie mają dostępu do danych w poszczególnych folderach danych aplikacji, chyba że używasz udokumentowanej metody debugowania Androida.
- Upewnij się, że procesy root nie mają dostępu do pamięci aplikacji, chyba że używasz udokumentowanej metody debugowania Androida.
- Upewnij się, że na urządzeniach nie ma żadnych aplikacji, które uzyskują dostęp do danych lub pamięci innych aplikacji lub procesów.