7. 취약한 콘텐츠 프로바이더 접근
1. 취약점 설명
○ 콘텐츠 프로바이더는 다른 애플리케이션에서 데ㅣ터베이스, 파일에 접근 가능하도록 인터페이스 제공
○ 콘텐츠 프로바이더에 접근하기 위해 URL과 ContentResolver 필요
○ 애플리케이션은 ContentResolver를 이용해 콘텐츠 프로바이더 접근 가능하면 URL 이용
○ 콘텐츠 프로바이더가 외부에 노출된 경우 외부에서 접근하여 데이터를 조회하거나 변경 가능
○ 애플리케이션의 콘텐츠 프로바이더는 Androidmanifest.xml의 <provider> 요소에서 정의
○ 콘텐프 츠로바이더는 주소인 URI는 "content://authority/path"와 같은 형식으로 구성
○ Authority는 콘텐츠 프로바이더의 주소, path는 데이터 위치에 대한 정보를 의미
● 제공자 클래스 이름(android:name) : ContentProvider를 구현하는 클래스
● 권한(android:authorities) : 시스템 내에서 제공자 전체를 식별하는 상징적 이름
● 시작 및 제어 특성 (android:exported) : 다른 애플리케이션이 제공자를 사용할 수 있게 해주는 플래그,
true로 설정된 경우 외부에 노출
○ 취약점 진단 시 가장 많이 보는 부분 중 하나
2. 콘텐츠 프로바이더 취약점 확인
○ 콘텐츠 프로바이더를 이용해 데이터에 접근하기 위해 URI 필요
● content:// 콘텐츠 URI로 식별
● user_dictionary 제공업체의 권한
● words 테이블의 경로
ex) content://user_dictionary/words
○ 인시큐어 뱅크의 URL를 확인하기 위해 디컴파일 후 "content://"가 포함된 항목 검색
● TrackUserContentProider.smail 파일에서 "content://" 발견
● content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
3. Drozer을 이용한 SQL Injection 공격
○ drozer에서 콘텐츠 프로바이더를 통해 SQL Injection 공격
○ 로컬 스토리지에 포함된 데이터베이스 사용
○ SQL Injection 공격 가능 확인을 위해 --projection 옵션 뒤에 싱글쿼터(') 삽입
○ 쿼리문 : SELECT <projection> FROM...
○ 에러 메시지가 출력되었으며 메시지 안에 데이터 조회를 위한 쿼리 일부 포함
○ 데이터베이스에 포함된 테이블 목록 확인
○ "* from SQLITE_MASTER where type='table';--" 구문을 추가해 테이블 목록 확인
○ URI를 통해 확인 했던 names 컬럼 포함 확인
○ 데이터베이스에 포함된 테이블 중 names 테이블 출력
○ "* from names;--" 구문을 추가해 names 테이블 출력
○ URI를 이용해 출력했던 내용과 동일한 결과 출력
○ Insert, delete 등 쿼리 전송 가능
4. 대응방안
○ Androidmanifest.xml에 선언된 android:exported 속성을 false로 설정
○ false로 설정되는 경우 외부의 영향을 받지 않음
○ False로 설정된 콘텐츠 프로바이더에 강제로 요청하는 경우 "Permission Denial" 메시지 출력