Запретить запуск приложения Android, если на телефоне установлен packet capture или какой-либо анализатор

#android #java

#Android #java

Вопрос:

Я хочу сделать свое приложение для Android безопасным. В некоторых приложениях, если на телефоне установлена программа сетевого анализатора (перехват пакетов, перехват ssl и т. Д.), Приложение выдает предупреждение (удалить перехват пакетов) и выключается. Как мне добавить аналогичную меру безопасности? Какие технологии я должен искать?

Сначала приложение хочет, чтобы я удалил программу анализа пакетов

Ответ №1:

Вы не сделаете свое приложение более безопасным, отключив его при установке сетевого анализатора. Как пользователь, я был бы очень раздражен такими так называемыми мерами безопасности, которые неэффективны.

Чтобы обезопасить ваше приложение, вам следует подумать о том, что может сделать злоумышленник. Предполагая, что вы беспокоитесь об анализе сетевого трафика, обратите внимание, что существуют активные и пассивные атаки.

Пассивная атака

Включает перехват сети, мониторинг сети и т. Д. Злоумышленник может использовать VpnService на самом телефоне Android для мониторинга всего трафика без root. Конечно, вы можете попытаться обнаружить это на основе установленных приложений и заблокировать это, но тогда злоумышленник продолжит и настроит внешний перехват. Они могут настроить точку доступа на своем ноутбуке, подключить к нему телефон и запустить перехват сети с ноутбука.

Чтобы должным образом защитить вас от злоумышленников этого класса, убедитесь, что ваши сообщения зашифрованы (с использованием HTTPS / TLS). Тогда не имеет значения, может ли кто-то записывать сетевой трафик по телефону или локальной сети, он сможет видеть только IP-адрес назначения и имя хоста, Но не фактические данные запроса (URL-адреса, файлы cookie и т. Д.)

Активные атаки

Включает в себя man-in-the-middle (MitM), прокси-сервер SSL / TLS и т. Д. Злоумышленник, контролирующий сеть, может перехватывать соединения и пытаться притвориться сервером. Это тривиально, если трафик не защищен с помощью TLS. Хотя, даже если вы реализуете TLS, вы все равно должны проверить сертификат, представленный сервером. Прокси-сервер TLS не сможет показать действительный сертификат, подписанный доверенным центром сертификации, поэтому обычно это нормально.

Однако пользователь может добавить свой собственный центр сертификации на устройство, что позволит ему снова считывать незашифрованный трафик приложения. Для защиты от этого вы можете рассмотреть возможность закрепления сертификата. Таким образом, вы жестко кодируете доверенные сертификаты в своем приложении, и пользователь не может переопределить его обычным способом.

Наконец, обратите внимание, что решительный злоумышленник может также исправить (изменить) ваш apk, установить его в эмулятор или попытаться декомпилировать его. Из этого они также могут узнать, как взаимодействовать с сервером. Учитывайте этот сценарий при разработке сервера.

Дальнейшее чтение

https://developer.android.com/training/articles/security-ssl

Ответ №2:

Я использовал ConnectivityManager для определения того, включена служба VPN или нет. Используя это, я прекращаю вызывать вызовы api.

Чтобы определить, включен VPN или нет :

 fun isVPNEnabled(): Boolean {
    val connectivityManager = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        val network = connectivityManager.activeNetwork
        val capabilities = connectivityManager.getNetworkCapabilities(network)
        capabilities!= null amp;amp; capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
    } else {
        connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)!!.isConnectedOrConnecting
    }
}
 

Если VPN включен, остановите вызов api с помощью перехватчика:

 class VPNInterceptor(val context: Context) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
    val codeSnippet = CodeSnippet(context)
    return if (codeSnippet.isVPNEnabled()) {
        Timber.d("====>VPN Status : true")
        val errorResponse = ErrorResponse("Please turn-off VPN service for security reason.", true)
        Response.Builder()
            .code(Constants.InternalHttpCode.VPN_CODE) // Whatever code
            .body(ResponseBody.create(null, "")) // Whatever body
            .protocol(Protocol.HTTP_2)
            .message(errorResponse.moshiObjToString(ErrorResponse::class.java))
            .request(chain.request())
            .build()
    } else {
        Timber.d("====>VPN Status : false")
        chain.proceed(chain.request())
    }
}
 

}

 val httpClient: OkHttpClient.Builder = OkHttpClient.Builder()
    httpClient.connectTimeout(2, TimeUnit.MINUTES) //Connection time out set limit
    httpClient.readTimeout(2, TimeUnit.MINUTES)  //Connection read time out set limit
    httpClient.addInterceptor(VPNInterceptor(context))
 

Комментарии:

1. можете ли вы добавить код Java?