취약점 개요
안드로이드 애플리케이션은 실행되는 도중에 특정 정보들을 저장해야 할 때가 있습니다. 만약 개인 정보 같은 중요한 정보를 저장하려고 한다면, 어떠한 안전한 방법으로 저장할 지 고민해야 할 것입니다. 평문으로 저장한다면 공격자에게 중요한 정보가 노출될 수 있기 때문입니다.
대부분 중요한 정보의 저장을 위해 암호화를 사용합니다. 이번 글에서는 안드로이드 앱이 암호화하는 과정에서 어떤 취약점이 발생하는지 확인해보겠습니다.
취약점 진단
인시큐어뱅크 앱의 로그인 화면입니다. Login 버튼 밑의 Autofill Credentials 를 누르면 직전에 로그인했던 ID와 password를 불러와서 자동으로 입력해줍니다.
이런 기능이 실행된다는 것은 앱의 내부에 해당 ID와 비밀번호가 저장되어 있기에 가능합니다.
해당 정보를 찾기 위해 adb shell을 통해 디바이스에 접속해서 앱의 데이터가 저장되는 곳을 찾아가겠습니다.
< adb shell >
< cd /data/data/com.android.insecurebankv2/shared_prefs >
< ls -al >
위 사진과 같이 mySharedPreferences.xml 와 com.android.insecurebankv2_preferences.xml 파일이 존재합니다. 해당 파일을 cat 명령어로 출력해보면,
EncryptedUsername과 superSecurePassword 라고 되어있는 유저 ID와 비밀번호 같아보이는 값이 암호화되어 저장되어있습니다.
해당 파일은 초기 설정값, 자동 로그인 등 간단한 환경 변수를 애플리케이션의 저장 공간 안에 파일 형태로 저장합니다. 또한 별도로 삭제되지 않는 이상 부팅되더라도 값은 유지되는 특징을 가지고 있습니다.
해당 파일을 수정하기 위헤서는 반드시 SharedPreferences.Editor 인터페이스에 포함되어 있는 메서드를 사용해야합니다.
이 파일에 어떻게 패스워드와 아이디가 입력되는지 분석하기 위해서 jadx로 해당 함수를 찾아보겠습니다.
해당 함수는 자동로그인 기능을 사용하기 위해, 입력된 유저ID와 비밀번호를 인코딩하여 파일로 저장하는 코드입니다.
username 과 password를 입력값으로 받아,
username은 Base64로 인코딩하여 저장하고
password는 AES 알고리즘을 사용하여 암호화해서 저장함을 알 수 있습니다.
username은 Base64로 인코딩 되어있기 때문에 온라인 사이트에서 바로 해독이 가능합니다.
그 다음 비밀번호를 복호화 해야되는데, 다음 코드를 보면 CryptoClass()에서 객체를 생성해서 거기에 있는 aesEncryptedString 메서드를 사용하는 것을 볼 수 있습니다.
따라서 CryptoClass를 찾아가보면, 다음 코드를 볼 수 있습니다.
위 코드엔 AES 암호화에 사용되는 key 값이 그대로 노출되어 있습니다.
이로 인해 우리는 비밀번호의 값이 "This is the super secret key 123" 이라는 키로 AES 암호화 되었다는 것을 알게되었습니다.
이를 바탕으로 아래와 같이 비밀번호까지 평문으로 복호화가 가능합니다.
취약점 대응 방안
해당 앱처럼 사용자 ID를 base64로 인코딩 하면 안됩니다. 인코딩은 암호화 개념이 아니기 때문에 특정 알고리즘에 의해 치환되는 형태입니다. 때문에 디코딩이 가능할 확률이 높습니다. 사용자 ID 또한 AES 암호화를 적용해야 합니다.
비밀번호는 AES 암호화를 적용했지만, 위 코드처럼 key값이 관리가 제대로 되지 않는다면 암호화가 필요없는거나 마찬가지 입니다. 키를 관리하는 서버를 별도로 두고, 주기적으로 변경하거나 키를 암호화하여 파일 시스템에서 관리하는 방법도 있습니다.
1. 사용자 ID 인코딩으로 저장X
2. AES 암호화를 사용하면 key값에 대한 보안 대책이 있어야함
3. 소스 코드에 키가 있다면, 소스 코드 난독화나 바이너리 무결성 검증을 해야함
'Android' 카테고리의 다른 글
안드로이드 취약점 - < 메모리 내 민감한 정보 저장 > 분석 (0) | 2021.08.17 |
---|---|
앱 취약점 - < 루팅 탐지 및 우회 > 분석 (0) | 2021.08.16 |
앱 취약점 - 취약한 인증 메커니즘 분석 및 대응 방안 (0) | 2021.08.13 |
앱 취약점 - 브로드캐스트 리시버(Broadcast Receiver) 결함 분석 (0) | 2021.08.12 |
드로저(Drozer)를 활용한 앱 취약점 진단 | part.2 - 컴포넌트 분석 (0) | 2021.08.11 |