Komunikaty przyklejone

Kategoria OWASP: MASVS-PLATFORM: Platform Interaction

Przegląd

Aplikacje na Androida i system Android mogą używać transmisji jako systemu przesyłania wiadomości, aby powiadamiać inne aplikacje o wydarzeniach, które mogą je interesować. Trwałe transmisje to specjalny typ transmisji, w przypadku którego wysłane obiekty intencji pozostają w pamięci podręcznej po zakończeniu transmisji. System może ponownie rozgłaszać trwałe intencje do później zarejestrowanych odbiorców. Niestety interfejs API trwałych transmisji ma kilka wad związanych z bezpieczeństwem, dlatego został wycofany w Androidzie 5.0 (poziom interfejsu API 21).

Każdy może uzyskać dostęp do przypiętych transmisji

Nie można ograniczyć transmisji przyklejonych do odbiorców, którzy mają określone uprawnienia. Dlatego nie nadają się do przesyłania informacji poufnych. Może się wydawać, że podanie nazwy pakietu aplikacji w przypadku transmisji Intent ogranicza zbiór BroadcastReceivers:

Kotlin

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

Java

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

W tym przykładzie tylko odbiorcy w pakiecie com.example.myapp otrzymają intencję po wysłaniu transmisji. Filtr nazwy pakietu nie jest jednak stosowany, gdy intencja jest ponownie rozgłaszana z pamięci podręcznej. Podczas rejestrowania odbiorcy za pomocą metody registerReceiver() wszystkie intencje w pamięci podręcznej, które pasują do określonego filtra, są ponownie rozsyłane do odbiorcy niezależnie od nazwy pakietu, w którym się on znajduje.

Każdy może wysyłać przypięte transmisje

Aby wysyłać trwałe transmisje, aplikacja potrzebuje tylko uprawnienia android.permission.BROADCAST_STICKY, które jest przyznawane automatycznie podczas instalacji aplikacji. Atakujący mogą więc wysyłać dowolne intencje do dowolnych odbiorców, potencjalnie uzyskując nieautoryzowany dostęp do innej aplikacji. Odbiorniki transmisji mogą ograniczać nadawców do tych, którzy mają określone uprawnienia. W takim przypadku odbiorca nie będzie jednak mógł odbierać transmisji z pamięci podręcznej, ponieważ nie są one wysyłane w kontekście tożsamości żadnej aplikacji ani nie są transmitowane z żadnymi uprawnieniami.

Każdy może modyfikować przypięte transmisje

Gdy intencja jest częścią trwałego rozgłaszania, zastępuje ona w pamięci podręcznej trwałych rozgłoszeń każdą poprzednią instancję, która ma tę samą czynność, dane, typ, identyfikator, klasę i kategorie. W związku z tym atakujący może łatwo zastąpić dodatkowe dane w trwałym zamiarze z prawidłowej aplikacji, który może zostać ponownie rozgłoszony do innych odbiorców.

Transmisje wysyłane metodą sendStickyOrderedBroadcast() są dostarczane do jednego odbiornika naraz, aby odbiorniki o wyższym priorytecie mogły odbierać transmisję przed dostarczeniem jej do odbiorników o niższym priorytecie. Gdy każdy odbiorca jest wykonywany po kolei, może przekazywać wynik do następnego odbiorcy, np. wywołując setResultData(), lub może przerwać transmisję, uniemożliwiając kolejnym odbiorcom jej otrzymanie. Osoba atakująca, która może odbierać trwałe uporządkowane transmisje z prawidłowej aplikacji, może utworzyć odbiornik o wysokim priorytecie, aby manipulować danymi wyników transmisji lub całkowicie je odrzucać.

Wpływ

Wpływ zależy od sposobu używania trwałych transmisji i rodzaju danych przekazywanych do odbiorców transmisji. Ogólnie rzecz biorąc, używanie trwałych transmisji może prowadzić do ujawnienia danych wrażliwych, manipulowania danymi, nieautoryzowanego dostępu do wykonywania działań w innej aplikacji i ataku typu DoS.

Środki ograniczające ryzyko

Nie należy używać trwałych transmisji. Zalecamy używanie transmisji nieprzyklejonych z innym mechanizmem, np. lokalną bazą danych, aby w razie potrzeby pobierać bieżącą wartość.

Deweloperzy mogą kontrolować, kto może otrzymywać transmisje nieprzyklejone, za pomocą uprawnień lub przez ustawienie nazwy pakietu aplikacji w intencji. Jeśli transmisja nie musi być wysyłana do komponentów poza aplikacją, użyj funkcji LiveData, która implementuje wzorzec obserwatora.

Więcej informacji o zabezpieczaniu transmisji znajdziesz na stronie Przegląd transmisji.