
Poc для CVE-2020-0113 и CVE-2020-0108
Poc of CVE-2020-0113 & CVE-2020-0108
В патче AOSP от 2020-08 была раскрыта уязвимость в AMS (Activity Manager Service) под номером CVE-2020-0108 с высоким рейтингом, а также другая уязвимость CVE-2020-0313 со средним рейтингом. Логическая ошибка в обработке служб переднего плана в AMS позволяет атакующему, успешно эксплуатирующему эту уязвимость, обойти отображение уведомления службы переднего плана и продолжать работу в фоне. Атака должна быть инициирована вредоносным приложением на устройстве, не требует взаимодействия с пользователем. Если пользователь предоставил приложению другие разрешения, это может привести к более серьезным последствиям, например, к непрерывному отслеживанию местоположения или скрытой записи звука.
Службы переднего плана - это концепция, введенная Google в Android 8.0. Поскольку Android 8.0 запрещает запуск фоновых служб из фона, была разработана концепция служб переднего плана. Службы переднего плана имеют более высокий приоритет и могут работать в фоне длительное время, но в течение 5 секунд после запуска должны быть привязаны к уведомлению, иначе они будут завершены. Фактически служба переднего плана все еще работает в "фоне", но из-за привязки к видимому пользователем уведомлению Google называет ее "службой переднего плана".
В методе onNotificationError в NotificationManagerService не была корректно обработана исключительная ситуация при отображении уведомления. Поскольку этот метод просто вызывает cancelNotification для отмены уведомления, но не завершает службу или все приложение, служба переднего плана продолжает работать без отображения уведомления.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
При создании объекта RemoteViews был указан Layout ID = -1, что явно является недопустимым значением. Это позволяет вызвать обратный вызов onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
В методе postNotification в ServiceRecord.java исключительная ситуация при отображении уведомления не была обработана корректно, вместо этого исключение было передано пользовательской программе.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
Непосредственно используется недопустимый Channel ID для создания Notification.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
Оба других Service должны перехватывать исключения в основном потоке, чтобы приложение не аварийно завершалось.
Эмулятор Genymotion, Android 8.0, патч от 5 сентября 2017 года.
Используется MediaRecord для записи звука в течение 10 секунд.
Получается с помощью LocationManager.
Обычная служба переднего плана (NormalService) имеет постоянное уведомление в панели уведомлений, а PoC не имеет этого уведомления.
В обратном вызове onNotificationError принудительно вызывается аварийное завершение приложения, и в обработке исключений метода 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