SVE-2021-20690 / CVE-2021-25392
1) APP info
* APP: Samsung DeX System UI (com.samsung.desktopsystemui) * REWARD: $330 * DESCRIPTION: Ability to steal notification policy configuration * Occur: NotificationBackupRestoreManager
2) Samsung DeX System UI (com.samsung.desktopsystemui)
- DeX의 전반적인 시스템 설정들을 대한 기능이 구현됨. (키보드, 블루투스, 스크린샷, 파워 등)
3) 취약점 설명
< AndroidManifest.xml >

- Samsung DeX System UI는 android.uid.systemui 권한을 가지고 있음.
com.samsung.desktopsystemui.NotificationBackupRestoreManager.NotificationBnRReceiver는 exported=true 여서 외부 앱에서 접근이 가능. (https://codechacha.com/ko/android-12-intent-filter-explicit-exported/)- 해당 브로드캐스트리시버는 인텐트 액션으로 REQUEST_BACKUP_NOTIFICATION과 REQUEST_RESTORE_NOTIFICATION 을 받을 수 있음.
< NotificationBackupRestoreManager - NotificationBnRReceiver >

- 파라미터로 SAVE_PATH를 받게 되는데 SAVE_PATH는 변수명 그대로 저장될 경로를 의미하며 변조할 수 있음. (즉, 기존의 내부저장소가 아닌 외부 저장소에 저장해서 파일을 빼올 수 있음)
- getintExtra 또한 조작 가능한 값이기 때문에 아래의 else 구문으로 트리거가 가능함.(“ACTION”이란 파라미터 없으면 디폴트 값 0)
- 인텐트로 전달된 액션 중 REQUEST_BACKUP_NOtiFICATION 인지 확인.
- thread의 run 메소드를 구현하고 아래의 start메소드르 통해 바로 실행하게 됨.
- thread를 통해 startBackup 메소드를 실행하게됨(스레드를 통해 계속해서 백업)
startBackup
- context: 현재 액티비티와 애플리케이션 정보를 얻기 위함 - "com.samsung.android.intent.action.RESPONSE_BACKUP_NOTIFICATION" - stringExtra: SAVE_PATH - stringExtra2: SOURCE - intExtra2: 0 - SPluginSlimIndicatorBox.BLACK_LIST_DB: 넘길 때는 비어있는 string - stringExtra3: SESSION_KEY
< NotificationBackupRestoreManager - startBackup >

- stringBuilder 객체를 선언하고 SAVE_PATH를 의미하는 str2를 append 함.
- streamCrypt라는 메소드를 통해 str5를 sha-256으로 암호화를 진행.
- str5(SESSION_KEY)가 null이면 exception이 발생하므로 아무거나 하나 넣어줘야함.
- sb2 변수는 createBackupFile 메소드의 파라미터로 전달.
< NotificationBackupRestoreManager - createBackupFile >

- str(SAVE_PATH) 경로에 notification_policy.xml파일이 있다면 파일을 미리 삭제하고 str(SAVE_PATH)을 createResultFile에 전달.
- 어차피 SAVE_PATH는 공격자가 설정하기 때문에 삭제는 상관 없음.
< NotificationBackupRestoreManager - createResultFile >

- str2에 SAVE_PATH + “notification_policy.xml” 파일 경로를 저장.
- if절도 경로는 공격자가 설정할 수 있기 때문에 삭제는 상관 없음.
- createNewFile을 통해 파일을 만듬.
- copyBackupFile메소드에 str2를 넘김.
< NotificationBackupRestoreManager - copyBackupFile >

- nottification 시스템 서비스를 호출 하여 bArr에 notification에 대한 정책 정보를 저장함.
- str(notification_policy.xml 파일이 있는 경로)에 bArr을 write 함.
4) Payload

- root, policyFile, backupCopy 파일 객체에 각각 외부저장소 경로, 외부저장소 + “notification_policy.xml”, 외부저장소 + “backup”을 저장함.
- thread를 돌리면서 notification_policy.xml 파일을 backup 파일에 저장하는 형식의 페이로드를 구성함.
Ref.
https://blog.oversecured.com/