Intent-Weiterleitung

OWASP-Kategorie:MASVS-PLATFORM: Plattforminteraktion

Übersicht

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

Der Intent, mit dem die neue Komponente gestartet wird, kann auf verschiedene Arten angegeben werden. Am häufigsten wird er entweder als serialisierter Intent in einem extras-Feld oder als String übergeben und geparst. Eine teilweise Parametersteuerung kann ebenfalls zu diesem Ergebnis führen.

Positiv beeinflussen

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

Abhilfemaßnahmen

Zeigen Sie in der Regel keine Funktionen zur Weiterleitung verschachtelter Intents an. Wenn dies nicht möglich ist, wenden Sie die folgenden Maßnahmen zur Risikominderung an:

  • Entfernen Sie alle Informationen, die nicht für die Funktion der App erforderlich sind. Denken Sie daran, Markierungen zu prüfen oder zu entfernen (FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION, FLAG_GRANT_PERSISTABLE_URI_PERMISSION, and FLAG_GRANT_PREFIX_URI_PERMISSION) und zu prüfen, wohin die Intent-Anfrage weitergeleitet wird. IntentSanitizer kann Ihnen dabei helfen.
  • Verwenden Sie PendingIntent-Objekte. Dadurch wird verhindert, dass Ihre Komponente exportiert wird, und die Zielaktionsabsicht wird unveränderlich.

Apps können mithilfe von 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 führt eine standardmäßige Sicherheitshärtung für Ausnutzungen von Intent-Weiterleitungen ein.

Häufige Fehler

  • Prüfen, ob getCallingActivity() einen Wert zurückgibt, der nicht null ist. Schädliche Apps sind in der Lage, dieser Funktion einen Nullwert zuzuführen.
  • Angenommen, checkCallingPermission() funktioniert in allen Kontexten oder die Methode löst eine Ausnahme aus, obwohl sie tatsächlich eine Ganzzahl zurückgibt.

Funktionen zur Fehlerbehebung

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 Intent ausführt.

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

  • Ihre App entpackt einen verschachtelten Intent aus den Extras eines gesendeten Intents.
  • Ihre App startet sofort eine App-Komponente mit dieser verschachtelten Absicht, z. B. indem die Absicht an startActivity(), startService() oder bindService() übergeben wird.

Ressourcen