4.4 KiB
Скрытие VPN и rootless hardening
Этот ADR фиксирует только меры, доступные обычному Android-приложению без root, Shizuku, Accessibility, Device Owner и модификации ОС.
Граница возможностей
Zapret KVN использует системный VpnService, поэтому Android намеренно показывает
TRANSPORT_VPN, VpnTransportInfo, TUN-интерфейс, маршруты и системный VPN indicator.
Приложение не может подменить эти данные для другого UID. Экран называется
«Скрытие VPN» как пользовательский термин, но не обещает полную невидимость.
Полное устранение системных признаков требует вынести туннелирование с устройства либо перехватывать трафик привилегированным TPROXY/root-модулем. Эти варианты не входят в Android APK Zapret KVN.
Один лёгкий модуль
hardening/VpnRuntimeHardening работает один раз при сборке effective runtime JSON.
Он не создаёт service, process, thread, timer, listener, сетевой запрос или
периодический scanner. Настройки хранятся в существующем DataStore, а их изменение
контролируемо перезапускает активное подключение.
Сохранённый профиль никогда не переписывается. Итоговые признаки runtime попадают
в bounded EffectiveOverlaySummary: число non-TUN inbounds, наличие локального
control endpoint и effective MTU.
Параметры
| Параметр | Default | Действие |
|---|---|---|
| Блокировать localhost endpoints | on | Удаляет сетевые поля Clash API и v2ray_api; любой дополнительный non-TUN inbound блокирует запуск |
| Нейтральное имя VPN-сессии | off | Передаёт Android строку Системная сеть вместо Zapret KVN; package/VpnService это не скрывает |
| MTU TUN | core/profile | Экспериментально может принудительно задать 1500 только в runtime-копии |
Managed-профили не открывают внешний Clash controller независимо от пользовательского переключателя. Отключение localhost-защиты существует только для осознанной совместимости advanced raw JSON и сопровождается предупреждением в UI.
Неподвижные инварианты
VpnService.Builder.allowBypass()не вызывается.- Системный HTTP proxy не включается.
ZapretVpnServiceостаётсяexported=falseи защищёнBIND_VPN_SERVICE.- Нет каталога «подозрительных» приложений и фонового наблюдения за процессами.
- Нельзя заявлять, что опции скрывают
TRANSPORT_VPN, TUN или установленный APK. - Любая защита применяется до
Libbox.checkConfig()иBuilder.establish().
Release-gate
- unit: stored JSON не меняется; controller/API удалены; non-TUN inbound блокируется;
- unit: отключённая защита сохраняет advanced raw endpoints;
- unit: MTU 1500 попадает только в effective runtime;
- instrumented UI: настройки сохраняются и доступны из «Настройки → Скрытие VPN»;
- device: MTU 1500 отдельно проверяется на IPv4, IPv6/NAT64, TCP, UDP/QUIC, крупных загрузках и Wi-Fi ↔ mobile;
- battery: idle не должен получить новых wakeups, timers или network requests.
До физического device-gate MTU 1500 остаётся выключенным экспериментом, а совместимый default ядра не меняется.