취약점 개요
사용자 계정 목록화 취약점은 모바일 앱에 가입되어 있는 사용자의 계정 정보가 암호화하지 않고 평문으로 노출되어 있는 취약점이다.
인시큐어뱅크 앱은 사용자의 아이디를 데이터베이스 파일에 평문으로 저장한다. 평문으로 저장된 아이디를 무작위 대입 공격, 비밀번호 추측 공격을 시도하여 비밀번호를 획득하여 모바일 앱에 로그인을 하여 중요 정보를 획득할 수 있다.
또한, 획득한 사용자의 계정이 다른 모바일 앱이나 포털 사이트에 동일하게 설정된 경우 재사용이 가능하며, 사용자가 비밀번호를 변경하지 않는 한 계속 악용될 소지가 있다.
인시큐어뱅크 앱은 아이디만 노출되어 있는데, 다양한 앱을 진단하다 보면 로그인 중인 사용자의 쿠키 값을 데이터베이스 파일에 저장한다.
쿠키 값은 AES로 암호화되어 있지만 하드 코딩되어 있는 대칭키로 충분히 복호화가 가능하다.
취약점 진단
사용자의 계정 정보는 내부 저장소 내의 database 디렉토리에 저장되므로 "adb pull 패키지이름" 명령어를 사용하여 로컬 PC로 다운로드한다.
adb pull 명령어는 안드로이드 모바일 앱의 파일을 로컬 PC로 다운로드하는 명령어이다.
adb pull 명령어 뒤에 패키지이름을 지정하면 모든 디렉토리를 다운로드하고, database를 지정하면 내부 저장소 내의 해당 디렉토리만 다운로드한다.
다운로드한 경로로 이동하면 databases 디렉토리에 mydb 파일이 존재한다. mydb 파일은 SQLite 형식의 파일이므로 SQLite Browser, SQLite Expert Personal 등의 프로그램을 설치해서 열어야 한다.
해당 프로그램을 설치 후 mydb 파일을 열어보면 현재 또는 과거에 접속한 사용자의 아이디가 암호화 되지 않고 평문으로 저장되어 있다.
DoLogin.java 파일의 trackUserLogins() 함수는 로그인에 성공한 사용자의 아이디를 데이터베이스에 추가하는 코드이다. getContentResolver().insert() 메소드는 매개변수로 아이디를 전달하여 데이터베이스에 추가하는 역할을 한다.
실질적으로 insert() 메소드를 추적해보면 데이터베이스의 name 필드에 사용자의 아이디를 암호화하지 않고 평문으로 저장한다.
대응 방안 및 검증
사용자 계정 목록화 취약점은 모바일 앱에 로그인에 성공했던 사용자의 아이디를 암호화하지 않고 평문으로 데이터베이스 파일에 저장할 때 발생한다.
이를 통해 무작위 대입 공격, 비밀번호 추측 공격을 시도하여 비밀번호를 획득할 수 있으므로 중요 정보는 AES로 암호화를 해야 한다.
사용자 계정 목록화 취약점 |
중요한 정보는 외부에 노출되지 않도록 내부 저장소에 암호화하여 저장하거나 서버측에서 처리 |
trackUserLogins() 함수 상단에 암호화 객체를 생성하고, 사용자의 아이디를 AES 암호화를 할 수 있도록 추가한다.
CryptoClass cryptoClass = new CryptoClass();
String username = cryptoClass.aesEncryptedString(username);
▶ 안드로이드 컴포넌트 취약점 (Android Activity)
▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)
▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)
▶ 안드로이드 백업 취약점 (Android Backup)
▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)
▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)
▶ 안드로이드 웹뷰 취약점 (Android Webview)
▶ 안드로이드 SD카드 저장소 취약점 (Android SDCard Storage)
▶ 안드로이드 하드코딩 취약점 (Android Hardcoded Secrets)