Безопасность
Что сделано
| Угроза | Защита |
|---|---|
Приложения ищут локальный SOCKS/HTTP-прокси на 127.0.0.1 и узнают через него IP сервера | Трафик идёт через встроенный TUN-вход ядра Xray (дескриптор передаётся прямо в ядро). Слушающих портов нет — проверено по /proc/net/tcp |
API и метрики Xray (api, metrics) на локальном порту | Секции вырезаются даже из JSON-конфигураций провайдера; правила для служебных входов удаляются, SOCKS/HTTP-входы провайдера заменяются на TUN |
| Подписка заблокирована и нужна загрузка через туннель | Отдельный экземпляр ядра поднимает SOCKS только на время запроса, на случайном порту, со случайными логином и паролем |
| Утечки DNS | DNS из туннеля перехватывается ядром: зарубежные ресурсы разрешаются через DoH по туннелю, российские — напрямую через Domestic DNS профиля |
| Утечки IPv6 | IPv6 всегда маршрутизируется в туннель (по умолчанию в DNS запрашиваются только IPv4-адреса) |
| Трафик уходит мимо VPN при сбое | Kill switch: при ошибке интерфейс VPN не снимается, и трафик блокируется. Плюс поддержка системных «Постоянная VPN» и «Блокировать соединения без VPN» |
| Сигнатуры VPN-клиентов | Адрес туннеля — случайная подсеть /30 в 10.0.0.0/8, а не «фирменные» 26.26.26.1 или 172.19.0.1. MTU по умолчанию 8500 — как у самых массовых клиентов, RVC среди них не выделяется; 1500 можно выбрать в настройках (дороже для батареи, см. Производительность) |
| Банковские приложения проверяют, идёт ли их трафик через VPN | Раздельное туннелирование: исключённые приложения работают в обычной сети, их активная сеть — не VPN |
| Чтение данных с устройства или из резервной копии | Подписки, ключи серверов, профили и выбранный сервер зашифрованы AES-256-GCM ключом из Android Keystore; резервное копирование отключено |
| Утечка адресов и доменов в журналы | В release-сборке ядро Xray не пишет журнал, вызовы Log вырезаются R8 |
| Подмена DNS провайдером интернета | server-address-resolve-*: адрес сервера разрешается через DoH до подключения |
| Вредоносные deep links | Подтверждение импорта и отключения; служебная Activity виджета и ярлыков не экспортирована |
| Tapjacking | Касания сквозь чужие оверлеи не принимаются |
| Опасные ссылки из подписки | Открываются только https, http, tg, mailto |
| «Бомба» в логотипе провайдера | Ограничение размера файла и картинки, декодирование с уменьшением |
| Утечка списка серверов через внешние картинки | Флаги стран встроены в APK, логотип провайдера — единственная загружаемая картинка, и только по https |
| Перехват трафика подписки | TLS на rustls с корневыми сертификатами Mozilla; HWID не уходит на чужой домен при перенаправлении |
Режим прокси
В режиме прокси RVC сознательно открывает порт: по умолчанию только на 127.0.0.1 и с паролем (логин rvc, случайный пароль из SecureRandom). Всё сказанное выше про отсутствие портов относится к режиму VPN.
Чего на стороне клиента скрыть нельзя
- Приложения, которые идут через VPN, видят сеть с типом
TRANSPORT_VPN— так устроен Android. - Список сетевых интерфейсов (с
tun0) Android показывает всем приложениям, в том числе исключённым из туннеля. Исключение из туннеля убирает VPN из их активной сети, но не прячет сам факт, что VPN включён. - Журнал движка AmneziaWG (amneziawg-go) может содержать адреса серверов; читать его могут только системные процессы и
adb.
Аудит проводился по OWASP MASVS (хранение, криптография, сеть, платформа и IPC, устойчивость).