Powrót do strony głównej

Automatyczne zamrażanie aplikacji podczas VPN — rozwiązanie techniczne

Analiza luk w piaskownicach Androida podczas wykrywania VPN i implementacja rozwiązania poprzez automatyczne wyłączanie aplikacji. Anubis blokuje aktywność w tle, zapobiegając wyciekowi adresów IP.

Anubis: Pełna izolacja aplikacji od wykrywania VPN
Advertisement 728x90

# Anubis: Automatyczne zamrażanie aplikacji przy aktywnym VPN

Popularne aplikacje w Rosji skanują urządzenie pod kątem obecności VPN i przekazują wychodzące adresy IP w celu blokady. Rozwiązanie — automatyczne zamrażanie aplikacji przy aktywnym VPN. Anubis, narzędzie open-source, blokuje aktywność w tle aplikacji, czyniąc je niewidocznymi dla systemów detekcji.

Dlaczego piaskownice nie rozwiązują problemu

Profile robocze Androida (Island, Insular) ukrywają VPN przed ConnectivityManager, ale nie zapobiegają wyciekom sieciowym. Aplikacje w profilu roboczym nadal widzą:

  • Interfejs tun0 przez NetworkInterface.getNetworkInterfaces()
  • Trasy przez /proc/net/route
  • SOCKS5-proxy na localhost (port 1080 i inne)

Te sprawdzenia działają bez uprawnień i są zgodne z wytycznymi Ministerstwa Rozwoju Cyfrowego z 2026 roku. Nawet przy izolacji profilu aplikacja może określić wychodzący adres IP serwera VPN i przekazać go do Roskomnadzoru. Kod poniżej pokazuje, jak standardowe sprawdzenie przez ConnectivityManager jest filtrowane między profilami:

Google AdInline article slot
// Kod w profilu roboczym nie wykryje VPN z profilu głównego
val cm = getSystemService<ConnectivityManager>()
val vpnActive = cm.allNetworks.any {
    cm.getNetworkCapabilities(it)
        ?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) == true
}
// Wynik: vpnActive == false

Krytyczna luka w klientach VLESS (niechroniony SOCKS5-proxy) pogarsza problem. Aplikacja nie tylko może wykryć VPN, ale też wykorzystać go do określenia wychodzącego IP. Metody takie jak kaskadowe VPN z trzema węzłami przesuwają problem, ale go nie eliminują — szpieg i tak uzyska wychodzący IP pierwszego węzła.

Architektoniczne ograniczenia Androida

Android nie używa network namespaces dla profili, w przeciwieństwie do systemów desktopowych. Wirtualizacja (VirtualBox, QEMU) na PC całkowicie izoluje stos sieciowy, ale na Androidzie:

  • Stos sieciowy jest wspólny dla wszystkich profili
  • Aktywność w tle jest dozwolona przez BroadcastReceiver, JobScheduler, FCM
  • Tryb Doze i App Standby nie gwarantują pełnego zatrzymania

Nawet przy idealnej izolacji sieciowej procesy w tle nadal będą działać. Aplikacje z uprawnieniami do aktywności w tle (banki, komunikatory) regularnie sprawdzają:

Google AdInline article slot
  • Stan sieci przez API systemowe
  • Otwarte porty na localhost
  • Dostępność zablokowanych zasobów

Profil roboczy nie blokuje tych sprawdzeń. Jedyna niezawodna metoda — pełne wyłączenie aplikacji przez systemową komendę pm disable-user.

Jak działa Anubis

Anubis monitoruje stan VPN przez VpnService i automatycznie wyłącza aplikacje docelowe. Kluczowe komponenty:

  • Monitorowanie systemowe: Śledzenie zdarzeń CONNECTIVITY_ACTION i stanu VpnService
  • Zarządzanie pakietami: Wywołanie PackageManager.setApplicationEnabledSetting() z flagą DONT_KILL_APP
  • Lista celów: Filtrowanie po package name (np. ru.max.messenger, ru.tbank)

Proces aktywacji:

Google AdInline article slot
  • Użytkownik włącza VPN
  • Anubis odbiera zdarzenie przez BroadcastReceiver
  • Dla każdej aplikacji z białej listy wykonywane jest pm disable-user
  • Ikony aplikacji znikają z launchera, procesy w tle są zatrzymywane

Po wyłączeniu VPN system automatycznie przywraca aplikacje do stanu aktywnego. Do działania wymagane jest uprawnienie CHANGE_NETWORK_STATE oraz uprawnienie do zmiany stanu aplikacji (przez ADB lub root):

# Aktywacja komendy wyłączenia dla aplikacji zainstalowanych przez użytkownika
adb shell pm enable-user --user 0 ru.target.app

Techniczne niuanse implementacji

Anubis omija ograniczenie Androida dotyczące wyłączania aplikacji użytkownika za pomocą dwóch podejść:

  • Tryb ADB: Konfiguracja przez komputer dla urządzeń z debugowaniem
  • Dostęp root: Bezpośrednie wywołanie pm disable-user przez su

Przy użyciu ADB wymagana jest jednorazowa konfiguracja:

adb shell pm set-install-location 2
adb shell pm grant com.anubis.control android.permission.CHANGE_NETWORK_STATE

Ważne: po wyłączeniu aplikacja jest całkowicie izolowana od systemu. Nie odbiera zdarzeń broadcastowych, nie ma dostępu do sieci i nie może uruchomić procesów. To gwarantuje, że nawet zaawansowane metody detekcji (skanowanie portów, analiza tras) stają się niemożliwe.

Co ważne

  • Profile robocze ukrywają VPN tylko przed ConnectivityManager, ale nie przed niskopoziomowymi sprawdzeniami sieciowymi
  • Aktywność w tle aplikacji pozostaje aktywna nawet w izolowanym profilu
  • Pełne wyłączenie przez pm disable-user — jedyny sposób na zagwarantowanie braku wycieków
  • Anubis automatyzuje proces, wiążąc stan aplikacji z VPN
  • Wymagany ADB lub root do aktywacji funkcji dla aplikacji użytkownika

— Editorial Team

Advertisement 728x90

Czytaj dalej