취약점 개요

로그는 프로그램을 구동할 때 프로그램의 현재 상태를 확인할 수 있는 기능이다.


로그 레벨에 따라 일반적인 메시지, 에러 메시지, 경고 메시지, 디버그 등의 정보로 분류되며 안드로이드 앱은 로그캣이 로그 기록을 담당한다.

다양한 로그가 발생했을 때 주기적인 로그를 분석하면 개발자가 원하는 정보가 서버로 잘 전달되었는지, 계정 정보가 암호화되어 잘 전달되었는지 등을 확인할 수 있다. 또한, 취약점이나 개발상의 오류가 발생했을 때 유지보수하는데 사용할 수 있다.


하지만, 로깅 메커니즘 취약점은 중요한 정보, 개인 정보가 소스코드 상에 로그로 기록하도록 구현되어 있으면 로그 분석을 통해 민감한 정보가 노출되는 취약점이다.

인시큐어뱅크 앱은 로그인 시 아이디와 비밀번호를 입력했을 때 암호화하지 않는 평문의 정보로 로그에 기록할 때 발생한다.


취약점 진단

로그 분석 시 자주 사용하는 도구는 adb logcat, DDMS, LogFilter 도구가 있다.

adb 도구는 안드로이드 스튜디오를 설치하면 platform-tools 디렉토리에 자동으로 설치된다. adb logcat 명령어를 입력하면 안드로이드 단말기에서 발생한 수 많은 로그 정보를 확인할 수 있다.


로그 정보를 보면 알다시피 커맨드 라인 환경이므로 모든 명령어를 알아야하고, 글자 하이라이팅 기능이 없다는 단점이 존재한다. (안드로이드 스튜디오 하단의 인터페이스에 그래픽 환경으로 제공)


DDMS 도구는 안드로이드 스튜디오를 설치하면 tools 디렉토리에 자동으로 설치된다. adb 도구와 다르게 로그를 분석할 수 있는 UI가 제공된다.


LogFilter 도구는 로그 분석하기에 최적화 된 도구로 다양한 필터링 기능이 존재하고, 글자 하이라이팅 기능이 적용되어 있어 많이 사용한다.


LogFilter



LogFilter 도구를 실행하고 모바일 앱의 중요 기능을 우선적으로 실행하여 로그에 기록되는지 살펴보자.

1. 로그인 화면에서 입력한 아이디와 비밀번호가 로그에 평문으로 기록
2. 계좌이체 화면에서 입력한 송신자와 수신자의 계좌 번호와 이체 금액이 로그에 평문으로 기록
3. 비밀번호 변경 화면에서 입력한 비밀번호가 로그에 평문으로 기록

3개의 기능을 이용했을 때 중요한 정보가 로그에 평문으로 기록된다. 이런 정보가 로그에 기록되면 제 3자는 중요한 정보를 획득할 수 있다.


대응 방안 및 검증

로깅 메커니즘 취약점은 앱의 기능 이용 시 중요한 정보가 로그에 기록될 때 발생한다. 중요한 정보가 로그에 기록되지 않게하려면 중요 정보를 기록하는 로그 관련 코드를 삭제하여 앱을 배포해야 한다.


로깅 메커니즘 취약점
중요 정보를 기록하는 로그 관련 코드를 제거
로그 기록을 담당하는 클래스를 만들어 놓고 호출하여 사용

로그는 System.out.println, Log.d, Log.i 등 메소드로 로그를 기록한다. 안드로이드 스튜디오에서 Ctrl + Shift + F > System.out.println 순서로 입력하면 하단에 로그를 기록하는 코드를 확인할 수 있다.


로그를 기록하는 코드를 보면 아이디, 비밀번호, 계좌 번호, 이체 금액 등 중요 정보를 기록하는 코드가 존재한다. 해당 코드의 위치로 이동하여 삭제하면 중요 정보가 로그에 기록되지 않는다.



하지만, 이 방법은 현실적인 어려움이 존재하며 처음부터 로그 기록을 담당하는 클래스를 만들어 놓고 호출하여 사용하면 편리하다.


LogUtil 클래스는 각 로그 레벨별 로그를 기록하는 함수로 분류되어 있다. 최초 isDebug 변수에 ture가 설정되어 로그를 기록하게 되고, 기록하고 싶지 않다면 false로 설정하면 된다.


package com.android.insecurebankv2;

import android.util.Log;

public class LogUtil {
  private static boolean isDebug = true;
  
  public static void LogOut(String str){
    if(isDebug == true){
      System.out.println(str);
    }
  }

}

Ctrl + Shift + F를 눌러 검색 입력폼에 "System.out.println", "Log." 를 입력하면 하단의 해당 메소드를 사용한 코드들이 출력된다.


해당 코드로 이동하여 다음과 같이 기존의 로그 출력 메소드를 삭제하고, 새롭게 제작한 로그 유틸리티 메소드로 변경한다.


uname = intent.getStringExtra("uname");

// System.out.println("newpassword=" + uname);
LogUtil.LogOut("newpassword=" + uname);

▶ Android Drozer 설치 및 사용법

▶ 안드로이드 컴포넌트 취약점 (Android Activity)

▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)

▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)

▶ 안드로이드 백업 취약점 (Android Backup)

▶ 안드로이드 메모리 노출 취약점 (메모리 덤프)

▶ 안드로이드 키보드캐시 취약점

▶ 안드로이드 난독화 (코드 보호 기법)

▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)

▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)

▶ 안드로이드 다중 사용자 로그인 취약점

▶ 안드로이드 웹뷰 취약점 (Android Webview)

▶ 안드로이드 SD카드 저장소 취약점 (Android SDCard Storage)

▶ 안드로이드 하드코딩 취약점 (Android Hardcoded Secrets)

▶ 안드로이드 HTTP 통신 취약점 (Android Insecure HTTP Connections)

▶ 안드로이드 사용자 계정 목록화 취약점 (Android Username Enumeration)

▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)

▶ 안드로이드 개발자 백도어 취약점 (Android Developer Backdoors)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유