4.5 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 | 1500 |
Runtime-копия обычных proxy-профилей; userspace WireGuard сохраняет core/profile MTU |
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.
MTU 1500 включён по умолчанию после заметного выигрыша на реальном устройстве. Полная матрица IPv6/NAT64, QUIC, операторов и OEM остаётся обязательным release-gate; при несовместимости пользователь может вернуть MTU профиля/core.