
PoC de CVE-2020-0113 y CVE-2020-0108
Poc of CVE-2020-0113 & CVE-2020-0108
En el parche de AOSP de 2020-08, se reveló una vulnerabilidad en el marco AMS, con el identificador CVE-2020-0108, clasificada como alta, y otra con el identificador CVE-2020-0313, clasificada como media. Es una vulnerabilidad lógica en el manejo del servicio en primer plano dentro de AMS. Un atacante que explote con éxito esta vulnerabilidad puede eludir la visualización de notificaciones del servicio en primer plano y continuar ejecutándose en segundo plano. El ataque debe ser iniciado por una aplicación maliciosa local, no requiere interacción del usuario. Si el usuario ha otorgado otros permisos a la aplicación, se pueden causar daños mayores, como el seguimiento continuo de ubicación o la grabación silenciosa.
El servicio en primer plano es un concepto introducido por Google en Android 8.0. Dado que Android 8.0 no permite iniciar servicios en segundo plano, se diseñó el concepto de servicio en primer plano. El servicio en primer plano tiene una prioridad más alta y puede ejecutarse en segundo plano durante mucho tiempo, pero debe vincular una notificación dentro de los 5 segundos posteriores a su inicio, de lo contrario será eliminado. En realidad, el servicio en primer plano aún se ejecuta en 'segundo plano', pero debido a que está vinculado a una notificación visible para el usuario, Google lo llama 'servicio en primer plano'.
En el método onNotificationError de NotificationManagerService, no se manejan correctamente las excepciones en la visualización de notificaciones. Dado que este método solo llama a cancelNotification para cancelar la notificación, sin detener el servicio o toda la aplicación, el servicio en primer plano continúa ejecutándose sin mostrar la notificación.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
Al crear un objeto RemoteViews, se especifica el ID de diseño como -1, que claramente es un valor no válido, lo que permite activar la devolución de llamada onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
En el método postNotification de ServiceRecord.java, no se manejan correctamente las excepciones en la visualización de notificaciones, sino que se lanza la excepción al programa del usuario.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Se utiliza directamente un ID de canal no válido para construir la Notification.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Además, ambos servicios necesitan capturar las excepciones del hilo principal, para que la aplicación no se bloquee.
Simulador Genymotion, Android 8.0, parche del 5 de septiembre de 2017
Usar MediaRecord para grabar audio durante 10 segundos
Obtener usando LocationManager
El servicio en primer plano normal (NormalService) tiene una notificación persistente en la barra de notificaciones, mientras que el Poc no tiene esta notificación.
Se fuerza el cierre de la aplicación en la devolución de llamada onNotificationError, y también se fuerza el cierre de la aplicación en el manejo de excepciones del método 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