취약점 개요
비밀번호 변경 구현 취약점은 모바일 앱의 비밀번호 변경 기능을 사용할 때 취약하게 구현되어 있어 제 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 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)