
CVE-2020-0113 및 CVE-2020-0108의 Poc
Poc of CVE-2020-0113 & CVE-2020-0108
AOSP의 2020-08 패치에서 프레임워크 계층 AMS의 취약점이 공개되었습니다. 번호는 CVE-2020-0108이며 등급은 높음(High)입니다. 또 다른 취약점은 CVE-2020-0313이며 등급은 중간(Medium)입니다. AMS의 포그라운드 서비스 처리 과정에서 논리적 취약점이 발생하며, 이 취약점을 성공적으로 악용한 공격자는 포그라운드 서비스의 알림 표시를 우회하고 계속해서 백그라운드에서 실행될 수 있습니다. 공격은 로컬의 악성 앱에 의해 시작되어야 하며 사용자 상호작용이 필요하지 않습니다. 사용자가 앱에 다른 권한을 부여한 경우 지속적인 위치 추적이나 무음 녹음 등 더 큰 피해를 입힐 수 있습니다.
포그라운드 서비스는 Google이 Android 8.0에서 도입한 개념입니다. Android 8.0은 백그라운드에서 백그라운드 서비스를 시작하는 것을 허용하지 않기 때문에 포그라운드 서비스 개념이 설계되었습니다. 포그라운드 서비스는 우선순위가 높아 오랫동안 백그라운드에서 실행될 수 있지만, 시작 후 5초 이내에 알림을 바인딩해야 하며 그렇지 않으면 종료됩니다. 실제로 포그라운드 서비스는 여전히 '백그라운드'에서 실행되지만, 사용자가 볼 수 있는 알림이 바인딩되어 있기 때문에 Google은 이를 '포그라운드 서비스'라고 부릅니다.
NotificationManagerService의 onNotificationError 메서드에서 알림 표시 중 예외 상황을 올바르게 처리하지 않습니다. 이 메서드는 단순히 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);
ServiceRecord.java의 postNotification 메서드에서 알림 표시 중 예외 상황을 올바르게 처리하지 않고 예외를 사용자 프로그램에 던집니다.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
유효하지 않은 Channel ID를 사용하여 Notification을 구성합니다.
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
또한 두 서비스 모두 메인 스레드의 예외를 캐치해야 앱이 충돌하지 않습니다.
Genymotion 에뮬레이터, Android 8.0, 2017년 9월 5일 패치
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