Временны̀е методы определения VPN

Насчёт обязательного скорее всего нет. На android приложению нужны права android.permission.ACCESS_NETWORK_STATE и потом код в приложении на пример такого:

Код
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networks = connectivityManager.allNetworks
val vpnActive = networks.any { network ->
    val caps = connectivityManager.getNetworkCapabilities(network)
    caps?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) == true
}

println("VPN active: $vpnActive")

Но VPN могут быть и корпоративные или для подключения ‘к себе домой’ для доступа к своеу серверу, так что это не 100% свидетельство обхода чего-либо.

Не знаю как на android, но на iOS нужно вручную дать разрешение на создания конфига, введя пин код, а так же легко удалить потом. А так на iOS так же, если другое приложение создаёт тунель, то первое падает.
Если на android можно так же регулировать кто может создавать интерфейсы, а кто нет, то это не должно быть проблемой. Если конечно приложение не откажется работать вовсе без такого разрешения