취약점 개요

비밀번호 변경 구현 취약점은 모바일 앱의 비밀번호 변경 기능을 사용할 때 취약하게 구현되어 있어 제 3자가 비밀번호를 변경할 수 있는 취약점이다.

인시큐어뱅크 앱은 비밀번호 변경 버튼을 클릭하면 로그인 중인 사용자의 현재 비밀번호를 입력받지 않고, 새로운 비밀번호를 변경할 수 있다.

실질적으로 사용자에게 배포한 앱에 이런 취약점이 있다면 여러 사용자의 비밀번호를 일괄적으로 변경할 수 있고, 중요한 정보와 민감한 정보를 획득할 수 있는 중대한 취약점이 존재한다.


모바일 앱 취약점 진단 뿐만 아니라 웹 모의해킹을 할 때, 비밀번호 기능이 있는 페이지의 경우 검증 로직이 구현되어 있는지 확인한다. 이 부분을 잠깐 살펴보자.


비밀번호 복잡도 구현, 동일한 비밀번호 변경할 수 없도록 제한

회원 가입 및 회원정보 수정 시 비밀번호 복잡도가 구현되어 있지 않거나 현재 비밀번호와 동일한 새 비밀번호로 변경하도록 설정되어 있으면 사용자는 비밀번호를 단순하게 설정하거나 오랫동안 동일한 비밀번호를 사용할 가능성이 존재한다.


이를 통해 공격자는 무작위 대입 공격이나 비밀번호 추측 공격을 실시하여 사용자의 아이디와 비밀번호를 쉽게 획득할 수 있다. 또한, 유출된 계정의 비밀번호를 변경하지 않는 한 계속 악용될 수 있다.


중요 페이지 접근 시 비밀번호 재입력 요구, 현재 비밀번호 요구
회원정보 수정, 회원 탈퇴, 비밀글 게시판, 유료정보 등 중요 정보 접근 시 현재 설정된 비밀번호를 사용자에게 요구하지 않으면 공격자가 다른 사용자의 세션을 가로챈 후 회원정보를 수정하거나 회원 탈퇴 등의 행위가 가능하다.


로그인 실패 횟수 제한
사용자가 로그인 시 실패 횟수 제한 및 계정 잠금 기능이 설정되어 있지 않으면 공격자가 무작위 대입 공격이나 비밀번호 추측 공격을 실시하여 사용자의 아이디와 비밀번호를 쉽게 획득할 수 있다.


취약점 진단

보안이 잘 적용되어 있는 다른 포털 사이트는 로그인 후 비밀번호 변경 페이지에 접속하면 현재 비밀번호, 새로우 비밀번호, 새로운 비밀번호 확인 총 3단계를 거친다.


하지만, 인시큐어뱅크 앱은 정상적으로 로그인이 되면 현재 비밀번호를 요구하지 않아 임의의 사용자가 비밀번호를 변경할 수 있게 구현되어 있다.


AndroidManifest.xml 파일의 ChangePassword 액티비티는 비밀번호 변경을 담당하는 액티비티이다. 만약, 해당 액티비티가 외부에 노출되어 있으면 다른 모바일 앱에서 인증 과정 없이 비밀번호를 변경할 수 있는 취약점이 존재한다.



모바일 앱에 회원 가입되어 있는 계정으로 로그인을 한다. 비밀번호 변경 버튼을 클릭하면 새로운 비밀번호를 입력할 수 있는 폼이 나타난다.


단순한 비밀번호를 입력하고, 비밀번호 변경 버튼을 클릭하면 비밀번호 복잡도가 만족하지 않아 변경에 실패했다는 메시지가 나타난다.


비밀번호 변경 액티비티를 실행했을 때 확인된 사항은 현재 비밀번호를 요구하지 않는다는 점이다.


만약, 제 3자가 스니핑 공격을 시도하여 다른 사용자의 아이디를 획득하거나 무작위 대입 공격, 아이디 추측 공격을 시도하면 임의의 비밀번호를 변경할 수 있다.



비밀번호 변경 시 서버로 전송되는 요청 패킷을 중간에 잡아 단순한 비밀번호로 변조하여 서버로 요청한다. 사용자가 요청한 패킷에 적절한 검증을 하지 않으므로 비밀번호가 정상적으로 변경된다.


최종적으로 비밀번호 변경 기능을 이용했을 때 확인된 사항은 다음과 같다.


ㅇ 비밀번호 변경 액티비티가 노출되어 외부에서 비밀번호 변경 액티비티 호출 가능

ㅇ 비밀번호 변경 시 현재 비밀번호를 요구하지 않음

ㅇ 비밀번호 변경 시 매개변수를 검증하지 않아 단순한 비밀번호 변경 가능

ㅇ 비밀번호 변경 시 평문 전송



대응 방안 및 검증

비밀번호 변경 구현 취약점은 로그인을 한 사용자의 현재 비밀번호를 입력받지 않아 제 3자가 비밀번호를 변경할 수 있는 취약점이 존재한다.


이를 해결하려면 비밀번호 변경 시 현재 비밀번호를 요구하고, 매개변수 검증 로직을 구현하여 단순한 비밀번호로 변경할 수 없도록 설정해야 한다.


비밀번호 변경 구현 취약점
비밀번호 변경 등과 같은 중요한 기능에 접근하기 전 현재 비밀번호를 입력 받도록 구현
비밀번호 변경 시 단순한 비밀번호로 변경할 수 없도록 매개변수 검증
비밀번호는 중요한 정보이므로 평문으로 전송하지 않고 암호화를 적용하여 전송

안드로이드 스튜디오에서 레이아웃 파일을 열 때 Rendering Problems 메시지가 나타나거나 레이아웃에 지정된 한글이 올바르게 나타나지 않은 경우가 있다.


이를 해결하려면 편집기 위쪽의 안드로이드 버전 드롭다운을 클릭하여 "API 16:Android API 16"을 선택하면 된다.



안드로이드 스튜디오 좌측 화면의 res > layout > activity_change_password.xml을 클릭하면 비밀번호를 담당하는 레이아웃 정보가 나타난다.


레이아웃은 여러 개의 액티비티를 UI 형태로 보여주는 것으로 버튼, EditText 등을 이용하여 사용자의 입력을 받거나 정보를 보여주는 역할을 한다.


비밀번호 변경 액티비티 실행 시 사용자에게 현재 비밀번호를 입력 받게하려면 Username, New Password 사이에 Current Password 뷰를 삽입해야 한다.


activity_change_password.xml의 태그가 총 3개 있다. New Password에 해당하는 태그 전체(23행 ~ 39행)를 복사하여 Username에 해당하는 태그 바로 아래(22행)에 붙여 넣는다.



27행과 31행을 다음과 같이 수정한다. id는 소스코드에서 해당 뷰를 찾기 위한 고유의 아이디이다.



현재 비밀번호 레이아웃을 추가했으므로 클라이언트 소스코드에서 처리할 수 있도록 수정해야 한다. 현재 비밀번호를 입력받을 변수를 선언하고, changePassword_text 밑에 currentPassword_text 를 추가한다.


코드를 보면 findViewById() 메소드를 사용한 것을 알 수 있는데, 이 메소드는 인자로 지정한 고유의 아이디 값을 가지고 해당 뷰를 찾을 수 있다.



postData()는 사용자가 입력한 아이디, 비밀번호를 /changepassword 서버 주소로 전달한다. 사용자가 입력한 현재 비밀번호도 동일한 주소로 전달하려면 코드를 추가해야 한다.



▶ Android Drozer 설치 및 사용법

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

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

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

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

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

▶ 안드로이드 키보드캐시 취약점

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

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

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

▶ 안드로이드 다중 사용자 로그인 취약점

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

▶ 안드로이드 SD카드 저장소 취약점 (Android SDCard Storage)

▶ 안드로이드 하드코딩 취약점 (Android Hardcoded Secrets)

▶ 안드로이드 HTTP 통신 취약점 (Android Insecure HTTP Connections)

▶ 안드로이드 사용자 계정 목록화 취약점 (Android Username Enumeration)

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

▶ 안드로이드 개발자 백도어 취약점 (Android Developer Backdoors)

▶ 안드로이드 로깅 메커니즘 취약점 (Android Logging Mechanism)

▶ 안드로이드 인증 취약점 (Android Weak Autorization Mechanism)

▶ 안드로이드 매개변수 조작 취약점 (Android Parameter Manipulation)

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