Things take time

[Android] 플레이스토어 Intent Scheme Hijacking 관련 리젝 본문

Android(Error)

[Android] 플레이스토어 Intent Scheme Hijacking 관련 리젝

겸손할 겸 2020. 2. 27. 14:03
Your app(s) are using a WebView that is vulnerable to Intent scheme hijacking.

앱을 제출하고 나니 받은 에러,

웹뷰를 사용하고있는 내 앱은 하이재킹 인텐트 스키마에 취약하다?

 

한마디로 보안에 관련된 이슈로써, 웹뷰에서 사용하고 있는 것에 대해 점검해보란것이다.

https://support.google.com/faqs/answer/9101196

 

인텐트 스키마 도용 취약점 문제 해결 - Google 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

해결방법에 대해 간단히 정리하자면 두 가지가 있다. (옵션 1,2로 제공)

1. Intent.parseUri가 사용되는 부분을 모두 체크하여 아래와 같이 사용한다.

     // convert Intent scheme URL to Intent object
  Intent intent = Intent.parseUri(url);
  // forbid launching activities without BROWSABLE category
  intent.addCategory("android.intent.category.BROWSABLE");
  // forbid explicit call
  intent.setComponent(null);
  // forbid Intent with selector Intent
  intent.setSelector(null);
  // start the activity by the Intent
  view.getContext().startActivity(intent, -1);

그러니까 Browsable 카테고리 없이 액티비티를 실행하지 말란 의미이다. 즉, 스키마를 통해 외부 앱을 킬때는 Browasable로 등록된 앱들만 킬 수 있도록하여, 사용자의 보안을 향상시키란 의미이다.

 

 

2. 웹뷰 사용시, 간단히 말해서 아래의 설정을 사용하고 있으면 해제하자.

위치는 Manifest.xml의 application안에 

        android:usesCleartextTraffic="false"

 

위 속성이 만약 true로 되어있다면 false로 교체하자.

단, 교체하기전에 미리 알아보자면 저 속성의 의미는 암호화되지 않은 연결을 허용하겠다는 옵션으로, 대표적인 사용 예가 http로 된 URL을 로드하는 경우다.

안드로이드 파이(9.0)부터는 Https를 기본적으로 허용하는데, 이 부분을 예외처리하기 위해 사용하는 것이 저 옵션이다.

 

** 만약, 위 옵션대로 Https만을 허용하되, 특정 사이트는 Http를 허용하겠다면! 이럴때 사용하는것이 네트워크 보안 구성이다.

 

https://developer.android.com/training/articles/security-config.html

 

네트워크 보안 구성  |  Android 개발자  |  Android Developers

앱 개발자가 안전한 구성 파일에서 네트워크 보안 설정을 사용자설정할 수 있는 기능입니다.

developer.android.com

    <application
        android:usesCleartextTraffic="false"
        android:networkSecurityConfig="@xml/network_security_config"

매니페스트에서 설정을 이렇게 맞추고 xml하위에 해당 xml 파일을 생성한다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">abc.def.com</domain>
    </domain-config>
</network-security-config>

그리고 위와 같이 설정해주면 된다.

 

단, 이 것의 단점은 무엇인가.

위의 xml에 기록되지 않은 도메인들은 Https여야한다는 것인데, 만약 웹뷰에서 주소를 직접입력하여 Http로 된 사이트들을 오픈해야한다거나 할땐 보이지 않아 오류가 발생하므로, 그것또한 문제가 발생한다. (CLEAR TEXT NOT PERMITTED 관련 오류)

 

단순히 해당 사이트가 Https가 아니라서 문제가 발생합니다. 라고 해도 되겠지만, 현재는 Http사이트도 있기 때문에, 이 사이트들 모두를 막는 것은 현실적으로 맞지 않는다.

 

그러므로 옵션2의 방법인 false로 세팅하는 것보다는 옵션1의 방법을 따르자.