Небольшой POC, покрывающий проверки RKNHardening - тестаппы по детекту ВПН из внешних приложений
Не является обходом, используйте пожалуйста только для проверок безопасности вашего устройства
С последнего коммита официально является нейрослопом
- Android 8+
- su-доступ
- LSPosed
- Установить .apk
- Включить модуль в LSPosed
- Добавить в скоуп LSPosed все приложения для проверки
- Перезапустить устройство
- Применить в whatVPN требуемые приложения (покажутся приложения из скоупа)
- Перезапустить устройство
- Проверять
- GeoIP - решается сплит-туннелингом
- IP Comparison - решается сплит-туннелингом
- Location Signals - решается сплит-туннелингом
- WebRTC Leak - JS может раскрыть публичный IP через RTCPeerConnection, можно попробовать отключение WebRTC в настройках браузера
- Хук на вызов connectivityManager.getNetworkCapabilities(network).hasTransport(4) - всегда вернет false
- Хук на вызов NetworkCapabilities.toString() - убирает подстроки с VPN, добавляет NOT_VPN
- Хук на вызов NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_VPN) - возвращает true
- Хук на вызов ConnectivityManager.getNetworkInfo(TYPE_VPN) - возвращает null
- Хук на получение системных свойств (http.proxyHost, http.proxyPort, socksProxyHost, socksProxyPort и https-варианты) через System.getProperty(String) - возвращает null
- Хук на PackageManager.getPackageInfo(), getInstalledApplications(), getInstalledPackages() возвращает null на проверку по package name (надо будет сделать добавление)
- Фильтрует ConnectivityManager.getAllNetworks() - вроде как малоиспользуемое, но оставляем только физическую сеть
- Вызывает PackageManager.queryIntentServices(Intent("android.net.VpnService")) и прячет приложения с VpnService в манифесте
- Хук на вызов NetworkInterface.getNetworkInterfaces() - фильтрует по паттернам tun\d+, tap\d+, wg\d+, ppp\d+, ipsec.* и с уменьшенным MTU
- Хук на вызов LinkProperties.getRoutes() - фильтрует по dedicated routes через VPN-интерфейсы (к примеру 0.0.0.0/5 via tun0) и по паттерну сплит-туннелинга
- Хук на вызов LinkProperties.getDnsServers() - возвращает DNS физического интерфейса
- Фильтрует /proc/net/*, /sys/class/net/ при чтении - убирает VPN-интерфейсы
- Очищает dumpsys vpn_management
- Возвращает EConnRefused на сканирование известных портов. Если приложение активно сканирует порты - уходит в режим полной блокировки на 10 секунд