[갤럭시 1-Day Case] SVE-2021-20702 / CVE-2021-25410

Posted by MrBIN on January 4, 2023

SVE-2021-20702 / CVE-2021-25410

1) APP / Bounty info

* APP: CallBGProvider (com.samsung.android.callbgprovider)
* REWARD: $2180
* DESCRIPTION: Read arbitary files as system (UID 1001) user
* Occur: CallBGProvider

2) CallBGProvider (com.samsung.android.callbgprovider)

  • CallBGProvider란 삼성 전화 앱과 함께 미디어 데이터를 저장하는 프로바이더이며, 삼성 기기의 통화 기능을 지원함. 통화 연결, 종료 등 통화 중 발생하는 다양한 이벤트를 관리하기도 함.

3) 취약점 설명

< AndroidManifest.xml >

img2

  • 해당 취약점은 path traversal을 통해 다른 패키지 내부 저장소에 접근 가능한 취약점임.
  • CallBGProvider는 파일 프로바이더이며 sharedUserID가 android.uid.phone 즉, 1001번에 해당하는 시스템 권한을 가지고 있음.
  • AndroidManifes.xml에 CallBGProvider에 대한 외부 접근 권한이 true로 설정되어 있으며, 상단에 com.samsung.android.callbgprovider.PERMISSION 퍼미션이 선언되어 있다.
  • com.samsung.android.callbgprovider.CallBGProvider 프로바이더에 read 퍼미션이 걸려 있지만 해당 퍼미션은 protectionLevel을 설정하지 않아서 접근이 가능하였음.
  • 일반 앱에서 접근이 불가능 하도록 하려면 permission 태그의 protectionLevel 속성에 signatureOrSystem 값을 설정해 주어야 함.
android:protectionLevel은 컴포넌트에 퍼미션을 부여하는 정책으로 정책에 따라서 일부 앱만 퍼미션을 얻을 수도 있다. 또한 설치할 때 퍼미션을 획득할지, 런타임에 획득할지 정할 수 있음.
1) normal :  선언 후, 사용자 동의 없이 사용 가능
2) dangerous :  선언 후, 사용자 동의 하에 사용 가능
3) signatureOrSystem : 아래 signature에 해당하거나, 단말 출시 때 미리 내장되어 출시된 앱인 경우 사용 가능
4) signature :  선언한 앱(여기서는 플랫폼)과  선언한 앱이 동일한 인증서로 사인된 경우 사용 가능
  • protectionLevel을 설정하지 않으면 default가 normal
  • 즉, CallBGProvider는 exported가 true이며 protectionLevel이 default 값인 normal 이므로 아무 앱에서 접근가능.
< BGProvider - openFile >

img3 img4

  • 파일 프로바이더는 openFile이라는 메소드를 통해 커스텀하게 파일에 접근이 가능함. openFile 함수의 return 값으로 ParcelFileDescriptor를 파일 객체 형태로 반환 함. 해당 취약점은 openFile 메소드에서 발생
  • openFile 메소드에 따로 분기문은 없고 요청 경로명에 images, videos, thumbnail 가 있는지 확인하고 없다면 폴더를 만듬.
  • getLastPathSegment는 uri가 /data/user_de/0/com.example.myapp/databases와 같이 되어 있으면 마지막 /을 기준으로 뒤에 있는 파일명을 리턴함. 이 경우는 databases를 가져오게 됨.
  • getLastPathSegment는 path traversal에 취약한 메소드이며 / 대신 아스키코드 ..2F를 쓰면 상위 폴더에 접근이 가능함.
  • 결과적으로 st2 변수에 들어가는 경로를 공격자가 마음대로 컨트롤이 가능하며 마지막에 파일 오픈까지 가능한 취약점.
정상적일 때는 str2에 아래와 같은 경로가 형성됨.
> /data/user/0/com.samsung.android.callbgprovider/files/videos
> /data/user/0/com.samsung.android.callbgprovider/files
  • 마지막 open 함수의 2번째 인자(268435456)는 파일입출력에 read권한을 의미
< com.android.providers.telephony >

img5

  • path traversal이 가능하기 때문에 CallBGProvider 내부 저장소가 아닌 다른 패키지의 저장소 데이터를 가져올 수 있음.
  • CallBGProvider는 uid가 1001번이기 때문에 path traversal을 이용해 권한 높은 패키지 저장소에 접근이 가능하며 그 중 SMS/MMS 정보를 가지고 있는 telephony앱이 적합 (com.android.providers.telephony은 > uid 1001)

    adb shell dumpsys package com.android.providers.telephony

4) Payload

img6 img7

  • 정상적인 경우에 openFile코드 st2 변수에 file.getPath() 때문에 시작 경로가 /data/user/0/com.example.mytestapplication/database/~~~ 인데 path traversal로 상위 디렉토리에 접근함.



Ref.

https://blog.oversecured.com/