본문 바로가기
해킹&보안/모바일

모바일 정적분석 #4

안전하지 않은 데이터 저장 분석

1. 서론 

모바일 애플리케이션은 사용자 편의를 위해 아이디, 비밀번호, 자동 로그인 토큰 등 다양한 데이터를 기기 내부에 저장합니다.

이때 데이터를 안전하게 저장하지 않으면 기기를 루팅한 공격자나 다른 악성 앱이 해당 데이터에 접근하여 민감 정보를 탈취할 수 있습니다. 이것을 안전하지 않은 데이터 저장 취약점이라고 합니다.

안드로이드에서 간단한 설정 값이나 소량의 데이터를 저장하는 데 널리 사용되는 SharedPreferences는 이러한 취약점이 자주 발견되는 대표적인 저장소입니다. SharedPreferences는 앱 내부 경로에 XML 파일 형태로 데이터를 저장하는데, 이 파일에 민감 정보를 암호화하지 않고 그대로 저장하거나 취약한 방식으로 암호화하여 저장할 경우 문제가 발생합니다.

이번 포스트에서는 InsecureBankv2가 로그인 성공 후 SharedPreferences에 사용자 계정 정보를 저장하는 로직을 정적 분석하여, 어떤 보안적 실수를 범하고 있는지 구체적으로 파헤치는 것을 목표로 합니다.


2. 분석 환경

분석 대상: InsecureBankv2.apk

분석 도구: JADX-GUI 


3. 분석 절차

3.1. 분석 전략: 데이터 저장 코드 식별

일반적으로 데이터 저장은 특정 이벤트(로그인 성공, 설정 변경 등) 후에 발생합니다. 로그인 로직을 담당하는 DoLogin.java 클래스에서 로그인 성공 후 호출되는 메소드를 중점적으로 분석하는 전략을 사용합니다.

 

3.2. 단서 식별: JADX를 이용한 코드 분석

  1. JADX에서 DoLogin.java 파일을 엽니다.
  2. RequestTask 내부 클래스의 postData 메소드에서 로그인 성공(Correct Credentials) 시 saveCreds() 라는 메소드를 호출하는 것을 확인할 수 있습니다.
  3. saveCreds() 메소드의 코드를 분석하면, SharedPreferences를 이용하여 아이디와 비밀번호를 저장하는 로직을 명확히 파악할 수 있습니다.

위 코드는 언뜻 보기에는 아이디를 인코딩하고 비밀번호를 암호화하여 안전해 보이지만 실제로 두 가지 보안 문제를 내포하고 있습니다.


4. 취약점 분석 및 영향

SharedPreferences 파일은 루팅된 기기에서는 /data/data/[패키지이름]/shared_prefs/ 경로에서 쉽게 접근 및 조회가 가능합니다. 공격자가 이 파일의 내용을 획득했다고 가정하고 취약점을 분석합니다.

 

4.1. 취약점 1: Base64 인코딩을 통한 난독화

  • 취약점 코드: Base64.encodeToString(...)
  • 취약점 분류: CWE-312
  • 위험도: 높음 
  • 상세 설명: Base64는 암호화(Encryption)가 아닌 인코딩(Encoding) 방식입니다. 즉, 데이터를 안전하게 숨기는 기술이 아니라 단순히 다른 형식의 데이터로 변환하는 기술입니다. 따라서 Base64로 인코딩된 문자열은 누구나 쉽게 원래의 평문으로 디코딩할 수 있습니다. 아이디와 같은 민감 정보를 Base64로만 인코딩하여 저장하는 것은 평문으로 저장하는 것과 보안상 아무런 차이가 없습니다.

4.2. 취약점 2: 하드코딩된 키를 이용한 암호화

  • 취약점 코드: crypt.aesEncryptedString(...)
  • 취약점 분류: CWE-321
  • 위험도: 높음 
  • 상세 설명: 비밀번호는 CryptoClass를 통해 AES 암호화되지만, 정적분석 #1에서 분석했듯이 이 CryptoClass는 "This is the super secret key 123"이라는 하드코딩된 키와 고정된 IV 값을 사용합니다. 공격자는 JADX로 소스 코드를 분석하여 이 키를 쉽게 획득할 수 있습니다. 공격자는 SharedPreferences 파일에서 암호화된 비밀번호를 가져온 뒤 코드에서 추출한 키를 이용해 원래의 비밀번호를 손쉽게 복호화할 수 있습니다.

5. 결론 및 대응 방안

SharedPreferences는 그 편리함 때문에 많이 사용되지만, 민감 정보를 저장하는 용도로는 적합하지 않습니다. 만약 부득이하게 사용해야 한다면, 반드시 강력하고 안전한 암호화 메커니즘이 동반되어야 합니다.

 

안전한 데이터 저장 방안

  • Android Keystore 시스템 사용: 민감 정보 암호화에 사용될 암호화 키는 Android Keystore에 저장하는 것이 가장 안전합니다. Keystore는 암호화 키를 앱의 프로세스로부터 격리된 안전한 하드웨어에 저장하고 관리해 주기 때문에 루팅된 기기에서조차 키를 추출하기가 매우 어렵습니다. SharedPreferences에 데이터를 저장하기 전에, Keystore에 저장된 키를 이용해 암호화하는 방식을 사용해야 합니다.
  • 민감 정보 저장 최소화: 가능하면 아이디, 비밀번호와 같은 민감 정보는 기기에 저장하지 않고, 로그인 성공 후 발급되는 세션 토큰을 저장하여 인증에 활용하는 것이 더 안전한 방식입니다.

 

'해킹&보안 > 모바일' 카테고리의 다른 글

모바일 정적분석 #6  (0) 2025.10.18
모바일 정적분석 #5  (0) 2025.10.18
모바일 정적분석 #3  (0) 2025.10.17
모바일 정적분석 #2  (0) 2025.10.16
모바일 정적분석 #1  (0) 2025.10.16