일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 무료교육
- 마감임박
- 모듈러 연산
- Writeup
- 백엔드
- 개인정보보호
- 디오판투스 알고리즘
- 웹 프레임워크
- 백엔드입문
- 한국정보보호산업협회기자단
- 국가인적자원개발컨소시엄
- 포너블
- function scope
- 한국산업인력공단
- package.json
- 곱셈 암호
- 덧셈 암호
- 개인정보안전성
- 개인정보보호위원회
- package-lock.json
- 동적타이핑
- node.js
- 가명정보처리
- arrow function
- 한국정보보호산업협회
- 호이스팅
- 확장 유클리드 알고리즘
- 개인정보보호교육
- 유클리드_알고리즘
- pwnable.tw
- Today
- Total
짱짱해커가 되고 싶은 나
[안드로이드 취약점 진단] 3-4. 로컬 암호화 이슈 본문
SharedPreferences
안드로이드 애플리케이션에서 해당 프로그램 내에 파일 형태로 데이터를 저장하고 삭제하기 전까지 그 내용을 유지할 수 있다.
SharedPreferences는 초기 설정값, 자동 로그인 등 간단한 환경 변수를 앱의 저장 공간 아에 파일 형태로 저장한다.
(별도로 삭제하지 않는 이상 재부팅되더라도 값 유지)
-> 편집하기 위해서는 SharedPreferences.Editor 인터페이스에 포함되어 있는 메서드를 사용해야함
- putBoolean(String key, boolean value) : boolean 값을 키 값으로 지정
- putFloat()
- putInt
- putLong
- putString
- putStringSet(String key, Set<String> values)
- Apply.commit() : 변경한 값을 변수에 저장
- clear() : sharedpreferences 오브젝트에 있는 값 삭제
인시큐어뱅크 - Local Encryption issues
3-1에서 말하다가 말았던 shared_prefs와 관련된 얘기다.
인시큐어뱅크의 로그인 화면에는 autofill credentials가 있다.
해당 버튼을 누르면 가장 최근 로그인 정보로 자동으로 이름과 pw칸이 채워진다.
그렇다면 마지막으로 로그인된 아이디와 패스워드가 앱의 내부에 저장되어 있을 것이다.
코드를 보자.
LoginActivity
fillData_button이 눌리면 fillData()가 실행된다.
fillData()는 mySharedPreferences.xml을 가져와서 EncryptedUsername과 superSecurePassword의 값을 가져오고 둘 다 null이 아니라면 EncryptedUsername을 base64로 디코딩한다.
그리고 username 텍스트 입력 칸에다가 디코딩된 username을 넣어주고
password에는 가져온 password 값을 aes로 암호화해서 넣어준다.
DoLogin
최근 로그인 정보가 mySharedPreferences에 저장되어 있으니 login을 하게 되면 해당 xml에 값을 넣는 코드가 있을 것이다.
saveCreds 함수를 보면 입력된 username과 password를 mySharedPreferences에 저장하는 것을 볼 수 있다.
Editor를 통해 username을 base64로 인코딩하고 password를 aes로 암호화해서 저장한다.
암호화할 때 사용하는 CryptoClass를 확인해보자.
key는 "This is the super secret key 123"이고 aes256으로 암호화한다는 것을 알 수 있다.
aes는 대칭키니까 해당 키를 복호화할 때 그대로 사용하면 된다.
/data/data/com.android.insecurebankv2/shared_prefs
shared_prefs에는 com.android.insecurebankv2_preferences.xml과 mySharedPreferences.xml이 있다.
자동 로그인에 사용되는 mySharedPreferences.xml에는 가장 최근에 로그인한 superSecurePassword와 EncryptedUsername이 들어있다. (base64디코드, aes decrypt를 하면 평문을 구할 수 있다.)
com.android.insecurebankv2_preferences.xml에는 서버의 ip와 port 정보가 들어있다.
대응 방안
1. 인코딩 -> 암호화
인코딩은 특정 알고리즘에 의해 치환되는 것이기 때문에 디코딩되기 쉽다.
2. 별도의 키 관리 서버
aes256은 안전한 암호지만 리버싱해서 키를 알아낼 수 있다면 안전하지 않다.
따라서 키 관리 서버를 별도로 두고, 키는 주기적으로 바꿔줘야한다. (키 변경 시 최소한의 인원만 키에 대한 정보를 알 수 있어야함)
3. 암호화한 키를 파일 시스템에서 관리
공격자가 프로세스가 동작하는 도중에 메모리 덤프를 통해 키를 추출할 수 있다는 점을 주의해야한다.
'모바일' 카테고리의 다른 글
[안드로이드 취약점 진단] 3-6. 루팅 탐지 및 우회 (0) | 2022.06.19 |
---|---|
[안드로이드 취약점 진단] 3-5. 액티비티 컴포넌트 취약점 (0) | 2022.06.11 |
[안드로이드 취약점 진단] 3-3. 취약한 인증 메커니즘 (0) | 2022.06.11 |
[안드로이드 취약점 진단] 3-2. Intent Sniffing and Injection (0) | 2022.06.11 |
[안드로이드 취약점 진단] 3-1. 브로드캐스트 리시버 결함 (0) | 2022.06.11 |