이번시간엔 '안전하지 않은 콘텐츠 프로바이더 접근' 취약점에 대하여 다뤄보겠습니다.
['안전하지 않은 콘텐츠 프로바이더 접근' 이란?]
> 안드로이드의 모든 애플리케이션은 기본적으로 다른 애플리케이션이 자신의 데이터에 접근하는 것을 금지하고 있습니다. 그러나 콘텐츠 프로바이더를 이용하여 자신의 데이터에 다른 애플리케이션이 접근하거나 부여한 권한대로 이용하도록 할 수 있습니다. 쉽게 말해서 콘텐츠 프로바이더는 다른 애플리케이션이 자신의 데이터를 사용하기 위한 통로 역할을 제공합니다. 이 프로바이더의 설정중 exported="true" 로 되어있고 외부앱에서 접근하는 것 에대한 별다른 조치가 없다면 외부에서 이 앱의 저장소에 접근하여 민감한 정보들을 빼낼 수 있는 위험성이 존재합니다.
[콘텐츠 프로바이더라는게 뭔데?]
<Provider> 태그를 이용하는 콘텐츠 프로바이더는 액티비티,서비스,브로드캐스트리시버와 함께 앱의 4대구성요소중 하나로, 주소인 URI 와 콘텐츠 리졸버 라는것이 필요합니다.
URI : content://authority/path 형식으로 이루어져 있으며 Authority는 콘텐츠 프로바이더의 고유주소, path는 데이터 위치에 대한 정보가 담겨져있습니다. 이 주소가 A와 B 앱끼리의 데이터(DB) 공유에 필요한 주소값이 됩니다! , 즉 저 주소를 통해 직접적으로 A앱의 DB에 접근할 수 있는것이죠!
콘텐츠 리졸버 : ContentResolver 형식인 콘텐츠 리졸버를 통해 A앱의 콘텐츠 프로바이더와 연결 통로를 이어줍니다. 여기서 어떤 콘텐츠 프로바이더와 연결할 것인지 지정하는 역할이 URI 이고, 연결이 되었으면 B어플은 A의 저장소에 CRUD 기능을 행사할 수 있습니다.
1. 취약점 탐색
1. AndroidManifest.xml 파일에 접근하셔서 검색창에 provider 라고 입력합니다. 그러면 provider 태그가 검색이 되는데 보시면 exported="true" 설정이 되어있는데 커스텀 권한같은 외부접근에 대한 특별한 제한조치가 없습니다. 따라서 이 부분을 취약점 포인트로 생각해볼 수 있습니다.
2. provider의 고유주소(Authority)가 가르키고 있는 TrackUserContentProvider 라는 액티비티로 가서 소스코드를 살펴보니 content:// 형식의 URI 주소가 적혀있는 것을 확인하실 수 있습니다. URI 주소와 외부 접근 설정여부도 알았으니 이제 공격을 시도해보겠습니다.
2. 공격과정
[ADB를 이용한 DB 추출]
1.1 우선 명령어창에서 해당 명령어를 통해 콘텐츠 프로바이더에 접근할 수 있습니다.
> nox_adb shell content query --URI [URI 주소]
1.2 다음 명령어르 입력하시면 인시큐어 뱅크 내부DB 정보가 출력이 됩니다. 보니깐 로그인한 사람의 내역을 저장하고 있는것 같습니다.
> nox_adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
1.3 이후 --projection 옵션을 사용하여 싱글쿼터를 삽입하니 Error가 뜨면서 select 에 사용된 SQL 구문이 출력이 되었습니다. 저희가 ' 쿼터로 넣은 값이 SELECT [입력값] FROM name ORDER BY name 로 들어가나 봅니다. 그러면 이 점을 이용하여 SQL Injection 을 시도해볼 수 있습니다.
1.4 해당 명령어를 통해 SQL Injection 공격 결과 SQLite DB에 있는 테이블 명을 출력하는 것에 성공하였습니다! 이를 통해 다른 테이블의 정보도 가져올 수 있게 되었습니다.
> nox_adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection \"* FROM SQLITE_MASTER WHERE type='table';--\"
3. 대응방안
1. exported="false" 설정
> 특별한 경우가 아니면 exported="false" 설정을 해두어야 합니다. 이 설정만 해도 외부에서 내부 db에 함부로 접근하는 일은 없어질 것입니다!
2. 권한 설정
> 만약 true 로 설정해야만 하는 상황이라면 권한 설정을 통해 이 provider에 접근할때 특정 권한이 필요하도록 조치하면 안전하게 이용하실 수 있습니다.
<provider
android:name="com.android.insecurebankv2.TrackUserContentProvider"
android:exported="true"
android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
android:permission="com.android.insecurebankv2.ACCESS_TRACK_USER_PROVIDER" />
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Insecure Bank' 카테고리의 다른 글
[Insecure Bank] 애플리케이션 패칭 취약점 (0) | 2024.12.05 |
---|---|
[Insecure Bank] 취약한 웹 뷰 실행 (0) | 2024.12.05 |
[Insecure Bank] 루팅 탐지 및 우회 (0) | 2024.12.02 |
[Insecure Bank] 액티비티 컴포넌트 취약점 (0) | 2024.11.29 |
[Insecure Bank] 로컬 암호화 이슈 취약점 (0) | 2024.11.26 |