[갤럭시 1-Day Case] SVE-2021-20690 / CVE-2021-25392

Posted by MrBIN on January 6, 2023

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 >

img1 img2

  • 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 >

img3

  • 파라미터로 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 >

img4

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

img5

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

img6

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

img7

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

4) Payload

img8

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



Ref.

https://blog.oversecured.com/