Komunikaty przyklejone

Kategoria OWASP: MASVS-PLATFORM: Platform Interaction

Omówienie

Aplikacje na Androida i system Android mogą używać transmisji jako systemu przesyłania wiadomości, aby powiadamiać inne aplikacje o wydarzeniach, którymi mogą być zainteresowane. Stały przekaz to specjalny typ przekazu, w którym wysłane obiekty intencji pozostają w pamięci podręcznej po zakończeniu przekazu. System może ponownie nadawać trwałe intencje do późniejszych rejestracji odbiorników. Niestety interfejs API do przesyłania stałych transmisji ma wiele wad związanych z bezpieczeństwem, dlatego został wycofany w Androidzie 5.0 (poziom interfejsu API 21).

Każdy ma dostęp do przyklejonych transmisji

Transmisje stałe nie mogą być ograniczone do odbiorników z określonymi uprawnieniami. Dlatego nie nadają się do przesyłania poufnych informacji. Możesz mieć wrażenie, że podanie nazwy pakietu aplikacji w transmisji Intent ogranicza zestaw 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 podczas wysyłania transmisji tylko odbiorcy w pakiecie com.example.myapp otrzymują intencję. Filtr nazwy pakietu nie jest jednak stosowany, gdy intencja jest ponownie nadawana z pamięci podręcznej. Podczas rejestrowania odbiornika za pomocą metody registerReceiver() wszystkie intencje w przylepskiej pamięci podręcznej, które pasują do określonego filtra, są ponownie nadawane odbiornikowi niezależnie od nazwy pakietu, w którym się znajduje.

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

Aby wysyłać przypięte transmisje, aplikacja wymaga tylko uprawnienia android.permission.BROADCAST_STICKY, które jest przyznawane automatycznie po zainstalowaniu aplikacji. W rezultacie atakujący mogą wysyłać dowolne intencje do dowolnego odbiornika, co może skutkować uzyskaniem nieautoryzowanego dostępu do innej aplikacji. Odbiorcom rozgłoszenia można ograniczyć wysyłanie do tych, którzy mają określone uprawnienia. W takim przypadku odbiorca nie będzie jednak otrzymywać transmisji z pamięci podręcznej, ponieważ nie są one wysyłane w kontekście tożsamości żadnej aplikacji i nie są transmitowane z żadnymi uprawnieniami.

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

Gdy intencja jest częścią trwałego komunikatu, zastępuje ona wszystkie poprzednie wystąpienia o tym samym działaniu, danych, typie, identyfikatorze, klasie i kategoriach w trwałej pamięci podręcznej. W związku z tym atakujący może w łatwy sposób zastąpić dodatkowe dane w trwałym zamiarze z legalnej aplikacji, który może zostać ponownie przesłany do innych odbiorników.

Transmisje wysyłane za pomocą metody sendStickyOrderedBroadcast() są dostarczane do jednego odbiorcy naraz, aby umożliwić odbiorcom o wyższym priorytecie wykorzystanie transmisji, zanim zostanie ona dostarczona odbiorcom o niższym priorytecie. Każdy odbiorca może przekazać wynik następnemu odbiorcy, na przykład wywołując funkcję setResultData(), lub przerwać transmisję, uniemożliwiając kolejnym odbiorcom jej odebranie. Osoba atakująca, która może odbierać trwałe transmisje porządkowane z uprawnieniami z aplikacji legalnej, może utworzyć odbiornik o wysokiej priorytecie, aby manipulować danymi o wyniku transmisji lub całkowicie je odrzucić.

Wpływ

Wpływ zależy od tego, jak są używane stałe transmisje i jakie dane są przekazywane odbiornikom. 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 oraz odmowy usługi.

Środki zaradcze

Nie należy używać przyklejonych transmisji. Zalecamy korzystanie z nieprzyklejających transmisji z innym mechanizmem, np. z lokalną bazą danych, aby pobierać bieżącą wartość w dowolnym momencie.

Deweloperzy mogą kontrolować, kto może odbierać transmisje nieprzypięte, za pomocą uprawnień lub ustawiając nazwę pakietu aplikacji w intencji. Jeśli transmisja nie musi być wysyłana do komponentów poza aplikacją, użyj LiveData, który implementuje wzorzec obserwatora.

Więcej informacji o zabezpieczeniu transmisji znajdziesz na stronie Podsumowanie transmisji.