Home [Mobile] About Deeplink
Post
Cancel

[Mobile] About Deeplink

버그바운티 리포트를 읽던 중에 deeplink 취약점이 나와서 이참에 정리해보고자 한다.

What is deeplink?


딥링크는 주소를 입력하면 앱이 실행되거나 특정 화면으로 이동시키는 기능을 의미한다.
딥링크는 총 3가지 방식을 가지고 있다.

  • URI Scheme: 앱에 URI scheme을 등록하여 사용하는 방식
  • App Link: 도메인 주소를 이용하는 방식(for Android)
  • Universal Link: 도메인 주소를 이용하는 방식(for IOS)

아래와 같이 AndroidManifest.xml 파일에 intent-filter안에 data 컴포넌트에서 host, scheme 속성이 정의되어 있다면 딥링크를 이용할 수 있다.

1
2
3
4
5
6
7
8
9
10
...

        <activity android:name="com.example.android.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:host="hoppi" android:scheme="example">
            </intent-filter>
        </activity>


URI Scheme 방식의 딥링크


일반적으로 사용하는 방식으로, scheme://path로 이루어진다. scheme은 앱 이름, path는 앱 내 페이지로 이해하면 쉽다.
예를 들면, 트위터 앱의 로그인창을 실행하고 싶으면 twitter://signin 이라는 값을 사용한다.
하지만 이 방식의 문제점은 scheme이 앱마다 같을 수 있다는 점이다. 그렇기 때문에 폰에 같은 scheme을 사용하는 앱을 연결할 때, 어떤 앱을 실행할지 선택하는 화면을 종종 봤을 것이다. (예를 들면, 문서 viewer, 동영상 플레이어 등)


naver.com, google.com 처럼 각 사이트들은 고유의 도메인을 가지고 있다. 이 값을 이용하면 URI Scheme 방식처럼 겹칠일은 없지만 모든 앱에서 이 방식을 지원하지 않는다는 단점이 있다.

Example


이곳의 연습용 앱을 이용하여 좀 더 자세하게 들어가보자.
앱을 실행하면 아래와 같이 DeepLinkActivity를 막아놨다고 적혀있다. 버튼을 눌러봐도 반응은 없었다.
runapp

AndroidManifest.xml 파일을 보면 위에서 DeepLinkActivity에 해당하는 부분에서 scheme이 noob으로 설정되어있다. noob://와 같은 데이터를 보내주게되면 DeeplinkActivity를 실행할 수 있다. manifest

am 명령어를 이용하여 데이터를 보내주면 DeepLinkActivity를 띄울 수 있다.

1
(adb shell) am start -W -a android.intent.action.VIEW -d "noob://"

deeplink

Vulnerability scenario


취약한 시나리오를 생각해보면 다음과 같다.
딥링크를 통해서 어떤 url을 이용하여 아래와 같이 WebView같은 것을 띄을 수 있다고 가정해보자.

  • app://view?url=http://verify.com

만약 url 파라미터로 넘겨주는 값의 scheme이나 domain에 대한 검증이 충분하게 이루어지지 않는다면 공격자가 원하는 곳으로 이동을 시키거나 XSS, LFI 등이 발생할 수 있다.

  • app://view?url=http://verify.com@evil
  • app://view?url=http://evil.com
  • app://view?url=javascript://evil.com/%0aalert(‘XSS’)
  • app://view?url=file://data/user/0//databases/database

Reference에 있는 링크에서 더 자세한 예시와 설명이 있으니 참고하면 좋을 것 같다.

Reference


[Tip] scrcpy

[Mobile] InjuredAndroid Writeup-1

Comments powered by Disqus.