1. 로컬 암호화 이슈
개요
안드로이드 어플리케이션은 실행되는 도중에
특정 정보들을 저장해야 할 때가 있습니다.
개인 정보처럼 민감한 정보일 수도 있고, 민감한 정보가 아닐 수도 있습니다. 만약 중요한 정보를 저장해야 한다면 충분한 암호화 과정을 거쳐야 하고, 충분한 암호화 과정을 거치지 않는다면 중요 정보가 공격자한테 누출될 수 있습니다
.중요 정보
보통 어플리케이션에서 저장될 요소 중 중요 정보는 다음과 같을 수 있습니다.
- 사용자의 개인정보 (예: 이름, 이메일 주소, 전화번호 등)
- 사용자의 인증 정보 (예: 패스워드, 토큰 등)
- 민감한 데이터 (예: 금융 정보, 건강 정보, 사적인 메시지 등)
- 애플리케이션의 중요한 설정 값 (예: API 키, 서버 주소 등)
저장 위치
안드로이드에는
shared_prefs
라는 폴더가 존재합니다. 해당 폴더는 /data/data/<패키지>/
경로에 존재하는데, SharedPreferences
는 XML 파일 형식으로 데이터를 저장하며, 해당 데이터는 애플리케이션에 속한 여러 구성 요소에서 공유될 수 있습니다. 주로 애플리케이션의 설정 값, 사용자 프로필 정보, 애플리케이션 상태 등을 저장하는 데 사용됩니다.🎯 해당 데이터를 호출하는 코드는 다음과 같습니다.
취약점
해당 정보들을 노출하거나, 암호화 하지 않아서 공격자가 권한을 탈취한 후 접근할 수 있다면 취약하다고 판단합니다.
2. 실습
2.1 인시큐어 뱅크 앱 실습
개요
인시큐어 뱅크 앱의 첫 로그인 화면에서 “Autofill Credentials” 라는 버튼을 볼 수 있습니다. 이 버튼을 사용하면 마지막으로 로그인했던 아이디와 패스워드를 자동으로 불러와 로그인 할 수 있습니다.
취약점 분석
➡️ 데이터 저장 위치 분석
한번 로그인에 성공하면, 추 후에 DoLogin 앱에 접근 시,
getDefaultSharedPreferences
에서 데이터를 가져오게 됩니다. 앞서 해당 메서드를 사용할 경우 데이터가 어디에 저장되는지 설명하였으니, 바로 확인해 보겠습니다.➡️ 저장된 데이터 확인
코드를 보면 유저의 아이디인
username
은 base64 encode
로 저장하고, 비밀번호인 rememberme_password
는 CryptoClass로 암호화를 적용한 뒤 SharedPreferences에 값을 수정합니다. 따라서 인시큐어뱅크 패키지의 ~/shared_prefs
폴더를 확인해 보겠습니다. 해당 파일 중,
mySharedPreferences.xml
파일을 확인하면, 저장된 아이디와 비밀번호가 확인 가능합니다.➡️ 암호화 방식 확인
- ID 부분 (base64)
- password 부분(AES)
이제 여기서 문제는 AES 부분입니다. 하지만 암호화에 사용된 클래스인
CryptoClass
를 분석해 보면, AES256을 쓰는것을 알 수 있습니다. 여기서 사용된 key
는 변수로 선언되어 있기 때문에 key를 어디서 가져오는지 확인하면 복호화가 가능합니다.놀랍게도 키가 클래스 선언부에 하드코딩 되어 있습니다.
➡️ 복호화
- ID
- password
이렇게 유저 정보를 손쉽게 탈취할 수 있었습니다.
2.2 대응방안
- 키를 관리하는 서버를 별도로 두고, 키는 주기적으로 변경합니다.
- 키를 암호화하여 파일 시스템에서 관리합니다.