Content Provider 란?
Content Provider(콘텐츠 프로바이더)는 다른 애플리케이션의 데이터베이스나 파일에 접근할 수 있게 해주는 역할을 한다. 즉 , 애플리케이션의 데이터를 다른 애플리케이션에서 사용할 수 있는 통로로 제공한다. Content Provider 는 Androidmanifest.xml 의 <provider> 에 정의된다.
Content Provider 에 접근하기 위해서는 Content Provider 의 주소인 URI(Uniform Resource Identifier) 와 Content Resolver(콘텐츠 리졸버)가 필요하다. Content Resolver 를 이용하여 다른 애플리케이션의 Content Provider 에 접근할 수 있으며, 이때 Content Provider 의 주소인 URI 가 필요하다. Content Provider 의 주소인 URI 형식은 다음과 같다.
content://authority/path
Content Provider 의 주소는 content:// 로 시작하며 authority 는 Content Provider의 고유 주소, path 는 데이터 위치에 대한 정보가 담겨 있다.
취약점 진단 (ADB)
먼저 Content Provider 가 선언되어 있는지 확인하기 위해 Androidmanifest.xml 을 보자. Androidmanifest.xml 는 대상 애플리케이션을 디컴파일하여 얻어낼 수 있다.
Androidmanifest.xml 의 <provider> 선언 부분을 보면 authorities 를 볼 수 있고, exported 항목이 true 로 설정되어 있는 것을 볼 수 있다. 이 항목이 true 로 설정되어 있어야만 외부 애플리케이션에서 해당 요소를 사용할 수 있다.
다음으로, 디컴파일하여 생성된 파일들의 내용 중 content:// 로 시작하는 항목이 있는지 확인한다. 다음 명령을 통해 확인할 수 있다.
find [디컴파일로 생성된 상위 파일] -type f -print | xargs grep -i "content://" /dev/null
찾아낸 URI 는 다음과 같다.
content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
이제 adb 명령을 통해 해당 애플리케이션의 데이터를 확인해보자. 명령은 다음과 같다.
adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
출력 결과는 로그인 했던 사용자 id 내역인 것 같다. 이처럼 Content Provider 를 통해 특정 데이터를 알아낼 수 있는 취약점이 존재한다는 것을 확인했다.
취약점 진단 (drozer)
먼저 drozer 를 통해 인시큐어뱅크 애플리케이션에서 content provider 취약점이 존재하는지 확인한다.
dz> rum app.package.attacksurface com.android.insecurebankv2
취약점이 존재하는 것을 확인했으면 해당 요소에 대한 정보를 확인한다.
dz> run app.provider.info -a com.android.insecurebankv2
Androidmanifest.xml 에 선언된 정보와 동일하다. 다음은 content provider URI 를 검색해보자.
dz> run scanner.provider.finduris -a com.android.insecurebankv2
출력 결과에서는 해당 애플리케이션에 포함된 모든 URI 주소를 보여주고, 접근 가능한 항목도 따로 출력해준다. 이제 이 URI 를 통해 애플리케이션의 데이터를 조회해보자.
dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
adb 로 조회했던 내용과 동일하게 출력된다.
DB 내용을 확인할 수 있으니 SQL Injection 도 가능한 지 확인해보자.
dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection "'"
에러 메시지에 DB 쿼리가 출력되는 것으로 보아 SQL Injection 이 가능하다는 것을 알 수 있다.
대응 방안
앞에서도 보았듯이 Androidmanifest.xml 파일에 프로바이더를 선언할 때 exported 값이 true 로 설정되면 외부 애플리케이션에 노출되므로 데이터 유출에 대한 위험이 존재하게 된다. 따라서 exported 값을 false 로 설정해야 한다.
'모바일 앱 취약점' 카테고리의 다른 글
[모바일 앱 취약점] Broadcast Receiver 결함 (0) | 2020.04.23 |
---|