
Preuve de concept de CVE-2020-0113 & CVE-2020-0108
Poc of CVE-2020-0113 & CVE-2020-0108
Dans le correctif AOSP d'août 2020, une vulnérabilité dans la couche framework AMS a été divulguée, référencée CVE-2020-0108, avec un niveau de gravité élevé, et une autre, référencée CVE-2020-0313, avec un niveau de gravité moyen. Il s'agit d'un défaut logique dans le traitement des services de premier plan dans AMS. Un attaquant qui exploite avec succès cette vulnérabilité peut contourner l'affichage de la notification du service de premier plan et continuer à s'exécuter en arrière-plan. L'attaque doit être lancée par une application malveillante locale, sans interaction de l'utilisateur. Si l'utilisateur a accordé d'autres permissions à l'application, cela peut causer des dommages plus importants, par exemple en suivant en continu la position ou en enregistrant silencieusement.
Les services de premier plan sont un concept introduit par Google dans Android 8.0. Étant donné qu'Android 8.0 n'autorise pas le démarrage de services en arrière-plan, le concept de service de premier plan a été conçu. Les services de premier plan ont une priorité élevée et peuvent s'exécuter longtemps en arrière-plan, mais ils doivent être liés à une notification dans les 5 secondes suivant leur démarrage, sinon ils sont tués. En réalité, les services de premier plan s'exécutent toujours en « arrière-plan », mais comme ils sont liés à une notification visible par l'utilisateur, Google les appelle « services de premier plan ».
La méthode onNotificationError dans NotificationManagerService ne gère pas correctement les exceptions lors de l'affichage des notifications. Comme cette méthode se contente d'appeler cancelNotification pour annuler la notification, sans arrêter le service ou l'application entière, le service de premier plan continue de s'exécuter sans afficher de notification.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
Lors de la création d'un objet RemoteViews, l'ID de mise en page (Layout ID) est spécifié à -1, ce qui est clairement une valeur invalide, permettant ainsi de déclencher le rappel onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
Dans la méthode postNotification de ServiceRecord.java, les exceptions lors de l'affichage des notifications ne sont pas correctement gérées, mais l'exception est renvoyée au programme utilisateur.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Utilise directement un ID de canal invalide pour construire la Notification.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Les deux autres services doivent capturer les exceptions du thread principal, afin que l'application ne plante pas.
Émulateur Genymotion, Android 8.0, correctif du 5 septembre 2017
Utilisation de MediaRecord pour enregistrer 10 secondes
Obtenue à l'aide de LocationManager
Un service de premier plan normal (NormalService) a une notification persistante dans la barre de notification, tandis que le Poc n'a pas cette notification.
Forcer le plantage de l'application dans le rappel onNotificationError, et également forcer le plantage dans la gestion des exceptions de la méthode postNotification.
[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