[안드로이드-보안] Broadcast Receiver 결함/취약한 인증 메커니즘

양현지·2023년 4월 26일
2

안드로이드

목록 보기
1/1

아래의 사항이 모두 정상적으로 수행되었다는 가정하에 작성함

  • Androidstudio win 64-bit v3.6.3 설치
    SDK Manager 설치
    AVD 설치
    (Pixel2 1080x1920 420dpi API 29 Android 10.0)
  • OpenJDK 설치
  • Anaconda 설치
  • InsecureBankv2, Back end 서버 설치
  • Drozer 설치
    (* 안드로이드 스튜디오 설치 시 openJDK와 함께 설치되나 특정 JDK 버전을 사용하고자 별도로 설치)

0. 개요

안드로이드 기기에서 이벤트 발생 시 broadcast 신호를 보내는 데, Broadcast Receiver가 신호를 받아 처리함
이때 Broadcast 신호가 악의적 애플리케이션에 의해 발생하거나 공격자에 대해 임의로 생성 가능하다.

1. Broadcast Receiver 결함

1) adb 프롬프트(generic_x86_63:\ #) 상에서 AM을 통해 브로드캐스트된 theBroadcast 인텐트를 InsecureBankv2 앱의 MyBroadCastReceiver가 수신하여 처리

# am broadcast -a theBroadcast -n com.android.insecurebankv2/.MyBroadCastReceiver
  • am(activity manager) : 안드로이드 시스템에 대한 다양한 액션을 수행
  • am broadcast : 안드로이드 디바이스에 broadcast intent를 보냄

  • -a : action을 지정

  • -n : intent를 수신할 대상 component 지정

2) 로그 정보 중 System.out 태그 중 information level만 출력

PS> adb logcat -s System.out:I

  • logcat : 로그 출력
  • -s : 로그 필터링 옵션(Information log level만 출력)

3) am 명령어의 es옵션을 사용해 추가 정보(new pass, phone number)을 입력

# am broadcasat -a theBroadccast -n com.android.insecurebankv2/.MyBroadCasstReceiver --es phonenumber 5555 --es newpass test

=> 안드로이드 디바이스에 악의적인 intent로 공격할 수 있음

  • -es : intent의 추가 옵션
  • 위 명령어는 intent를 보낼 떄 phonenumber(5555)와 newpass(test)를 같이 보냄

4) drozer로 취약점 진단

: 안드로이드 취약점 진단 도구

(drozer 앱실행)
dz> run app.package.attacksurface com.android.insecrebankv2

dz> run app.broadcast.info -a com.android.insecurebankv2

  • -a : action, com.android.insecurebankv2 애플리케이션에서 사용하는 "app.broadcast.info" 액션을 지정.

dz> run app.broadcast.send --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 1111 --extra string newpass test

  • --component : 수신할 컴포넌트 지정
  • --extra : broadcast intent에 추가적인 정보를 보내고자 사용

=> 위 공격 수행 후 log출력(logcat) 시 InsecureBankv2 앱의 패스워드 정보가 포함됨

5) 결론

: MyBroadcastReceiver의 onReceive함수를 통해 intent가 전달될 때 보안상 중요한 정보(예.password, phone numer)를 포함한 데이터를 그대로 발신하고(send) 처리하게 되는데 이 때문에 누구나 ‘adb logcat’ 명령어를 통해 로그#에서 해당 데이터를 열람할 수 있다는 취약점을 확인

6) 취약점 방어

: 인텐트를 처리하기 전에 인텐트의 중요한 데이터를 암호화 함으로써 중요한 정보가 노출되지 않도록 방어할 수 있다. 또한 비밀번호,
계좌정보와 같은 중요한 정보가 포함된 인텐트를 받아들이지 않도록 방어할 수 있다.

2. 취약한 인증 메커니즘

: 애플리케이션에서 요구하는 정상적인 인증 절차를 우회하여 비정상적 루트로 접근 권한을 획득 가능

1) AndroidManifest.xml 파일 <- 액티비티 관련 설정

  • android:exported = "true"
    => 다른앱에서 해당 activity를 실행시킬 수 있음

2) 설정-1) 확인 후 activity에 비정상적 접근

adb shell am start com.android.insecurebankv2/com.android.insecurebankv2.PostLogin

3) Drozer를 통해 2)공격을 수행

(앱의 액티비티 권한 정보 확인)
dz > run app.activity.info -a com.android.insecurebankv2

com.androidl.insercurebankv2.PostLogin
permission : null 임을 확인하고 다음의 공격을 수행

(우회하여 액티비티 접근)
dz> run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.PostLogin

  • --component : 실행할 액티비티의 패키지명과 클래스명을 지정(com.android.insecurebankv2 애플리케이션의 PostLogin 액티비티를 지정)

4) 결론

: PostLogin 액티비티와 DoTransfer 액티비티의 android:exported=”true”로 설정되어 있으며 이때문
에 해당 액티비티가 다른 애플리케이션에서도 로그인의 인증 절차를 거치지 않고도 접근이 가능하며 이에 따라 악의적인 애플리케이션이 해당 액티비티에 접근하여 공격할 수 있다는 취약점을 확인

5) 취약점 방어

: AndroidManifest.xml파일의 android:exported=”true”의 속성을 false로 바꾸어 외부에서 호출하는 것을 막을 수 있다. 또한 인증기능을 추가하여 계좌이체, 비밀번호 변경과 같은 민감한 작업을 수행할 때 인증기능을 추가하여 작업을 수행하는 주체(사용자)를 확인할 수 있도록 한다. 가령 사용자의 ID와 비밀번호를 입력받아 인증받기전에는 해당 액티비티에 접근을 막는 것이다

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

모바일쪽으로 공부하시는군요.

답글 달기