취약점 개요

액티비티(Activity)는 안드로이드 화면에 보여지는 것으로 사용자와 상호작용하여 데이터를 입력 받거나 정보를 보여주는 컴포넌트이다.


네이버 앱을 실행하면 로그인 화면이 뜨게 되고, 사용자에게 아이디와 비밀번호를 입력 받는다.


입력한 값이 일치하면 정상적으로 로그인이 되어 메인 메뉴가 실행되고, 사용자는 제공하는 기능 중 하나를 클릭하면 해당 기능을 이용할 수 있다.

 

하지만, 인시큐어뱅크 앱은 로그인 화면을 거치지 않고 비밀번호를 변경할 수 있는 취약점이 존재한다.


취약점 진단

AndroidManifest.xml 파일내의 <activity ~ </activity>가 액티비티이다. 액티비티의 이름은 ChangePassword이고, exported 속성이 true로 설정되어 있으므로 외부에 노출된다.


AndroidManifest.xml 내의 액티비티


ChangePassword 액티비티는 인시큐어뱅크 앱에서 비밀번호를 변경하는 액티비티이다. 로그인 버튼과 ChangePassword 버튼을 클릭해야 비밀번호를 변경할 수 있다.


하지만, 외부에 노출되어 로그인 과정 없이 비밀번호 변경 화면이 실행된다.


ChangePassword 호출


액티비티 취약점을 이용해 외부 어플리케이션(드로저)에서 인시큐어뱅크 어플리케이션의 ChangePassword를 호출한다.


비정상적인 액티비티의 흐름


드로저로 현재 노출된 액티비티를 보면 총 5개의 액티비티가 노출되었다고 나온다.


○ run app.package.attacksurface 패키지명


노출된 액티비티


노출된 액티비티의 정보를 보면 각 액티비티 이름, 권한 정보가 나온다.


○ run app.activity.info -a 패키지명


노출된 액티비티 정보


노출된 액티비티 중 ChangePassword 액티비티를 인자 없이 실행한다.


○ run activity.start --component 패키지명 액티비티명


노출된 액티비티 실행


정상적인 과정으로 ChangePassword 메뉴를 클릭하면 newpassword가 현재 로그인 한 사용자의 아이디로 설정된다. 하지만, 드로저로 실행하면 newpassword가 null로 설정된다.


노출된 액티비티 실행 시 로그


로그 결과와 동일하게 Username이 null 값으로 설정되어 새로운 비밀번호를 입력해도 변경되지 않는다.


노출된 액티비티 실행


정상적인 과정으로 ChangePassword 메뉴를 클릭하면 현재 로그인한 사용자의 아이디가 자동으로 대입된다. 새로운 비밀번호를 입력하고 ChangePassword 메뉴를 클릭한다.


ChangePassword 실행


정상적인 과정으로 비밀번호를 입력하면 새로운 비밀번호가 업데이트 되었다고 나온다.


비밀번호 변경 성공 로그


ChangePassword.java 소스 코드를 보면 인텐트가 현재 로그인한 사용자의 아이디를 전달하여 텍스트뷰에 설정한다.


ChangePassword 구현부


소스 코드에서 확인한 uname을 지정하여 ChangePassword를 호출한다.


○ run app.activity.start --component 패키지명 액티비티명 --extra string 변수명 값


인자를 지정하여 액티비티 실행


아이디를 지정하여 호출했으므로 비밀번호 변경 시 업데이트 메시지가 뜨게 된다.


비밀번호 변경 성공 메시지


SandDroid의 결과 보고서를 보면 5개의 액티비티가 외부에 노출됐고, 액티비티 이름과 인텐트 이름이 확인된다.


SandDroid의 액티비티


ChangePassword 액티비티의 구현부인 RequestChangePassword는 소스 코드 분석 시 ChangePassword.java에서 확인한 결과와 동일하다.


SandDroid의 ChangePassword 구현부


대응 방안 및 검증

액티비티 취약점은 <activity> 태그 내의 android:exported 속성이 true로 설정되어 있어 액티비티 호출이 가능하다. 또한, 비밀번호 변경 전 이전 비밀번호를 입력 받는 코드가 구현되어 있지 않다.


액티비티 취약점
AndroidManifest.xml에 구현되어 있는 <activity> 태그 내의 android:exported="true" 속성을 "false"로 변경
Permission 속성을 이용한 접근 제어
비밀번호 변경 전 인증 코드 추가

AndroidManifest.xml에 구현되어 있는 <activity> 태그 내의 android:exported="true" 속성을 "false"로 변경한다.


exported 속성 변경


정상적으로 보안 조치가 적용되었는지 드로저로 노출된 액티비티 갯수를 보면 갯수가 한 개 줄어들었다.


노출된 컴포넌트


정확한 검증을 위해 인자를 전달하지 않고 ChangePassword를 호출하면 접근 거부 메시지가 출력된다.


접근 거부 메시지


▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)

▶ 안드로이드 환경구축 ( 취약점 분석)

▶ Android Drozer 설치 및 사용법

▶ AndroidManifest Oncreate 메소드 분석

▶ 안드로이드 백업 취약점 (Android Backup)

▶ 안드로이드 메모리 노출 취약점 (메모리 덤프)

▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)

▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)

▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)

▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)

▶ 안드로이드 암호화 구현 취약점 (Android AES 복호화)

▶ 안드로이드 디컴파일 방지 우회 (APK Protect)

▶ 안드로이드 웹뷰 취약점 (Android Webview)

▶ 안드로이드 난독화 (코드 보호 기법)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유