
Poc von CVE-2020-0113 & CVE-2020-0108
Poc of CVE-2020-0113 & CVE-2020-0108
Im AOSP-Patch vom August 2020 wurde eine Schwachstelle im AMS der Framework-Ebene offengelegt, nummeriert als CVE-2020-0108, mit hohem Schweregrad, und eine weitere als CVE-2020-0313, mit mittlerem Schweregrad. Es handelt sich um einen logischen Fehler in der Behandlung von Vordergrunddiensten im AMS. Ein Angreifer, der diese Schwachstelle erfolgreich ausnutzt, kann die Benachrichtigungsanzeige von Vordergrunddiensten umgehen und diese dauerhaft im Hintergrund ausführen. Der Angriff muss von einer lokalen bösartigen App ausgehen, erfordert keine Benutzerinteraktion. Wenn der Benutzer der App weitere Berechtigungen erteilt hat, kann dies größeren Schaden verursachen, z. B. durch kontinuierliche Standortverfolgung oder stilles Aufnehmen von Audio.
Vordergrunddienste sind ein von Google in Android 8.0 eingeführtes Konzept. Da Android 8.0 das Starten von Hintergrunddiensten im Hintergrund nicht erlaubt, wurde das Konzept der Vordergrunddienste entwickelt. Vordergrunddienste haben eine höhere Priorität und können lange im Hintergrund laufen, müssen jedoch innerhalb von 5 Sekunden nach dem Start eine Benachrichtigung binden, sonst werden sie beendet. Tatsächlich laufen Vordergrunddienste immer noch im "Hintergrund", aber da sie eine für den Benutzer sichtbare Benachrichtigung binden, nennt Google sie "Vordergrunddienste".
In der Methode onNotificationError im NotificationManagerService wurden Ausnahmesituationen bei der Benachrichtigungsanzeige nicht korrekt behandelt. Da die Methode lediglich cancelNotification aufruft, um die Benachrichtigung zu stornieren, ohne den Dienst oder die gesamte Anwendung zu beenden, läuft der Vordergrunddienst ohne Anzeige der Benachrichtigung weiter.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
Beim Erstellen des RemoteViews-Objekts wird die Layout-ID auf -1 gesetzt, was eindeutig ein ungültiger Wert ist. Dadurch wird der onNotificationError-Callback ausgelöst.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
In der Methode postNotification in ServiceRecord.java werden Ausnahmesituationen bei der Benachrichtigungsanzeige nicht korrekt behandelt, sondern die Ausnahme wird an das Benutzerprogramm weitergegeben.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Verwendet direkt eine ungültige Channel-ID, um die Benachrichtigung zu erstellen.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Außerdem müssen beide Dienste Ausnahmen im Hauptthread abfangen, damit die App nicht abstürzt.
Genymotion-Emulator, Android 8.0, Patch vom 5. September 2017
Verwendung von MediaRecord zur Aufnahme von 10 Sekunden Audio
Abruf über LocationManager
Der normale Vordergrunddienst (NormalService) hat eine dauerhafte Benachrichtigung in der Benachrichtigungsleiste, der Poc hat diese Benachrichtigung nicht.
Im onNotificationError-Callback wird die Anwendung zum Absturz gezwungen, und auch in der Ausnahmebehandlung der postNotification-Methode wird die Anwendung zum Absturz gezwungen.
[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0108
[2] https://github.com/wrlu/vulnerabilities/tree/master/CVE-2020-0108
[3] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0313