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 Intents weitergeleitet werden.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 Intent
Weiterleitungs-Exploits ein. In den meisten Fällen treten bei Apps, die Intents verwenden, keine Kompatibilitätsprobleme auf.
Umgang mit Intent-Weiterleitungen deaktivieren
Mit Android 16 wird eine neue API eingeführt, mit der Apps Sicherheitsmaßnahmen beim Starten deaktivieren können. Dies kann in bestimmten Fällen erforderlich sein, wenn das standardmäßige Sicherheitsverhalten legitime Anwendungsfälle beeinträchtigt.
Unter Android 16 können Sie Sicherheitsmaßnahmen deaktivieren, indem Sie die Methode removeLaunchSecurityProtection()
auf das Objekt Intent
anwenden. 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 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()
oderbindService()
übergeben wird.