티스토리 뷰

728x90
반응형

문제 원인

 

HostnameVerfier Your app(s) are using un unsafe implementation of the HostnameVerifier interface. You can find more information about how resolve the issue in this Google Help Center article.

GoolePlay(구글플레이)에 앱을 업로드 하려고 하는데 위와 같이 위반 사항이 있다고 업로드가 불가능한 상황을 겪은 적이 있으신가요? 해당 위반 사항을 언제까지 해결하도록 하고 해결하지 않았을 경우에는 앱을 삭제한다고 합니다. 이런 패치는 Google Play에서 2017년 3월 1일부터 시행했다고 하네요.

 

아무튼 저 같은 경우에는 URL 객체를 사용하다가 위와 같은 발생했는데요. 예를 들어 아래와 같은 코드를 사용했을 때 위 문제가 발생했습니다.

URL url = new URL("https://domdom.example.com");
con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
});

정확히는 verify 함수에서 어떤 상황이든 무조건 true 값을 반환하게 해서 생긴 문제인데요. 이는 결국 원격 호스트에 HTTPS 연결을 설정할 때 모든 호스트 이름을 허용하여, 앱이 중간자 공격에 취약해진다고 합니다. 그래서 공격자는 잠재적으로 전송된 데이터(예: 로그인 사용자 인증 정보)를 읽을 수 있게되며 HTTPS 연결에서 전송된 데이터를 변경할 수도 있는 문제가 생긴다고 합니다.

 

문제 해결

이를 해결하기 위해서는 verify 함수에서 특정 조건에 부합할 경우에만 승인하게 하면 됩니다. 예를 들어 아래와 같습니다.

URL url = new URL("https://domdom.example.com");
con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        if (hostname.equalsIgnoreCase("domdom.example.com")||hostname.equalsIgnoreCase("domdom2.example.com")){
            return true;
        } else {
            return false;
        }
    }
});

허용해야할 hostname 만 허용하고 그렇지 않으면 false 를 반환하여 차단해야지 비로소 안전한 코드라고 승인이 나게 됩니다.

 

마무리

관련해서 검색해보다가 카카오 개발자 포럼에서도 이와 유사한 문제로 다뤄진 것을 확인할 수 있었습니다.

https://devtalk.kakao.com/t/hostnameverifier-interface/113126

 

[보안이슈]HostnameVerifier interface 관련하여 문의 드립니다

implementation group: ‘com.kakao.sdk’, name: ‘newtone’, version: ‘6.1.4’ 현재 위 카카오 음성인식 관련 기능을 사용하고 있습니다. 구글로 부터 HostNameVerifier와 관련된 기능이 있으면 이를 대체하거나 제

devtalk.kakao.com

그리고 이에 대한 공식 해결방법이나 내용을 참고하고자 하신다면 Google 고객센터에 나온 내용을 확인하면 더욱 확실해질 것 같습니다.

https://support.google.com/faqs/answer/7188426?hl=ko 

 

안전하지 않은 HostnameVerifier 해결 방법 - Google 고객센터

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

support.google.com

추가 세부정보 내용에 아래와 같이 설명되어 있네요.

호스트 이름 인증을 올바르게 처리하려면 서버의 호스트 이름이 예상과 다를 때마다 false를 반환하도록 맞춤 HostnameVerifier 인터페이스에서 verify 방법을 변경하세요.

 

- 끝 -

728x90
반응형
댓글