Playstore Vulnerability небезопасная реализация интерфейса HostnameVerifier

Я знаю, что это старая тема. Но я пробовал все решения из большинства ответов. Я загрузил приложение 10 раз за 2 дня и продолжал получать одно и то же уведомление от службы поддержки Google Play. введите здесь описание изображения

Когда я получил уведомление от Google, я использовал встроенный верификатор имени хоста okhttp3. Но после нескольких сбоев я обновил все зависимости и добавил верификатор имени хоста. Тем не менее обновление было отклонено. Вот мой класс ApiClient.

public class APIClient {

private static Retrofit retrofit = null;

public static ApiInterface getAPIClient() {
    if (retrofit == null) {
        retrofit = new Retrofit
                .Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .client(getHttpClient())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit.create(ApiInterface.class);
}

private static OkHttpClient getHttpClient() {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder.cache(new Cache(MvpApplication.getInstance().getCacheDir(), 10 * 1024 * 1024)) // 10 MB
            .connectTimeout(10, TimeUnit.MINUTES)
            .addNetworkInterceptor(new AddHeaderInterceptor())
            .addNetworkInterceptor(new StethoInterceptor())
            .readTimeout(10, TimeUnit.MINUTES)
            .writeTimeout(10, TimeUnit.MINUTES)
            .addInterceptor(interceptor);

    okHttpClientBuilder.hostnameVerifier((hostname, session) -> {

        Certificate[] certs;
        try {
            certs = session.getPeerCertificates();
        } catch (SSLException e) {
            return false;
        }
        X509Certificate x509 = (X509Certificate) certs[0];
        // We can be case-insensitive when comparing the host we used to
        // establish the socket to the hostname in the certificate.
        String hostName = hostname.trim().toLowerCase(Locale.ENGLISH);
        // Verify the first CN provided. Other CNs are ignored. Firefox, wget,
        // curl, and Sun Java work this way.
        String firstCn = getFirstCn(x509);
        System.out.println(TAG + ": firstCn: "+firstCn);
        if (matches(hostName, firstCn)) {
            return true;
        }
        for (String cn : getDNSSubjectAlts(x509)) {
            if (matches(hostName, cn)) {
                return true;
            }
        }
        return false;

    });

    return okHttpClientBuilder.build();


}

private static String getFirstCn(X509Certificate cert) {
    String subjectPrincipal = cert.getSubjectX500Principal().toString();
    for (String token : subjectPrincipal.split(",")) {
        int x = token.indexOf("CN=");
        if (x >= 0) {
            return token.substring(x + 3);
        }
    }
    return null;
}

private static class AddHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("X-Requested-With", "XMLHttpRequest");
        builder.addHeader("Authorization",
                SharedHelper.getKey(MvpApplication.getInstance(), "access_token"));
        Log.d("TTT access_token", SharedHelper.getKey(MvpApplication.getInstance(), "access_token"));
        return chain.proceed(builder.build());
    }
}

Может ли кто-нибудь предложить, чтобы я мог проверить возможную уязвимость перед публикацией выпуска в Play Store или каким-либо образом обойти эту проблему?

Ниже приведена реализация HostnameVerifier внутри проекта.

введите здесь описание изображения

У меня есть 17 предупреждений в предстартовом отчете. Некоторые из них связаны с okhttp. Вот одно из предупреждений.

StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V
at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
at java.lang.Class.getDeclaredMethodInternal(Native Method)
at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
at java.lang.Class.getMethod(Class.java:2063)
at java.lang.Class.getMethod(Class.java:1690)
at okhttp3.internal.platform.android.AndroidSocketAdapter.<init>(AndroidSocketAdapter.kt:36)
at okhttp3.internal.platform.android.StandardAndroidSocketAdapter.<init>(StandardAndroidSocketAdapter.kt:34)
at okhttp3.internal.platform.android.StandardAndroidSocketAdapter$Companion.buildIfSupported(StandardAndroidSocketAdapter.kt:59)
at okhttp3.internal.platform.android.StandardAndroidSocketAdapter$Companion.buildIfSupported$default(StandardAndroidSocketAdapter.kt:52)
at okhttp3.internal.platform.AndroidPlatform.<init>(AndroidPlatform.kt:47)
at okhttp3.internal.platform.AndroidPlatform$Companion.buildIfSupported(AndroidPlatform.kt:160)
at okhttp3.internal.platform.Platform$Companion.findAndroidPlatform(Platform.kt:219)
at okhttp3.internal.platform.Platform$Companion.findPlatform(Platform.kt:212)
at okhttp3.internal.platform.Platform$Companion.access$findPlatform(Platform.kt:169)
at okhttp3.internal.platform.Platform.<clinit>(Platform.kt:170)
at okhttp3.OkHttpClient.<init>(OkHttpClient.kt:237)
at okhttp3.OkHttpClient$Builder.build(OkHttpClient.kt:1069)
at com.shadigipay.shadrivedriver.data.network.APIClient.getHttpClient(APIClient.java:172)
at com.shadigipay.shadrivedriver.data.network.APIClient.getAPIClient(APIClient.java:56)
at com.shadigipay.shadrivedriver.ui.activity.splash.SplashPresenter.checkVersion(SplashPresenter.java:33)
at com.shadigipay.shadrivedriver.ui.activity.splash.SplashActivity.checkVersion(SplashActivity.java:98)
at com.shadigipay.shadrivedriver.ui.activity.splash.SplashActivity.onResume(SplashActivity.java:205)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
at androidx.test.runner.MonitoringInstrumentation.callActivityOnResume(MonitoringInstrumentation.java:1)
at android.app.Activity.performResume(Activity.java:7300)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3814)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3854)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Я использую okhttp 4.9.0 и модификацию 2.9.0.


person Hasan Sawan    schedule 12.12.2020    source источник
comment
Возможно, где-то в ваших приложениях или сторонних библиотеках есть реализация отладки?   -  person Jesse Wilson    schedule 13.12.2020
comment
В моем коде такой реализации нет. Есть ли способ узнать, есть ли уязвимости в каких-либо библиотечных проектах?   -  person Hasan Sawan    schedule 13.12.2020
comment
Есть ли шанс, что вы включите какие-либо тестовые источники в свою сборку? Можете ли вы опубликовать скриншот из вашей IDE, показывающий реализацию этого интерфейса в вашем приложении?   -  person Yuri Schimke    schedule 13.12.2020
comment
Получаем причину отказа. Есть ли диагностический инструмент, чтобы сказать нам, в каком файле или в какой библиотеке возникла проблема?   -  person Tsiogas P.    schedule 17.12.2020
comment
Тоже столкнулся с той же проблемой. Мой проект явно не использует код имени хоста. Единственное место, где он находится, это ok http (версия 4.7.2)   -  person Fernando    schedule 17.12.2020
comment
Я тоже ищу что-то подобное @TsiogasP. Как можно узнать без диагностического прибора! Одно из моих приложений находится на рассмотрении в течение последних 6 дней, а другое — в течение 3 дней. Никакого ответа от плеймаркета.   -  person Hasan Sawan    schedule 19.12.2020
comment
Официальный ответ, который я получил от Google с просьбой предоставить диагностический инструмент, приведен ниже: если у вас есть технические вопросы об уязвимости, вы можете опубликовать их в Stack Overflow и использовать тег «android-security». Мы здесь беспомощны. Единственный намек, который у нас есть, заключается в том, что это может быть связано с библиотекой braintree/paypal. Вы, ребята, используете его? github.com/braintree/braintree_android/issues/312   -  person Tsiogas P.    schedule 21.12.2020
comment
Мне ответили, что виноват PayPal. Кроме того, одно из моих приложений было опубликовано. Есть ли в вашем проекте файл network_security_config.xml для фильтрации имени хоста?   -  person Hasan Sawan    schedule 21.12.2020
comment
Вы можете обновить свою зависимость от okhttp, см. github.com/square/okhttp/issues/5816< /а>   -  person Alex Cohn    schedule 13.04.2021


Ответы (1)


Дубликат Google Play Предупреждение системы безопасности. Ваше приложение использует небезопасную реализацию HostnameVerifier

Не пишите свой собственный HostnameVerifier, вы только сделаете его менее безопасным и с меньшей вероятностью его одобрят. Вам нужно найти реализацию HostnameVerifier, которую они помечают, и прекратить ее использовать.

Вы также должны следовать инструкциям, на которые вы ссылаетесь на фото https://support.google.com/faqs/answer/7188426?hl=en

Отметьте этот вопрос с помощью android-security и, возможно, свяжитесь с ними, используя предоставленную ими форму.

Также отредактируйте свой вопрос, чтобы показать реализации, которые у вас есть в вашем проекте.

введите здесь описание изображения

person Yuri Schimke    schedule 13.12.2020
comment
Я добавил реализацию. Я также связался с командой Google Play. Надеюсь после выходных ответят. Я проверил отчет об альфа-тестировании и обнаружил несколько проблем с политикой, связанных с обновлениями библиотеки Google. Я изменил minSdk на 19 с 16, так как некоторые функции не работают на телефонах ниже этого значения. После этого я загрузил новый apb и еще не получил письмо с отказом. Но и они не одобрили релиз. Я узнаю, как только одобрю/отклоню. - person Hasan Sawan; 14.12.2020
comment
Удачи. Любопытен скриншот, который вы показали из своего проекта, из OkHttp или другого проекта, я удивлен, что он показывает такой исходный код вместо списка реализаций. Спасибо за обновление. - person Yuri Schimke; 14.12.2020
comment
Видимо не очень повезло. Опять получил отказ. Я добавил предупреждение в вопрос. Может ли это быть окхп? - person Hasan Sawan; 15.12.2020
comment
Непонятно, что показывает ваш снимок экрана выше, например, зачем вам включать HostnameVerifierBenchmark в ваш проект? - person Yuri Schimke; 16.12.2020
comment
Я не понимаю. Какой СС? Там я просто попытался увидеть использование HosnameVerifier. - person Hasan Sawan; 16.12.2020