Self-Improvement

[DIVA] 9. Access Control Issues - Part 1 (intent-filter, adb shell am) 본문

AOS/DIVA

[DIVA] 9. Access Control Issues - Part 1 (intent-filter, adb shell am)

JoGeun 2021. 10. 28. 22:16
안드로이드 앱 manifest.xml에서 디폴트로 exported=false로 설정되어 있으나, 해당 컴포넌트에 인텐트 필터를 설정할 경우 exported 설정이 true로 변경됩니다. 따라서 intent-filter가 설정된 activity에 exported=false설정이 없을 경우 am 명령어를 통해 실행시킬 수 있습니다. 아래는 실습이 대상이될 앱의 manifest.xml 일부입니다.

https://boanit.github.io/pen/android_exported_true

 

exported=true 설정 취약점

exported=true 설정 취약점 안드로이드 애플리케이션에서 manifest.xml 파일에 android:exported=“true”로 설정되어 있는 컴포넌트는 외부에서 해당 컴포넌트에 인텐트를 전달하여 활성화 시킬 수 있습니

boanit.github.io

 

Activity

Activity는 화면을 담당하는 컴포넌트이다.

AndroidManifest.xml 파일안에는 각 액티비티에 대해서 설명되어 있으며 android:exported="true" 설정이 있다면 해당 액티비티에 바로 접근을 할 수 있다(인증 우회)

하지만 exported가 명시되어 있지 않다면 기본적으로 false이지만 intent-filter가 설정되어 있다면 exported false를 명시해야 적용이 된다. 안그러면 true로 해당 화면을 직접적으로 요청할 수 있다.

 

Intent

https://wiserloner.tistory.com/1390

액티비티들은 단위로 나뉘어져서 서로 다른 스레드와 서로 다른 메모리 공간, 서로 다른 생명주기를 가지며 동작합니다.
인텐트는 바로 그러한 액티비티와 액티비티를 이어주는 역할을 합니다. 
인텐트의 가장 대표적인 기능은 한 액티비티에서 다른 액티비티를 실행시켜주는 역할을 하는데,
이미 돌아가고 있는 안드로이드 os에서 안전하게 다른 액티비티의 스레드를 동작시켜주기 위해서는, 액티비티 내에서 명시적으로 다른 액티비티 클래스를 생성해서 만드는 것보다, 안전하게 액티비티를 생성하고, 기존 액티비티를 중지하거나 제거해주는 역할을 하는 것이 필요합니다.
 
인텐트가 바로 그러한 역할을 하며,
액티비티에서 인텐트에게 '요청'을 하고, 인텐트가 이를 처리해서 실행하는 기능을 하는 것입니다.
정확히는 os에게 이러한 액티비티를 실행해주세요...
라고 기능을 적어둔 명세서가 바로 인텐트라고 생각하면 됩니다.

 

아래의 형식으로도 사용할 수 있다. AndroidManifest.xml 파일 내용에 해당 액티비티의 intent-filter를 적용하여 실제 호출하는 액티비티에 intent.setAction()으로 호출하면 된다.

 

분석

DIVA의 Access Control Issues1을 보면 버튼 하나가 놓여져 있다.

버튼을 누를시에는 중요 정보가 출력되는 화면으로 전환된다.

 

소스코드를 확인해보면 intent로 setAction()을 수행하여 다른 액티비티를 호출하는 것을 알 수 있다.

 

AndroidManifest.xml 파일 내용을 확인해보면 intent-filter를 사용하며 결과적으로는 APICredsActivity 클래스가 호출되어 화면에 보여진다.

 

하지만 이때 intent-filter를 선언할 시 exported=false 설정이 없음으로 바로 호출을 할 수 있게 된다.

 

AM 실행

adb의 am 명령어를 이용하여 해당 액티비티를 바로 호출하면 정상적으로 이루어진다.