본문 바로가기

4-1. 2024-2 심화 스터디/안드로이드 모의 해킹

[2024.09.28] 안드로이드 취약점 진단과 시큐어 코딩

드로저란?

: MWR InfoSecurity 에서 개발한 모바일 애플리케이션 취약점 진단 프레임워크인
Mercury 의 새로운 업데이트 버전

- 자동화된 테스팅이 가능

- 다양한 시나리오를 통해 취약점 점검이 가능

 

드로저 설치 과정

$ adb forward tcp:31415 tcp:31415
$ activate py2.7 # 파이썬 2.7 버전 가상환경으로 접근
$ drozer console connect
$ pip install protobuf pyOpenSSL twisted service_identity # 에러 발생시 설치

 

사용 가능한 드로저 모듈 목록 출력 : list

사용 가능한 드로저 패키지 모듈 목록 출력 : list.package

dz> list.package # 패키지 모듈 목록 출력
dz> list.activity # 액티비티 모듈 목록 출력
dz> list.service # 서비스 모듈 목록 출력
dz> list.broadcast # 브로드캐스트 모듈 목록 출력
dz> list.provider # 프로바이더 모듈 목록 출력

설치된 패키지 목록 확인 : run app.package.list

특정 단어로 설치된 패키지 확인 : 

dz> run app.package.list f [string to be searched]

설치된 패키지 기본 정보 확인 : dz> run app.package.info a [package name]

AndroidManifest xml 파일 확인 : dz> run app.package.manifest [package

앱 취약점 자동 분석 : dz> run app.package.attacksurface [package

 

취약한 액티비티 컴포넌트

취약점 소개: 

 액티비티는 애플리케이션을 구성하는 기본적인 구성 단위 중 하나
 애플리케이션과 사용자 간의 상호작용할 수 있는 화면을 제공
 AndroidManifest.xml 의 <activity> 요소에 선언
 취약하게 설정되어 있다면 , 인증 로직을 무시하고 필요한 액티비티 강제 호출 가능
 권한 없는 액티비티에 접근이 가능

 

액티비티 확인: 

 <application> 요소 안에 여러 개의 < 가 포함
 exported 속성 값이 true 이면 다른 애플리케이션에서 액티비티 실행 가능
 Intent filter 가 포함되면 true 상태로 됨
 exported 속성 값이 false 이면 같은 애플리케이션 혹은 같은 사용자 ID 만 실행 가능

 

식별한 액티비티 실행- ADB:

$ adb shell am start n [package name/component name]

$ adb shell am start n [package name/component name] e <KEY> <VALUE>

$ adb shell am start n com.android.insecurebankv2/. ChangePassword e uname jack
Starting: Intent {cmp =com.android. ChangePassword (has extras)

 

액티비티 식- Drozer:

dz> run app.activity.info a [package name]

(insecurebank에서는 액티비티 사용을 위한 Permission 이 설정되어 있지 않음)

 

식별한 액티비티 실행- Drozer: 

dz> run app.activity.start component [package name] [component name]

dz> run app.activity.start component [package name] [component name] extra
[type] [key] [value]

 

대응방안: 

 Androidmanifest xml 에 선언된 android exported 속성을 false 로 설정
 false 로 설정되는 경우 외부의 영향을 받지 않음
 false 로 설정된 액티비티를 강제 실행하는 경우 "Permission Denial" 메시지 출력

 

취약한 콘텐츠 프로바이더 접근

취약점 소개
 콘텐츠 프로바이더는 다른 애플리케이션에서 데이터베이스나 파일에 접근 가능하도록 인터페이스 제

 콘텐츠 프로바이더에 접근하기 위해 URI 와 ContentResolver 필요
 애플리케이션은 ContentResolver 를 이용하여 콘텐츠 프로바이더에 접근 가능하며 URI 를 이용
 콘텐츠 프로바이더가 외부에 노출된 경우 외부에서 접근하여 데이터를 조회하거나 변경 가능

 

콘텐츠 프로바이더 확인

<provider
	android:name=".TrackUserContentProvider"
	android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
	android:exported="true" >
</provider>

 

콘텐츠 프로바이더 취약점 확인- ADB: $ adb shell content query uri [URI]

- content:// 콘텐츠 URI로 식별

- user_dictionary 제공업체의 권한

- words의 테이블 경로: content://user_dictionary/words

 

콘텐츠 프로바이더 취약점 확인- Drozer:

dz> run app.package.attacksurface [package

dz> run app.provider.info -a [package name]

dz> run scanner.provider.finduris -a [package name]

dz> run app.provider.query [uri]

 

대응방안

 Androidmanifest xml 에 선언된 android exported 속성을 false 로 설정
 false 로 설정되는 경우 외부의 영향을 받지 않음
 False 로 설정된 콘텐츠 프로바이더에 강제로 요청하는 경우 "Permission Denial" 메시지 출력

 

취약한 브로드캐스트 리시버

취약점 소개:
 브로드캐스트 리시버는 디바이스에서 발생하는 이벤트 신호를 받아 처리하는 역할
 애플리케이션의 브로드캐스트 리시버에서 신호를 받아 정해진 작업 수행
 Androidmanifest.xml 의 <receiver></receiver> 항목에 정의
 공격자는 임의의 브로드캐스트 신호를 생성하여 사용자가 받는 알림 메시지 , 전화 등 을 가로 채거나
특정 상황에서 발생하는 작업을 우회하여 수행 가능

 

브로드캐스트 리시버 확인:

(Androidmanifest.xml 에 선언된 브로드캐스트 리시버 확인)

 브로드캐스트 리시버 클래스 : MyBroadCastReceiver
 브로드캐스트 이름 : theBroadcast

 

브로드캐스트 생성- ADB:

$ adb shell am broadcast a [action] n [package name/component name]

$ adb shell am broadcast a [action] n [package name/component name] -e <KEY> <VALUE>

 

브로드캐스트 생성- Drozer:

dz> run app.package.attacksurface [package name]

dz> run app.broadcast.info a [package name]

dz> run app.broadcast.send component component [package name]

[component name] extra [type] [key] [value]

 

대응방안

 Androidmanifest.xml 에 선언된 브로드캐스트 리시버의 android:exported 항목을 false 로 설정
 선언된 각각의 브로드캐스트 리시버에 별도의 권한 (Permission) 부여

 

취약한 인증 메커니즘

취약점 소개
 정상적인 인증 절차를 우회하여 비정상적으로 인증 권한 획득
 OWASP Mobile Top 10 2016 M4 에 해당

 

로그인 인증 우회

 AndroidManifest.xml 의 취약한 액티비티를 통해 인증 우회
 <application> 요소 안에 여러 개의 <activity> 확인
 exported 속성 값 확인

 

로그인 인증 우회- ADB:

$ adb shell am start -n [package name/component name]

 

로그인 인증 우회- Drozer:

dz> run app.activity.info

dz> run app.activity.info -filter bank

dz> run app.activity.info -filter bank

dz> run app.activity.info -a [package name]

dz> run app.activity.start --component [package name] [component name]

 

대응방안

 Androidmanifest.xml 에 선언된 android:exported 속성을 false 로 설정
 false 로 설정된 경우 외부의 영향을 받지 않아 같은 UID 를 가진 앱 컴포넌트만 접근 가능
 true 로 설정해야 하는 경우 <intent filter> 에서 별도 권한 설정
 인증 우회의 경우 다양한 시나리오가 존재하므로 개발시 고려하여 적용
 false 로 설정된 액티비티를 강제 실행하는 경우 "Permission 메시지 출력

 

 

최신 동향 

- Appie 활용을 통한 앱 취약점 진단

- Inspeckage 활용을 통한 앱 취약점 진단

- 앱 서비스 자동화분석 MobSF

- AndroBugs 활용을 통한 앱 자동화 분석

- ostorlab 활용을 통한 앱 자동화 진단