Intent-Weiterleitung

OWASP-Kategorie: MASVS-PLATFORM: Platform Interaction

Übersicht

Eine Intent-Weiterleitung tritt auf, wenn ein Angreifer den Inhalt eines Intents, der zum Starten einer neuen Komponente im Kontext einer anfälligen App verwendet wird, teilweise oder vollständig kontrollieren kann.

Der Intent, der zum Starten der neuen Komponente verwendet wird, kann auf verschiedene Arten bereitgestellt werden, am häufigsten entweder als serialisierter Intent in einem extras-Feld oder als String marshalled und geparst. Auch die teilweise Kontrolle von Parametern kann zum gleichen Ergebnis führen.

Auswirkungen

Die Auswirkungen können variieren. Ein Angreifer kann interne Funktionen in der anfälligen App ausführen oder auf private Komponenten wie nicht exportierte ContentProvider-Objekte zugreifen.

Gegenmaßnahmen

Im Allgemeinen sollten Sie keine Funktionen zum Weiterleiten verschachtelter Intents verfügbar machen. In Fällen, in denen dies unvermeidlich ist, wenden Sie die folgenden Gegenmaßnahmen an:

  • Bereinigen Sie die gebündelten Informationen ordnungsgemäß. Prüfen oder löschen Sie Flags (FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION, FLAG_GRANT_PERSISTABLE_URI_PERMISSION, and FLAG_GRANT_PREFIX_URI_PERMISSION) und prüfen Sie, wohin der Intent weitergeleitet wird. IntentSanitizer kann bei diesem Vorgang helfen.
  • Verwenden Sie PendingIntent-Objekte. Dadurch wird verhindert, dass Ihre Komponente exportiert wird, und der Ziel-Intent wird unveränderlich.

Apps können mit Methoden wie ResolveActivity prüfen, wohin ein Intent weitergeleitet wird:

Kotlin

val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
    // Redirect the nested intent.
    startActivity(forward)
}

Java

Intent intent = getIntent()
// Get the component name of the nested intent.
Intent forward = (Intent) intent.getParcelableExtra("key");
ComponentName name = forward.resolveActivity(getPackageManager());
// Check that the package name and class name contain the expected values.
if (name.getPackageName().equals("safe_package") &&
        name.getClassName().equals("safe_class")) {
    // Redirect the nested intent.
    startActivity(forward);
}

Apps können IntentSanitizer mit einer ähnlichen Logik wie der folgenden verwenden:

Kotlin

val intent = IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent)

Java

Intent intent = new  IntentSanitizer.Builder()
     .allowComponent("com.example.ActivityA")
     .allowData("com.example")
     .allowType("text/plain")
     .build()
     .sanitizeByThrowing(intent);

Standardschutz

Android 16 bietet eine standardmäßig aktivierte Lösung zur Erhöhung der Sicherheit gegen Exploits zur Intent-Weiterleitung. In den meisten Fällen treten bei Apps, die Intents verwenden, keine Kompatibilitätsprobleme auf.

Verarbeitung der Intent-Weiterleitung deaktivieren

Android 16 führt eine neue API ein, mit der Apps die Sicherheitsmaßnahmen für den Start deaktivieren können. Dies kann in bestimmten Fällen erforderlich sein, in denen das Standardverhalten der Sicherheit die legitimen Anwendungsfälle der App beeinträchtigt.

In Android 16 können Sie Sicherheitsmaßnahmen deaktivieren, indem Sie die Methode removeLaunchSecurityProtection() für das Intent-Objekt verwenden. Beispiel:

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }

Häufige Fehler

  • Prüfen, ob getCallingActivity() einen Wert ungleich null zurückgibt. Schädliche Apps können für diese Funktion einen Nullwert angeben.
  • Annehmen, dass checkCallingPermission() in allen Kontexten funktioniert oder dass die Methode eine Ausnahme auslöst, wenn sie tatsächlich eine Ganzzahl zurückgibt.

Debugging-Funktionen

Bei Apps, die auf Android 12 (API-Level 31) oder höher ausgerichtet sind, können Sie eine Debugging-Funktion aktivieren, mit der Sie in einigen Fällen erkennen können, ob Ihre App einen unsicheren Start eines Intents ausführt.

Wenn Ihre App beide der folgenden Aktionen ausführt, erkennt das System einen unsicheren Intent-Start und es tritt ein StrictMode-Verstoß auf:

  • Ihre App entpackt einen verschachtelten Intent aus den Extras eines bereitgestellten Intents.
  • Ihre App startet sofort eine App-Komponente mit diesem verschachtelten Intent, z. B. indem sie den Intent an startActivity(), startService() oder bindService() übergibt.

Ressourcen