
PoC di CVE-2020-0113 e CVE-2020-0108
Poc di CVE-2020-0113 & CVE-2020-0108
Nel patch di AOSP di agosto 2020, è stata divulgata una vulnerabilità nel framework AMS, numerata CVE-2020-0108, con valutazione alta, e un'altra numerata CVE-2020-0313, con valutazione media. Una vulnerabilità logica nella gestione dei servizi in primo piano in AMS consente a un utente malintenzionato che la sfrutta con successo di bypassare la notifica del servizio in primo piano e continuare a funzionare in background. L'attacco deve essere avviato da un'applicazione locale dannosa e non richiede interazione da parte dell'utente. Se l'utente ha concesso altre autorizzazioni all'app, si possono causare danni maggiori, come il tracciamento continuo della posizione o la registrazione audio silenziosa.
Il servizio in primo piano è un concetto introdotto da Google in Android 8.0. Poiché Android 8.0 non consente l'avvio di servizi in background, è stato progettato il concetto di servizio in primo piano. I servizi in primo piano hanno una priorità più alta e possono funzionare a lungo in background, ma devono associare una notifica entro 5 secondi dall'avvio, altrimenti vengono terminati. In realtà, il servizio in primo piano continua a funzionare in 'background', ma poiché è associato a una notifica visibile all'utente, Google lo chiama 'servizio in primo piano'.
Nel metodo onNotificationError di NotificationManagerService, le eccezioni nella visualizzazione delle notifiche non vengono gestite correttamente. Poiché il metodo chiama solo cancelNotification per annullare la notifica, senza terminare il servizio o l'intera applicazione, il servizio in primo piano continua a funzionare senza mostrare la notifica.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
Quando si crea un oggetto RemoteViews, viene specificato un Layout ID di -1, che è chiaramente un valore non valido, in modo da attivare il callback onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
Nel metodo postNotification di ServiceRecord.java, le eccezioni nella visualizzazione delle notifiche non vengono gestite correttamente, ma l'eccezione viene lanciata al programma utente.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Utilizza direttamente un ID canale non valido per costruire la Notification.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Inoltre, entrambi i Service devono catturare l'eccezione del thread principale, in modo che l'app non vada in crash.
Emulatore Genymotion, Android 8.0, patch del 5 settembre 2017
Utilizza MediaRecord per registrare audio per 10 secondi
Ottenuto tramite LocationManager
Il servizio in primo piano normale (NormalService) ha una notifica persistente nel pannello delle notifiche, mentre il PoC non ha questa notifica.
Nel callback onNotificationError, l'applicazione viene forzata al crash, anche nella gestione delle eccezioni del metodo postNotification viene forzato il crash dell'applicazione.
[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