Przechwytywanie intencji ogólnej

Kategoria OWASP: MASVS-PLATFORM: Platform Interaction

Omówienie

Luka w zakopczeniu domyślnego zamiaru występuje, gdy aplikacja nie określa w wywołaniu zamiaru pełnej nazwy klasy komponentu lub pakietu. Dzięki temu szkodliwa aplikacja może zarejestrować filtr intencji przechwytujący intencję, a nie tę samą.

W zależności od treści intencji atakujący mogą odczytać lub zmodyfikować informacje poufne albo wchodzić w interakcje ze zmiennymi obiektami, takimi jak zmienne PendingIntents lub Binders.

Przejęcie domyślnego zamiaru może też umożliwić atakującemu wykonywanie dowolnych działań, takich jak uruchamianie kontrolowanych przez niego komponentów.

Wpływ

Jeśli domyślna intencja, która obsługuje dane wrażliwe, przekazuje token sesji w dodatkowym ciągu adresu URL, aby otworzyć WebView, każda aplikacja określająca odpowiednie filtry intencji może odczytać ten token. Może to umożliwić dowolnej prawidłowo skonfigurowanej aplikacji na urządzeniu przechwycenie intencji i odczytanie zawartych w niej danych wrażliwych, co pozwoli atakującym na wyprowadzenie danych, takich jak informacje umożliwiające identyfikację użytkownika lub tokeny sesji.

Środki zaradcze

O ile aplikacja tego nie wymaga, wywołaj setPackage(), aby intencje były jawne. Dzięki temu intencję może interpretować tylko określony komponent (w aplikacji lub w innych aplikacjach), co uniemożliwia niesprawdzonym aplikacjom przechwytywanie danych wysyłanych wraz z intencją. Z tego fragmentu dowiesz się, jak wyraźnie określić intencję:

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ć intencji niejawnych, pomiń informacje poufne i zmienne obiekty, których nie chcesz ujawniać. Implicit intents może być konieczne użycie, gdy aplikacja nie wie dokładnie, która aplikacja wykona działanie (np. tworzenie e-maila, robienie zdjęcia itp.).

Materiały