Kategoria OWASP: MASVS-PLATFORM: Platform Interaction
Przegląd
Luka w zabezpieczeniach polegająca na przejęciu intencji ogólnej występuje, gdy aplikacja nie określa w pełni kwalifikowanej nazwy klasy komponentu ani pakietu podczas wywoływania intencji. Umożliwia to złośliwej aplikacji zarejestrowanie filtra intencji w celu przechwycenia intencji zamiast zamierzonej aplikacji.
W zależności od treści intencji atakujący mogą odczytywać lub modyfikować informacje poufne albo wchodzić w interakcje z obiektami modyfikowalnymi, takimi jak modyfikowalne PendingIntents lub Binders.
Przejęcie intencji ogólnej może też umożliwić atakującemu wykonywanie dowolnych działań, takich jak uruchamianie komponentów kontrolowanych przez atakującego.
Wpływ
Jeśli intencja ogólna obsługująca dane wrażliwe przekazuje token sesji w dodatkowym ciągu adresu URL, aby otworzyć komponent WebView, każda aplikacja określająca odpowiednie filtry intencji może odczytać ten token. Może to umożliwić każdej prawidłowo skonfigurowanej aplikacji na urządzeniu przechwycenie intencji i odczytanie danych wrażliwych, co pozwoli atakującym na eksfiltrację danych, takich jak informacje umożliwiające identyfikację lub tokeny sesji.
Środki zaradcze
Jeśli aplikacja tego nie wymaga, ustaw intencje jako jawne, wywołując setPackage(). Dzięki temu intencja może być interpretowana tylko przez określony komponent (w aplikacji lub w innych aplikacjach), co uniemożliwia niezaufanym aplikacjom przechwytywanie danych wysyłanych wraz z intencją. Poniższy fragment kodu pokazuje, jak ustawić intencję jako jawną:
Kotlin
val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
addCategory("android.intent.category.OPENABLE")
setPackage("com.some.packagename")
setType("*/*")
putExtra("android.intent.extra.LOCAL_ONLY", true)
putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)
Java
Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);
Jeśli musisz używać domyślnych intencji, pomiń wszelkie informacje wrażliwe lub obiekty modyfikowalne, których nie chcesz udostępniać. Domyślne intencje mogą być potrzebne, gdy aplikacja nie wie dokładnie, która aplikacja wykona działanie (np. pisanie e-maila, robienie zdjęcia itp.).
Zasoby
- Element intent-filter w pliku manifestu
- Lista dozwolonych uprawnień uprzywilejowanych
- Intencje i filtry intencji
- Wymuszanie wyboru w przypadku domyślnych intencji
- Typowe domyślne intencje