취약점 개요
액티비티(Activity)는 안드로이드 화면에 보여지는 것으로 사용자와 상호작용하여 데이터를 입력 받거나 정보를 보여주는 컴포넌트이다.
네이버 앱을 실행하면 로그인 화면이 뜨게 되고, 사용자에게 아이디와 비밀번호를 입력 받는다.
입력한 값이 일치하면 정상적으로 로그인이 되어 메인 메뉴가 실행되고, 사용자는 제공하는 기능 중 하나를 클릭하면 해당 기능을 이용할 수 있다.
하지만, 인시큐어뱅크 앱은 로그인 화면을 거치지 않고 비밀번호를 변경할 수 있는 취약점이 존재한다.
취약점 진단
AndroidManifest.xml 파일내의 <activity ~ </activity>가 액티비티이다. 액티비티의 이름은 ChangePassword이고, exported 속성이 true로 설정되어 있으므로 외부에 노출된다.
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.java 소스 코드를 보면 인텐트가 현재 로그인한 사용자의 아이디를 전달하여 텍스트뷰에 설정한다.
소스 코드에서 확인한 uname을 지정하여 ChangePassword를 호출한다.
○ run app.activity.start --component 패키지명 액티비티명 --extra string 변수명 값
아이디를 지정하여 호출했으므로 비밀번호 변경 시 업데이트 메시지가 뜨게 된다.
SandDroid의 결과 보고서를 보면 5개의 액티비티가 외부에 노출됐고, 액티비티 이름과 인텐트 이름이 확인된다.
ChangePassword 액티비티의 구현부인 RequestChangePassword는 소스 코드 분석 시 ChangePassword.java에서 확인한 결과와 동일하다.
대응 방안 및 검증
액티비티 취약점은 <activity> 태그 내의 android:exported 속성이 true로 설정되어 있어 액티비티 호출이 가능하다. 또한, 비밀번호 변경 전 이전 비밀번호를 입력 받는 코드가 구현되어 있지 않다.
액티비티 취약점 |
AndroidManifest.xml에 구현되어 있는 <activity> 태그 내의 android:exported="true" 속성을 "false"로 변경 |
Permission 속성을 이용한 접근 제어 |
비밀번호 변경 전 인증 코드 추가 |
AndroidManifest.xml에 구현되어 있는 <activity> 태그 내의 android:exported="true" 속성을 "false"로 변경한다.
정상적으로 보안 조치가 적용되었는지 드로저로 노출된 액티비티 갯수를 보면 갯수가 한 개 줄어들었다.
정확한 검증을 위해 인자를 전달하지 않고 ChangePassword를 호출하면 접근 거부 메시지가 출력된다.
▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)
▶ AndroidManifest Oncreate 메소드 분석
▶ 안드로이드 백업 취약점 (Android Backup)
▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)
▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)
▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)
▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)
▶ 안드로이드 암호화 구현 취약점 (Android AES 복호화)
▶ 안드로이드 디컴파일 방지 우회 (APK Protect)