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.