
CVE-2020-0113 および CVE-2020-0108 の Poc
Poc of CVE-2020-0113 & CVE-2020-0108
AOSPの2020-08パッチでは、フレームワーク層のAMSにおける脆弱性が開示され、番号はCVE-2020-0108、評価は高、もう1つは番号がCVE-2020-0313、評価は中です。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")
また、2つのServiceはどちらもメインスレッドの例外をキャッチする必要があり、これによりアプリはクラッシュしません。
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