Bezpieczeństwo aplikacji

Elementy zastosowań

Android zapewnia platformę open source i środowisko aplikacji dla urządzeń mobilnych. Podstawowy system operacyjny oparty jest na jądrze Linuksa. Aplikacje na Androida są najczęściej pisane w języku programowania Java i uruchamiane na maszynie wirtualnej Android Runtime (ART). Jednak aplikacje można również pisać w kodzie natywnym. Aplikacje instaluje się z jednego pliku z rozszerzeniem .apk.

Główne elementy składowe aplikacji na Androida to:

  • AndroidManifest.xml : plik AndroidManifest.xml to plik sterujący, który informuje system, co ma zrobić ze wszystkimi komponentami najwyższego poziomu (w szczególności działaniami, usługami, odbiornikami transmisji i dostawcami treści opisanymi poniżej) w aplikacji. Określa również, które uprawnienia są wymagane.

  • Działania : Działanie to ogólnie kod pojedynczego zadania skupionego na użytkowniku. Zwykle obejmuje to wyświetlenie interfejsu użytkownika użytkownikowi, ale nie jest to konieczne — niektóre działania nigdy nie wyświetlają interfejsu użytkownika. Zazwyczaj jedno z działań aplikacji jest punktem wejścia do aplikacji.

  • Usługi : Usługa to fragment kodu działający w tle. Może działać we własnym procesie lub w kontekście procesu innej aplikacji. Inne komponenty „wiążą się” z usługą i wywołują na niej metody poprzez zdalne wywołania procedur. Przykładem usługi jest odtwarzacz multimedialny: nawet jeśli użytkownik opuści interfejs użytkownika umożliwiający wybór multimediów, prawdopodobnie nadal zamierza odtwarzać muzykę. Usługa utrzymuje muzykę nawet po zakończeniu działania interfejsu użytkownika.

  • Odbiornik rozgłoszeniowy : Odbiornik rozgłoszeniowy to obiekt, którego instancja jest tworzona, gdy system operacyjny lub inna aplikacja uruchamia mechanizm IPC znany jako Intent . Aplikacja może na przykład zarejestrować odbiorcę komunikatu o niskim stanie baterii i na podstawie tej informacji zmienić jego zachowanie.

Model uprawnień Androida: dostęp do chronionych interfejsów API

Wszystkie aplikacje na Androida działają w piaskownicy aplikacji . Domyślnie aplikacja na Androida może uzyskać dostęp tylko do ograniczonego zakresu zasobów systemowych. System zarządza dostępem aplikacji Android do zasobów, które w przypadku nieprawidłowego lub złośliwego wykorzystania mogą mieć niekorzystny wpływ na wygodę użytkownika, sieć lub dane na urządzeniu.

Ograniczenia te są wdrażane w różnych formach. Niektóre możliwości są ograniczone celowym brakiem interfejsów API dla wrażliwych funkcjonalności (np. brak interfejsu API systemu Android umożliwiającego bezpośrednie manipulowanie kartą SIM). W niektórych przypadkach rozdzielenie ról stanowi środek bezpieczeństwa, podobnie jak izolacja pamięci masowej dla poszczególnych aplikacji. W innych przypadkach wrażliwe interfejsy API są przeznaczone do użytku przez zaufane aplikacje i chronione za pomocą mechanizmu bezpieczeństwa zwanego uprawnieniami.

Te chronione interfejsy API obejmują:

  • Funkcje aparatu
  • Dane lokalizacyjne (GPS)
  • Funkcje Bluetooth
  • Funkcje telefoniczne
  • Funkcje SMS/MMS
  • Połączenia sieciowe/danych

Zasoby te są dostępne wyłącznie za pośrednictwem systemu operacyjnego. Aby móc korzystać z chronionych interfejsów API na urządzeniu, aplikacja musi zdefiniować w swoim manifeście potrzebne jej możliwości. Wszystkie wersje Androida 6.0 i nowsze korzystają z modelu uprawnień wykonawczych . Jeśli użytkownik zażąda funkcji z aplikacji wymagającej chronionego interfejsu API, system wyświetli okno dialogowe z monitem o odmowę lub zezwolenie na pozwolenie.

Po przyznaniu uprawnienia są stosowane do aplikacji, o ile jest ona zainstalowana. Aby uniknąć dezorientacji użytkownika, system nie powiadamia go ponownie o uprawnieniach przyznanych aplikacji, a aplikacje zawarte w podstawowym systemie operacyjnym lub dostarczane przez producenta OEM nie żądają uprawnień od użytkownika. Uprawnienia są usuwane w przypadku odinstalowania aplikacji, więc kolejna ponowna instalacja ponownie spowoduje wyświetlenie uprawnień.

W ustawieniach urządzenia użytkownicy mogą przeglądać uprawnienia zainstalowanych wcześniej aplikacji. Użytkownicy mogą także według własnego uznania wyłączyć niektóre funkcje globalnie, na przykład wyłączyć GPS, radio lub Wi-Fi.

W przypadku, gdy aplikacja próbuje użyć chronionej funkcji, która nie została zadeklarowana w manifeście aplikacji, błąd uprawnień zazwyczaj skutkuje zwróceniem wyjątku bezpieczeństwa do aplikacji. Kontrole uprawnień chronionych interfejsów API są egzekwowane na najniższym możliwym poziomie, aby zapobiec obchodzeniu przepisów. Przykład komunikatu użytkownika podczas instalacji aplikacji, żądającego dostępu do chronionych interfejsów API, pokazano na rysunku 2 .

Domyślne uprawnienia systemowe opisano pod adresem https://developer.android.com/reference/android/Manifest.permission.html . Aplikacje mogą deklarować własne uprawnienia do korzystania z innych aplikacji. Takie uprawnienia nie są wymienione w powyższej lokalizacji.

Podczas definiowania uprawnienia atrybut ProtectionLevel informuje system, w jaki sposób użytkownik ma być informowany o aplikacjach wymagających pozwolenia lub o tym, kto może je posiadać. Szczegóły dotyczące tworzenia i używania uprawnień specyficznych dla aplikacji opisano na stronie https://developer.android.com/guide/topics/security/security.html .

Istnieją pewne możliwości urządzenia, takie jak możliwość wysyłania komunikatów SMS, które nie są dostępne dla aplikacji innych firm, ale mogą być wykorzystywane przez aplikacje preinstalowane przez producenta OEM. Te uprawnienia korzystają z uprawnienia podpisOrSystem.

Jak użytkownicy rozumieją aplikacje innych firm

Android stara się wyraźnie informować użytkowników o interakcji z aplikacjami innych firm i informować ich o możliwościach tych aplikacji. Przed zainstalowaniem dowolnej aplikacji użytkownikowi wyświetlany jest wyraźny komunikat o różnych uprawnieniach, których żąda aplikacja. Po instalacji użytkownik nie jest już proszony o potwierdzenie jakichkolwiek uprawnień.

Istnieje wiele powodów, dla których warto pokazywać uprawnienia bezpośrednio przed instalacją. Dzieje się tak, gdy użytkownik aktywnie przegląda informacje o aplikacji, deweloperze i funkcjonalnościach, aby określić, czy odpowiadają one jego potrzebom i oczekiwaniom. Ważne jest również, aby nie zaangażowali się jeszcze mentalnie ani finansowo w aplikację i mogli łatwo porównać aplikację z innymi alternatywnymi aplikacjami.

Niektóre inne platformy stosują inne podejście do powiadamiania użytkowników, prosząc o pozwolenie na początku każdej sesji lub podczas używania aplikacji. Wizją Androida jest umożliwienie użytkownikom płynnego przełączania się między aplikacjami w dowolnym momencie. Za każdym razem potwierdzanie mogłoby spowolnić działanie użytkownika i uniemożliwić Androidowi zapewnienie doskonałej obsługi. Posiadanie uprawnień do przeglądu przez użytkownika w czasie instalacji daje mu możliwość nieinstalowania aplikacji, jeśli czuje się niekomfortowo.

Ponadto wiele badań interfejsu użytkownika wykazało, że nadmierne monitowanie użytkownika powoduje, że zaczyna on mówić „OK” w każdym wyświetlonym oknie dialogowym. Jednym z celów bezpieczeństwa Androida jest skuteczne przekazywanie użytkownikowi ważnych informacji dotyczących bezpieczeństwa, czego nie można zrobić za pomocą okien dialogowych, które użytkownik zostanie przeszkolony w zakresie ignorowania. Prezentując ważne informacje raz i tylko wtedy, gdy jest to istotne, użytkownik chętniej zastanowi się nad tym, na co się zgadza.

Niektóre platformy decydują się w ogóle nie wyświetlać żadnych informacji na temat funkcjonalności aplikacji. Takie podejście uniemożliwia użytkownikom łatwe zrozumienie i omówienie możliwości aplikacji. Chociaż nie jest możliwe, aby wszyscy użytkownicy zawsze podejmowali w pełni świadome decyzje, model uprawnień systemu Android sprawia, że ​​informacje o aplikacjach są łatwo dostępne dla szerokiego grona użytkowników. Na przykład nieoczekiwane prośby o uprawnienia mogą skłonić bardziej zaawansowanych użytkowników do zadawania krytycznych pytań na temat funkcjonalności aplikacji i dzielenia się swoimi wątpliwościami w miejscach takich jak Google Play , gdzie są widoczne dla wszystkich użytkowników.

Uprawnienia przy instalacji aplikacji — Tłumacz Google Uprawnienia zainstalowanej aplikacji — Gmail
Uprawnienia przy instalacji aplikacji — Tłumacz GoogleUprawnienia zainstalowanej aplikacji — Gmail

Rysunek 1. Wyświetlanie uprawnień dla aplikacji

Komunikacja międzyprocesowa

Procesy mogą komunikować się przy użyciu dowolnego z tradycyjnych mechanizmów typu UNIX. Przykładami mogą być system plików, gniazda lokalne lub sygnały. Jednak uprawnienia systemu Linux nadal obowiązują.

Android udostępnia także nowe mechanizmy IPC:

  • Binder : lekki, oparty na możliwościach mechanizm zdalnego wywoływania procedur, zaprojektowany z myślą o wysokiej wydajności podczas wykonywania wywołań wewnątrzprocesowych i międzyprocesowych. Binder jest implementowany przy użyciu niestandardowego sterownika dla systemu Linux. Zobacz https://developer.android.com/reference/android/os/Binder.html .

  • Usługi : Usługi (omówione powyżej) mogą zapewniać interfejsy dostępne bezpośrednio za pomocą spoiwa.

  • Intencje : Intencja to prosty obiekt wiadomości, który reprezentuje „zamiar” zrobienia czegoś. Na przykład, jeśli Twoja aplikacja chce wyświetlić stronę internetową, wyraża swój „zamiar” wyświetlenia adresu URL, tworząc instancję Intent i przekazując ją systemowi. System lokalizuje inny fragment kodu (w tym przypadku przeglądarkę), który wie, jak obsłużyć tę intencję, i uruchamia go. Intencji można także używać do rozgłaszania interesujących zdarzeń (takich jak powiadomienia) w całym systemie. Zobacz https://developer.android.com/reference/android/content/Intent.html .

  • ContentProviders : ContentProvider to magazyn danych zapewniający dostęp do danych na urządzeniu; klasycznym przykładem jest ContentProvider używany do uzyskiwania dostępu do listy kontaktów użytkownika. Aplikacja może uzyskiwać dostęp do danych udostępnionych przez inne aplikacje za pośrednictwem obiektu ContentProvider, a aplikacja może także definiować własne elementy ContentProvider w celu udostępniania własnych danych. Zobacz https://developer.android.com/reference/android/content/ContentProvider.html .

Chociaż możliwe jest wdrożenie IPC przy użyciu innych mechanizmów, takich jak gniazda sieciowe lub pliki do zapisu na całym świecie, są to zalecane platformy IPC dla Androida. Programiści Androida będą zachęcani do stosowania najlepszych praktyk w zakresie zabezpieczania danych użytkowników i unikania wprowadzania luk w zabezpieczeniach.

Ekonomiczne interfejsy API

Interfejs API wrażliwy na koszty to dowolna funkcja, która może generować koszty dla użytkownika lub sieci. Platforma Android umieściła wrażliwe kosztowo interfejsy API na liście chronionych interfejsów API kontrolowanych przez system operacyjny. Użytkownik będzie musiał udzielić wyraźnego pozwolenia aplikacjom innych firm żądającym użycia interfejsów API wrażliwych na koszty. Te interfejsy API obejmują:

  • Telefonia
  • SMS/MMS
  • Sieć/dane
  • Rozliczenia w aplikacji
  • Dostęp NFC

Android 4.2 dodaje dalszą kontrolę nad korzystaniem z SMS-ów. Android powiadomi, jeśli aplikacja spróbuje wysłać SMS na krótki kod korzystający z usług premium, co może wiązać się z dodatkowymi opłatami. Użytkownik może wybrać, czy zezwolić aplikacji na wysłanie wiadomości, czy też ją zablokować.

Dostęp do karty SIM

Niski poziom dostępu do karty SIM nie jest dostępny dla aplikacji innych firm. System operacyjny obsługuje całą komunikację z kartą SIM, w tym dostęp do informacji osobistych (kontaktów) w pamięci karty SIM. Aplikacje również nie mają dostępu do poleceń AT, ponieważ są one zarządzane wyłącznie przez warstwę interfejsu radiowego (RIL). RIL nie zapewnia interfejsów API wysokiego poziomu dla tych poleceń.

Informacje osobiste

Android umieścił API zapewniające dostęp do danych użytkownika w zestawie chronionych API. Przy normalnym użytkowaniu urządzenia z systemem Android gromadzą również dane użytkownika w aplikacjach innych firm zainstalowanych przez użytkowników. Aplikacje, które zdecydują się udostępnić te informacje, mogą korzystać ze sprawdzania uprawnień systemu operacyjnego Android, aby chronić dane przed aplikacjami innych firm.

Dostęp do wrażliwych danych użytkownika możliwy wyłącznie poprzez chronione interfejsy API

Rysunek 2. Dostęp do wrażliwych danych użytkownika możliwy jest wyłącznie poprzez chronione API

Dostawcy treści systemowych, którzy mogą zawierać dane osobowe lub umożliwiające identyfikację, takie jak kontakty i kalendarz, zostali utworzeni z wyraźnie określonymi uprawnieniami. Ta szczegółowość zapewnia użytkownikowi jasne wskazanie rodzajów informacji, które mogą być dostarczane do aplikacji. Podczas instalacji aplikacja innej firmy może poprosić o pozwolenie na dostęp do tych zasobów. Jeśli zostanie udzielone pozwolenie, aplikacja będzie mogła zostać zainstalowana i będzie miała dostęp do żądanych danych w dowolnym momencie jej instalacji.

Wszystkie aplikacje zbierające dane osobowe będą domyślnie ograniczać te dane tylko do konkretnej aplikacji. Jeśli aplikacja zdecyduje się udostępnić dane innym aplikacjom za pośrednictwem protokołu IPC, aplikacja udzielająca dostępu może zastosować uprawnienia do mechanizmu IPC wymuszane przez system operacyjny.

Wrażliwe urządzenia do wprowadzania danych

Urządzenia z systemem Android często zapewniają wrażliwe urządzenia do wprowadzania danych, które umożliwiają aplikacjom interakcję z otaczającym środowiskiem, takie jak kamera, mikrofon lub GPS. Aby aplikacja innej firmy mogła uzyskać dostęp do tych urządzeń, użytkownik musi najpierw wyraźnie udzielić dostępu za pomocą uprawnień systemu operacyjnego Android. Podczas instalacji instalator poprosi użytkownika o pozwolenie na użycie czujnika, podając jego nazwę.

Jeśli aplikacja chce poznać lokalizację użytkownika, wymaga pozwolenia na dostęp do lokalizacji użytkownika. Podczas instalacji instalator wyświetli monit z pytaniem, czy aplikacja może uzyskać dostęp do lokalizacji użytkownika. W dowolnym momencie, jeśli użytkownik nie chce, aby jakakolwiek aplikacja miała dostęp do jego lokalizacji, może uruchomić aplikację „Ustawienia”, przejść do zakładki „Lokalizacja i bezpieczeństwo” i odznaczyć opcje „Używaj sieci bezprzewodowych” i „Włącz satelity GPS” . Spowoduje to wyłączenie usług opartych na lokalizacji dla wszystkich aplikacji na urządzeniu użytkownika.

Metadane urządzenia

Android stara się także ograniczać dostęp do danych, które nie są wewnętrznie wrażliwe, ale mogą pośrednio ujawniać cechy charakterystyczne użytkownika, jego preferencje i sposób, w jaki korzysta z urządzenia.

Domyślnie aplikacje nie mają dostępu do dzienników systemu operacyjnego, historii przeglądarki, numeru telefonu ani informacji identyfikacyjnych sprzętu/sieci. Jeśli aplikacja zażąda dostępu do tych informacji w czasie instalacji, instalator wyświetli monit użytkownikowi z pytaniem, czy aplikacja może uzyskać dostęp do informacji. Jeśli użytkownik nie udzieli dostępu, aplikacja nie zostanie zainstalowana.

Organy certyfikujące

Android zawiera zestaw zainstalowanych systemowych urzędów certyfikacji, które cieszą się zaufaniem w całym systemie. Przed wersją Androida 7.0 producenci urządzeń mogli modyfikować zestaw urzędów certyfikacji dostarczanych na ich urządzenia. Jednakże urządzenia z wersją 7.0 i nowszą będą miały jednolity zestaw systemowych urzędów certyfikacji, ponieważ modyfikacje dokonywane przez producentów urządzeń nie są już dozwolone.

Aby zostać dodanym jako nowy publiczny urząd certyfikacji do standardowego zestawu systemu Android, urząd certyfikacji musi ukończyć proces włączania urzędu certyfikacji Mozilla , a następnie złożyć wniosek o dodanie funkcji dla systemu Android ( https://code.google.com/p/android/issues/entry ) aby dodać urząd certyfikacji do podstawowego zestawu urzędu certyfikacji systemu Android w projekcie Android Open Source Project (AOSP).

Nadal istnieją urzędy certyfikacji specyficzne dla urządzenia i nie powinny być włączane do podstawowego zestawu urzędów certyfikacji AOSP, jak np. prywatne urzędy certyfikacji operatorów, które mogą być potrzebne do bezpiecznego dostępu do elementów infrastruktury operatora, takich jak bramki SMS/MMS. Zachęcamy producentów urządzeń do uwzględniania prywatnych urzędów certyfikacji tylko w komponentach/aplikacjach, które muszą ufać tym urzędom certyfikacji. Aby uzyskać więcej informacji, zobacz Konfiguracja zabezpieczeń sieci .

Podpisanie wniosku

Podpisywanie kodu pozwala programistom zidentyfikować autora aplikacji i zaktualizować swoją aplikację bez tworzenia skomplikowanych interfejsów i uprawnień. Każda aplikacja działająca na platformie Android musi być podpisana przez programistę. Aplikacje próbujące zainstalować bez podpisu są odrzucane przez Google Play lub instalator pakietu na urządzeniu z Androidem.

W Google Play podpisywanie aplikacji łączy zaufanie, jakim Google darzy programistę, oraz zaufanie, jakim programista darzy swoją aplikację. Programiści wiedzą, że ich aplikacja jest dostarczana w stanie niezmodyfikowanym dla urządzenia z systemem Android; i programiści mogą zostać pociągnięci do odpowiedzialności za zachowanie swoich aplikacji.

W systemie Android podpisanie aplikacji jest pierwszym krokiem do umieszczenia aplikacji w piaskownicy aplikacji. Podpisany certyfikat aplikacji określa, który identyfikator użytkownika jest powiązany z daną aplikacją; różne aplikacje działają pod różnymi identyfikatorami użytkowników. Podpisywanie aplikacji gwarantuje, że jedna aplikacja nie będzie mogła uzyskać dostępu do żadnej innej aplikacji inaczej niż za pośrednictwem dobrze zdefiniowanego IPC.

Po zainstalowaniu aplikacji (pliku APK) na urządzeniu z systemem Android Menedżer pakietów sprawdza, czy plik APK został poprawnie podpisany certyfikatem zawartym w tym pliku APK. Jeśli certyfikat (a dokładniej klucz publiczny w certyfikacie) jest zgodny z kluczem używanym do podpisywania dowolnego innego pliku APK na urządzeniu, nowy plik APK ma opcję określenia w manifeście, że w podobny sposób będzie dzielić UID z innym -podpisane pliki APK.

Aplikacje mogą być podpisane przez stronę trzecią (OEM, operator, rynek alternatywny) lub z podpisem własnym. Android umożliwia podpisywanie kodu przy użyciu certyfikatów z podpisem własnym, które programiści mogą generować bez pomocy i pozwolenia z zewnątrz. Wnioski nie muszą być podpisane przez organ centralny. Android obecnie nie przeprowadza weryfikacji certyfikatów aplikacji przez urząd certyfikacji.

Aplikacje mogą również deklarować uprawnienia bezpieczeństwa na poziomie ochrony podpisu, ograniczając dostęp tylko do aplikacji podpisanych tym samym kluczem, zachowując jednocześnie odrębne UID i piaskownice aplikacji. Bliższa relacja ze współdzieloną piaskownicą aplikacji jest możliwa dzięki funkcji współdzielonego UID , w której dwie lub więcej aplikacji podpisanych tym samym kluczem programisty może zadeklarować w swoim manifeście współdzielony UID.

Weryfikacja aplikacji

Android 4.2 i nowsze obsługują weryfikację aplikacji. Użytkownicy mogą włączyć opcję „Weryfikuj aplikacje”, aby przed instalacją sprawdzić aplikacje przez weryfikatora aplikacji. Weryfikacja aplikacji może ostrzec użytkownika, jeśli spróbuje zainstalować aplikację, która może być szkodliwa; jeśli aplikacja jest szczególnie zła, może zablokować instalację .

Zarządzanie Prawami Cyfrowymi

Platforma Android zapewnia rozszerzalną strukturę DRM, która umożliwia aplikacjom zarządzanie treściami chronionymi prawami zgodnie z ograniczeniami licencyjnymi powiązanymi z treścią. Struktura DRM obsługuje wiele schematów DRM; wybór schematów DRM obsługiwanych przez urządzenie zależy od producenta urządzenia.

Struktura Android DRM jest zaimplementowana w dwóch warstwach architektonicznych (patrz rysunek poniżej):

  • Interfejs API platformy DRM, który jest udostępniany aplikacjom poprzez platformę aplikacji systemu Android i działa poprzez maszynę wirtualną ART w przypadku standardowych aplikacji.

  • Natywny menedżer DRM, który implementuje strukturę DRM i udostępnia interfejs dla wtyczek DRM (agentów) do obsługi zarządzania prawami i deszyfrowania dla różnych schematów DRM

Architektura zarządzania prawami cyfrowymi na platformie Android

Rysunek 3. Architektura zarządzania prawami cyfrowymi na platformie Android