
PoC de CVE-2020-0113 & CVE-2020-0108
Poc do CVE-2020-0113 & CVE-2020-0108
No patch de 2020-08 do AOSP, foi divulgada uma vulnerabilidade no framework AMS, identificada como CVE-2020-0108, com classificação alta, e outra identificada como CVE-2020-0313, com classificação média. Trata-se de uma falha lógica no tratamento de serviços em primeiro plano no AMS. Um invasor que explore com sucesso essa vulnerabilidade pode contornar a exibição da notificação do serviço em primeiro plano e continuar executando em segundo plano. O ataque precisa ser iniciado por um aplicativo malicioso local, sem exigir interação do usuário. Se o usuário conceder outras permissões ao aplicativo, isso pode causar danos maiores, como rastreamento contínuo de localização ou gravação silenciosa de áudio.
O serviço em primeiro plano é um conceito introduzido pelo Google no Android 8.0. Como o Android 8.0 não permite iniciar serviços em segundo plano a partir de um serviço em segundo plano, foi criado o conceito de serviço em primeiro plano. Esse serviço tem prioridade mais alta e pode ser executado por um longo período em segundo plano, mas deve associar uma notificação em até 5 segundos após a inicialização; caso contrário, será encerrado. Na prática, o serviço em primeiro plano ainda é executado "em segundo plano", mas, como está vinculado a uma notificação visível ao usuário, o Google o chama de "serviço em primeiro plano".
No método onNotificationError do NotificationManagerService, as exceções durante a exibição da notificação não são tratadas corretamente. Como esse método apenas chama cancelNotification para cancelar a notificação sem encerrar o serviço ou o aplicativo inteiro, o serviço em primeiro plano continua sendo executado sem exibir a notificação.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
Ao criar um objeto RemoteViews, o Layout ID é definido como -1, que obviamente é um valor inválido, acionando o callback onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
No método postNotification do ServiceRecord.java, as exceções durante a exibição da notificação não são tratadas corretamente; em vez disso, a exceção é lançada para o programa do usuário.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Usa diretamente um Channel ID inválido para construir a Notification.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Além disso, ambos os serviços precisam capturar a exceção da thread principal para que o aplicativo não pare.
Emulador Genymotion, Android 8.0, patch de 5 de setembro de 2017
Usa MediaRecord para gravar áudio por 10 segundos
Obtida usando LocationManager
Um serviço normal em primeiro plano (NormalService) possui uma notificação permanente na barra de notificações, enquanto o PoC não possui essa notificação.
No callback onNotificationError, força o aplicativo a falhar e, no tratamento de exceção do método postNotification, também força o aplicativo a falhar.
[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