반응형
SMALL

1. 취약점 소개

안드로이드 액티비티는 애플리케이션을 구성하는 가장 기본적인 구성 단위 하나로 안드로이드 애플리케이션과 사용자 간에 상호 작용에 필요한 기능을 제공한다. 액티비티는 AndroidManifest.xml <activity> 요소에 선언하며 하나의 애플리케이션은 하나 이상의 액티비티로 구성된다. 특정 액티비티는 MainActivity, 매니페스트에 메인 액티비티로 선언한다. MainActivity 애플리케이션 시작 나타나는 화면이며, 애플리케이션 실행 조건에 따라 설정된 액티비티가 호출된다. 만약 새로운 액티비티 시작 기존에 실행된 액티비티는 시스템에서 스택에 저장되고 새로운 액티비티가 실행된다. 다시 기존에 액티비티를 실행하기 위해 뒤로가기 버튼을 누르면 기존에 저장한 스택에서 다시 불러와 액티비티 화면이 실행된다. 애플리케이션 액티비티가 보안적으로 취약하면 로직을 무시하고 공격자가 필요한 액티비티를 강제로 호출해서 권한이 없는 사용자가 특정 액티비티에 접근해서 권한 없이 특정 기능을 활성화 있다. 예를 들면 로그인 과정을 수행하지 않고 계좌 이체 화면으로 바로 넘어가 사용할 있게 되는 취약점이 있다.

액티비티는 AndroidManifest.xml <activity> 요소에 선언하며 하나의 애플리케이션은 하나 이상의 액티비티로 구성된다. 특정 액티비티는 MainActivity, 매니페스트에 메인 액티비티로 선언한다. MainActivity 애플리케이션 시작 나타나는 화면이며, 애플리케이션 실행 조건에 따라 설정된 액티비티가 호출된다. 만약 새로운 액티비티 시작 기존에 실행된 액티비티는 시스템에서 스택에 저장되고 새로운 액티비티가 실행된다. 다시 기존에 액티비티를 실행하기 위해 뒤로가기 버튼을 누르면 기존에 저장한 스택에서 다시 불러와 액티비티 화면이 실행된다.

애플리케이션 액티비티가 보안적으로 취약하면 로직을 무시하고 공격자가 필요한 액티비티를 강제로 호출해서 권한이 없는 사용자가 특정 액티비티에 접근해서 권한 없이 특정 기능을 활성화 있다. 예를 들면 로그인 과정을 수행하지 않고 계좌 이체 화면으로 바로 넘어가 사용할 있게 되는 취약점이 있다.

 

2. 취약점 진단

[그림 2-1] adb 명령어 실행

adb shell am start n com.android.insecurebankv2/.ChangePassword 명령어를 실행하면 그림 1-1과 같이 패스워드 변경 액티비티가 실행된다. 하지만 adb 명령어로는 패스워드 변경 권한이 있는지 없는지에 대한 여부는 알 수 없다.

 

[그림 2-2] 노출된 액티비티 목록

드로저를 실행해 run app.activity.info a com.android.insecurebankv2 명령어를 실행하면 현재 노출된 액티비티 정보 목록을 검색해 볼 수 있다. 액티비티에선 exported 속성이 존재하는데 true 선언이 되있으면 [그림 1-2] 같이 외부에서 실행 가능한 상태로 노출되며 false 선언이 되있으면 외부에서 실행할 없다. 맨 마지막 줄에 ChangePassword 액티비티가 있는데, 이미 노출되고 있음을 파악할 수 있다.

 

[그림 2-3] 드로저 명령어 실행

드로저 창에서 run app.activity.start--component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword 명령어를 입력하고 실행하면 그림 1-3과 같이 ChangePassword 액티비티가 실행된다.

 

[그림 2-4] 아이디 값 노출

드로저 창에서 run app.activity.start--component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword --extra string uname jack 명령어를 입력하면 [그림 2-4]와 같이 아이디 값이 들어가 있는 상태로 액티비티가 실행된다.

 

[그림 2-5] 소스 코드

ChangePassword 액티비티를 실행하는 경우 가장 먼저 수행되는 onCreate() 있다. 액티비티를 실행할 uname에게 사용자 이름을 전달하고 값을 textView_Username.setText(uname) 통해 화면에 표시된다. 비밀 번호를 입력한 Changepassword 버튼을 누르면 ChangePassword.RequestChangePasswordTask 실행된다. 이후 코드는 입력된 값을 서버로 전송한다.

 

[그림 2-6] 패스워드 변경

기존의 비밀번호를 변경해본다. 패스워드는 대, 소문자, 특수문자가 섞여야 변경되기 때문에 최대한 어렵게 변경한다.

 

[그림 2-7] 로그인 성공

비밀번호를 변경하고 로그아웃 해서 변경된 패스워드로 다시 로그인한다. 변경된 패스워드로 로그인이 되면 [그림 2-7]과 같은 화면이 나온다.

 

3. 대응 방안

[그림 3-1] 코드 변경

Android Manifest.xml 확인한 Android:exported=”true”false로 변경한다. exported 외부 application 에서 launch 가능 여부를 나타내는 속성이다. 해당 속성이 true 다른 애플리케이션에서 액티비티를 실행할 있고 false 경우엔 동일한 애플리케이션에서만 실행할 있거나 같은 사용자 ID 가진 애플리케이션만 실행이 가능하다.

 

[그림 3-2] 권한 거부

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword --extra string uname jack 명령어를 드로저 창에 입력하면 권한이 거부되었다는 메시지가 나오게 된다. 권한이 거부되면 바로 ChangePassword 창에 접근을   없게 된다.

 

[그림 3-3] 권한 목록 확인

run.app.activity.info a com.android.insecurebankv2 명령어를 드로저 창에 입력해 권한 목록들을 확인해보면 ChangePassword 없는 것으로 확인된다. 이제 ChangeActivity 접근하려면 정당한 절차를 거쳐야 실행할  있다.

 

 

반응형
LIST

'안드로이드 앱 취약점 진단 > 인시큐어뱅크' 카테고리의 다른 글

애플리케이션 패칭 취약점  (0) 2020.04.15
파라미터 조작  (0) 2020.02.29
XSS 공격  (0) 2020.02.10
로컬 암호화 이슈  (0) 2020.02.09
안드로이드 백업 취약점  (0) 2020.02.09
블로그 이미지

만년필석사

,