R&D
Deeplink를 이용한 Webview Hijacking 공격
장태진(TAEJIN)
Jun 18, 2020

개요

안드로이드 어플리케이션 버그헌팅을 위해 사례 조사를 진행하였으며, 사례 조사를 위해 해커원을 이용했다. 해커원에서 한 해커가 Deeplink를 공격벡터로 하여 취약점을 발굴하는것을 확인하였으며, 이를 우리나라 어플리케이션에 공격을 진행해보았다. 구글 플레이 스토어에서 인기 앱 3000개를 다운받았으며, 그 중 “쇼핑몰”, “배달앱”을 집중적으로 분석한 결과, 많은 어플리케이션이 이 공격에 취약한 것으로 확인되었다. 발견한 취약점은 모두 KISA를 통해 신고를 하였으며, 대부분의 취약점이 지금은 패치되었다. 지금은 효율적인 공격을 위해 퍼저와 분석도구를 개발완료한 상태이다.

이 공격방식을 이용하여 발견한 H어플리케이션의 취약점은 CVE-2019-9140 를 받았으며, KISA에서는 심각도를 “HIGH”로 설정하였다.

참고: https://www.krcert.or.kr/data/secInfoView.do?bulletin_writing_sequence=35102


사전 지식 설명

Deeplink는 URI를 통해 어플리케이션을 작동하기위한 하나의 기능이다.

일반적으로 http://www.stealien.com 등의 URL을 클릭하면 자동으로 웹 브라우저가 실행된다.

운영체제는 어떻게 웹 브라우저를 실행시켜줄까? 이는 바로 웹 브라우저가 이 기능을 “명시”하였기 때문이다. 안드로이드 운영체제의 경우에는 AndroidManifest.xml에서 Browsable로 본인이 실행 되고 싶은 intent를 명시한다.

안드로이드 크롬 어플리케이션 또한 http 또는 https 로 실행될 때 해당 앱의 특정 클래스를 로딩해달라는것이 명시되어있다.

다른 일반적인 예시로는 동영상 플레이어가 있다. 파일어플리케이션이나 웹 브라우저에서 다운로드받은 동영상을 클릭하면 동영상 앱이 뜨는 경우가 있다. 이 또한 동영상 플레이어마다 AndroidManifest.xml에 명시된 규칙에 따라 실행되는 것이다. 안드로이드의 경우 동영상 플레이어가 여러개 설치되어있는 경우 어떤 동영상 플레이어로 실행할지 고르는 팝업이 뜨는데, 이는 해당 동영상 플레이어들의 실행 규칙에 해당하기 때문이다.

http 스키마 뿐만이 아니라 다른 여러가지 스키마를 사용 할 수 있는데, m사의 경우 melonapp://을, CVE-2019-9140의 H앱은 hmapp:// 을 사용한다.

Deeplink로 실행된 임의의 어플리케이션의 특정 클래스는 전달받은 URI를 파싱하고, 이 URI에 따라 작동한다. 예를 들어서 “태진 배달 어플리케이션”이 있다고 하자. 이 회사가 운영하고 있는 홈페이지에서 어플리케이션의 주문페이지를 열고 싶은 경우 “taejin://open?page=history”를 클릭하게 하여 주문 페이지를 열 수 있다.

Webview Hijacking

대부분의 어플리케이션은 웹뷰를 사용하는데, 이는 공지사항, 게시물 등 디자인/개발 문제로 인해 html로 보여줘야만 하는 경우에 주로 사용한다. 특히나 웹뷰를 핵심으로 사용하고 있는 웹앱과 하이브리드앱 또한 존재한다.

또한 대부분의 어플리케이션은 웹뷰에서 보여주고 있는 자사의 웹페이지와 어플리케이션의 연동을 위해 Javascript Interface를 사용하며, 이를 통해 웹 페이지에서 어플리케이션을 제어 할 수 있는 함수를 실행 할 수 있다. 일반적으로 사용자 계정을 제어하거나 파일 제어, 위치 정보 호출 등을 지원한다.

이러한 Javascript Interface를 공격자가 임의로 사용하기 위해서는 Webview에 공격자의 웹 사이트를 띄워야하므로, 우리는 이러한 행위를 Webview Hijacking이라고 부르기로 하였다.

이는 Deeplink를 공격벡터로 하여 Webview를 장악하는 것을 뜻한다. 취약점을 파급도를 높히기 위해 클릭 한번으로 앱을 제어 할 수 있는 Deeplink를 이용한 Webview Hijacking이다.


취약점 분석 (CVE-2019-9140)

개요

H어플리케이션은 Deeplink를 통해 Webview Hijacking을 할 수 있으며, 이 어플리케이션은 Javascript Interface에서 GPS정보를 제공해주는 함수를 구현하였기 때문에 위치정보를 탈취 할 수 있었다.

분석 시작

우선 AndroidManifest.xml을 분석한 결과 다음과 같은 deeplink를 통해 어플리케이션을 실행 할 수 있는 것을 확인하였다.

image-20200622125335429

  • hpcapp://startActivity
  • happypointcard://deeplink
  • hmapp://gotohmhome
  • hmapp://gotohmsubwebview

2. 소스코드 분석

2.1 IntroActivity (파싱 부분)

위 네가지 경우에 com.hpapp.IntroActivity가 호출되므로 이 class를 우선적으로 분석한다.

image-20200622130500463

이 코드는 IntroActivity의 일부로, nextActivity이다. 이 메소드를 확인해보면 hpeventurl= 이라는 값이 전달받은 uri에 존재한다면str2를 hpeventurl= 이후의 값으로 만든다. 예를 들어 happypointcard://deeplink?hpeventurl=https://www.bughunting.net/이라는 값이 전달받은 uri인 경우 str2의 값은 https://www.bughunting.net/이 되는 것이다. 이 값은 공격자가 임의로 수정 할 수 있는 것이기 때문에 SecondIntroActivity.class로 이동 할 때 CommonDefine.INTENT_DATA_SHOW_HAPPY_MARKET 를 키로 하여 값으로 전달된다.

2.2 SecondIntroActivity (코드 실행 부분)

전달받은 CommonDefine.INTENT_DATA_SHOW_HAPPY_MARKETSecondIntroActivitygoMainActivity 메소드에서 MainActivity.class에 전달된다.

image-20200622131129707

2.3 MainActivity - 1 ( Webview Hijacking, URI가 Webview로 실행되기 까지)

MainActivity의 onCreate함수에서는 checkEvent 메소드를 실행한다.

image-20200622132831262

checkEvent메소드에서는 단순히 스키마를 체크하는 것이 아니라, intent를 와 this를 전달하여 체크한 스키마가 happypoint인 경우 MainActivity를 다시 실행하고, 로직에 따라 다시 웹뷰가 실행된다.

image-20200622133039429

지금은 아래와 같이 패치되었으나, 원래는 해당 부분에서 호스트네임을 검사하지 않았다. 만약 제대로 되어있다면 moveHappyMarket이 호출된다.

image-20200622133835757 )

호출된 아래 함수에서는 str이 공백이 아닌경우 INTENT_DATA_REDIRECT_URI의 value로 들어가는 것을 확인 할 수 있다. 이는 MainActivity를 다시 실행한다.

(아래 사진에 나와있는 코드는 해피포인트 6.4.3의 코드로, 취약점 분석을 진행한 해피포인트 앱의 버전과 다를 수 있다)

image-20200622133410837

MainActivity에서는 initRequestService 함수를 실행하며, 이 이후부터는 initWebview함수를 이용하여 Webview를 초기화하고 url을 전달받은 인자값으로 바꾼다.

image-20200622134642035

2.4 Javascript Interface 조사

Webview를 통해 앱 내에서 임의의 페이지를 열 수 있으므로 원하는 Javascript를 실행 할 수 있게 되었다. 이제 제어가 가능한 Webview에서 사용가능한 Javascript Interface를 찾아보아야한다. 분석 결과, 다음과 같은 함수들을 자바스크립트에서 실행 할 수 있었으며, 분석결과 현재 좌표, 동의 여부, 사용자 정보(전화번호)를 탈취 할 수 있었으며, 이외에도 앱의 일부 기능을 수행 할 수 있었다.

image-20200622135149357

image-20200622151108870

image-20200622151136809

3. PoC

URL에 대해 별다른 검증을 하지 않으므로, 다음과 같이 공격하였다.

happypointcard://deeplink?hpeventurl=javascript:window.App={recvLocation:function(a,b){alert(a+","+b)}};android.myLocationGPS()

이 URL을 /를 통해 일반 링크처럼 표시하였으며, 클릭시 다음과 같은 alert가 뜨는 것을 확인 할 수 있다. 또한 여건에 따라 출력된 데이터들을 Ajax를 통해 공격자의 서버에 저장 할 수 있다.

image-20200622151622681

image-20200622151840722

4. 대응방안

이 취약점을 포함하여 많은 어플리케이션을 제보하였고, KISA 연구원님들과 함께 보안 조치 매뉴얼을 제작할 수 있는 기회가 생겨 도움을 드렸다.

https://www.krcert.or.kr/data/guideView.do?bulletin_writing_sequence=35434

5. 기타

  • 현재 KISA에서는 Deeplink 관련 취약점에 대해 포상을 진행하지 않는다.

  • 참고 자료 없이 혼자서 연구한 부분이기 때문에 오류가 있을 수 있습니다. 오류를 찾으셨다면 [email protected] 으로 메일 부탁드립니다.

장태진(TAEJIN)
RECENT POST
Minjoong Kim
Android 1day Exploit Analysis (CVE-2019-2215)
Android 1day Exploit Analysis by Newbie
이주협, 이주영
뉴비들의 하드웨어 해킹 입문기
뉴비들의 하드웨어 해킹 입문기