Absender von ausstehenden Intents

OWASP-Kategorie:MASVS-CODE: Code Quality

Übersicht

Wenn Sie PendingIntent.getCreator*() oder PendingIntent.getTarget*() verwenden, um zu bestimmen, ob dem Absender eines PendingIntent vertraut werden soll, entsteht ein Risiko für Exploits.

PendingIntent.getCreator*() oder PendingIntent.getTarget*() gibt den Ersteller des PendingIntent zurück, der nicht immer mit dem Absender übereinstimmt. Der Ersteller ist möglicherweise vertrauenswürdig, der Absender sollte jedoch niemals vertrauenswürdig sein, da es sich beim Absender um eine schädliche App handeln könnte, die die PendingIntent einer anderen App über verschiedene Mechanismen erworben hat, z. B.:

Ein Beispiel für die zulässige Verwendung von PendingIntent.getCreator*() oder PendingIntent.getTarget*() wäre die Anzeige des Symbols der App, die durch den PendingIntent gestartet wird.

Positiv beeinflussen

Wenn Sie dem Absender eines PendingIntent vertrauen, weil Sie den Ersteller abgefragt haben (und ihm vertrauen), kann dies zu Sicherheitslücken führen. Wenn eine App dem Absender des PendingIntent basierend auf seinem Ersteller vertraut und dann ihre Authentifizierungs- oder Autorisierungslogik freigibt, führt dies immer dann, wenn der Absender des PendingIntent eine schädliche App ist, zu einer Umgehung der Authentifizierung oder möglicherweise sogar zur Ausführung von Remote-Code basierend auf ungültiger, nicht vertrauenswürdiger Eingabe, je nach Implementierung des Codes der anfälligen Anwendung.

Maßnahmen zur Risikominderung

Unterscheidung zwischen Absender und Ersteller

Jegliche Art von Authentifizierungs- oder Autorisierungslogik, die beim Empfang eines PendingIntent ausgeführt wird, darf nicht auf Annahmen bezüglich des Erstellers des PendingIntent basieren, der entweder mit PendingIntent.getCreator*() oder PendingIntent.getTarget*() identifiziert wird.

Anrufer auf alternative Weise bestätigen

Wenn Sie den Aufrufer authentifizieren müssen, sollten Sie anstelle von PendingIntent einen Service oder ContentProvider verwenden. Beide ermöglichen das Abrufen der UID des Aufrufers mit Binder.getCallingUid(), wenn Sie sich im Kontext des Dispatchings eines eingehenden IPC befinden. Die UID kann später mit PackageManager.getPackagesForUid() abgefragt werden.

Eine weitere Möglichkeit, die ab API-Level 34 verfügbar ist, besteht darin, BroadcastReceiver.getSentFromUid() oder BroadcastReceiver.getSentFromPackage() zu verwenden, wenn der Absender die Identität während der Übertragung mit BroadcastOptions.isShareIdentityEnabled() freigegeben hat.

Sie sollten immer prüfen, ob das aufrufende Paket die erwartete Signatur hat, da Pakete, die per Sideloading installiert wurden, Paketnamen haben können, die sich mit denen aus dem Play Store überschneiden.

Ressourcen