Безопасность
Что сделано
| Угроза | Защита |
|---|---|
Приложения ищут локальный 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 не уходит на чужой домен при перенаправлении |
Подмена подписки по открытому http | Подписки, профили маршрутизации и геофайлы загружаются из интернета только по https. По http подписку можно подменить по пути и подсунуть свой сервер, а HWID ушёл бы открытым текстом. Открытый http разрешён только для адресов внутри устройства и локальной сети (127.0.0.1, 10.*, 192.168.*, *.local) |
Режим прокси
В режиме прокси RVC сознательно открывает порт: по умолчанию только на 127.0.0.1 и с паролем (логин rvc, случайный пароль из SecureRandom). Всё сказанное выше про отсутствие портов относится к режиму VPN.
- С доступом из локальной сети пароль обязателен — иначе это был бы открытый прокси для всех в той же Wi-Fi.
- Через прокси закрыт сам телефон:
127.0.0.0/8,::1,localhostи домены, которые в них резолвятся. Устройство из сети не доберётся до локальных портов других приложений.
Windows
| Угроза | Защита |
|---|---|
| Локальный прокси выдаёт IP сервера | В режиме VPN портов нет: TUN-вход Xray на wintun, управление ядром — через stdin дочернего процесса |
| Утечки DNS и IPv6 | Фильтры Windows Filtering Platform: DNS только через туннель, версия IP без маршрута в туннель заблокирована (настройка «Защита от утечек») |
| Петля: трафик ядра уходит в собственный туннель | Исходящие соединения ядра привязаны к физическому адаптеру |
| Туннель переживает приложение | Ядро останавливается, как только закрывается его stdin, и убирает адаптер, маршруты и фильтры |
| Чтение данных другой учётной записью или с диска | Состояние зашифровано DPAPI ключом пользователя Windows |
| Подмена файлов ядра, которое работает с правами администратора | Установка только в Program Files, куда обычный пользователь писать не может |
| Подмена обновления | Новая версия скачивается только из релизов windows-v… этого репозитория, сверяются размер и SHA-256 |
| ID устройства раскрывает компьютер | HWID — двойной SHA-256 от MachineGuid и модели из BIOS с солью приложения; имя компьютера не отправляется |
Чего на стороне клиента скрыть нельзя
- Приложения, которые идут через VPN, видят сеть с типом
TRANSPORT_VPN— так устроен Android. - Список сетевых интерфейсов (с
tun0) Android показывает всем приложениям, в том числе исключённым из туннеля. Исключение из туннеля убирает VPN из их активной сети, но не прячет сам факт, что VPN включён. - Журнал движка AmneziaWG (amneziawg-go) может содержать адреса серверов; читать его могут только системные процессы и
adb.
Аудит проводился по OWASP MASVS (хранение, криптография, сеть, платформа и IPC, устойчивость).