Bir Android VPN uygulamasının trafiği taşımasını, sızıntıları engellemesini veya yeniden başlatmadan sonra çalışmaya devam etmesini sağlayan şey root değildir. İnsanlar bunların hepsini „uygulamanın VPN izni var“ diye özetler; bu, üç ayrı mekanizmayı gizler: kullanıcının verdiği onay, sistemin oluşturduğu paket arayüzü ve uygulamanın tanımlamakla yükümlü olmadığı platform engelleme politikası. Bir Android VPN tasarımını incelemek, bir iddianın gerçekte bu üçünden hangisine dayandığını sormak demektir, çünkü her birinin sahibi ve başarısızlık biçimi farklıdır.

Onay bir sistem etkinliği aracılığıyla gelir

VpnService.prepare() hiçbir şey vermez. Onay yoksa sistemin onay etkinliğine bir intent döndürür ve uygulama, kullanıcının hizmeti onaylayabilmesi için o iletişim penceresini açar. Uygulamanın kendi sürecini başlatmak, manifeste bir izin eklemek veya özel bir „VPN'i etkinleştir“ ekranı göstermek bu izni oluşturmaz.

İznin bir kapsamı da vardır. Bir kullanıcı profilindeki pakete aittir, dolayısıyla kişisel kopya ile iş kopyası ayrı kararlardır ve cihaz sahibi yönetilen bir profili kişisel olandan farklı hazırlayabilir. İletişim penceresi hiç görünmezse ve prepare() null döndürürse, o profilde o paket için onay zaten vardır; bu, uygulamanın güvenilir olduğunun kanıtı değil, yalnızca iznin yerinde olduğunun göstergesidir.

Arayüz, sistemin yerine getirdiği bir istektir

Onaydan sonra uygulama ne istediğini VpnService.Builder ile tanımlar: adresler, rotalar, DNS sunucuları, MTU ve desteklenen yerlerde dahil edilecek veya hariç tutulacak uygulamalar. establish() sistemden tünel arayüzünü oluşturmasını ve eşleşen trafiği oraya yönlendirmesini ister. Yönlendirme kararı sisteme aittir; uygulama dosya tanıtıcısını alır ve ardından paketlerle yararlı bir şey yapmalıdır.

What you observeWho actually owns it
VPN consent dialogThe system, triggered by prepare()
Routes, DNS and app listsThe app requests them; the system applies them
One active VPN per profileThe platform; a new service replaces the old one
Always-on and block-without-VPNDevice policy enforced by the platform

O tablo, mimariyi tek bir yerde toplar. Uygulama paket işlemesine katılır; arayüzün, yönlendirme tablosunun veya çalışabilecek hizmet sayısının sahibi değildir.

Tünel soketi kendi tünelinden kaçmak zorundadır

Şifrelenmiş trafiği taşıyan bağlantının kendisi bir sokettir. Uygulamanın yeni oluşturduğu arayüze geri yönlendirilirse tünel tünele bağlı kalır ve durur. VpnService.protect() o soketi alttaki ağa bağlar, böylece yakalamayı atlar; bu yüzden doğru bir istemci ilk el sıkışmadan önce dış soketini korur.

adb shell dumpsys connectivity | grep -i -A5 vpn
adb shell settings get global always_on_vpn_app
adb shell settings get global always_on_vpn_lockdown

Bu komutlar kurulu VPN ağını, her zaman açık paketini ve kilit ayarlı mı gösterir. Bunlar yalnızca okuma amaçlı gözlemlerdir: değerler tasarımın iddiasıyla uyuşmuyorsa iddia sistemin durumuyla değil uygulamanın arayüzüyle ilgilidir.

Engelleme platforma ait olabilir

Android, VPN kullanmayan bağlantıları engelleyen bir politika belgeler. Bu uygulama bir platform sözleşmesidir; uygulamanın döngü içinde bağlantıyı yeniden denemesi değildir. Anahtar cihazın VPN ayarlarında „VPN olmadan bağlantıları engelle“ olarak bulunur ve yönetilen bir cihazda sahibi bunu tüm profil için açabilir. Bu ayrım, bir pazarlama iddiasını değerlendirirken önemlidir: istemci kilit simgesi gösterip agresif biçimde yeniden bağlanabilir ama doğrudan trafik hâlâ mümkün olabilir; ya da kapsanan uygulamalar sistem kilidi uyguladığı için çevrimdışı kalabilir.

Kilit simgesini uygulama çizer, dolayısıyla yalnızca uygulamanın bağlı olduğuna inandığını kanıtlar. Başka bir uygulamanın ağ erişimini kaybedip kaybetmeyeceğine platform karar verir, bu yüzden yararlı kontrol tünel açıkken o uygulamanın başarısız olduğunu görmektir.

Uygulama mağazasındaki „her zaman açık“ etiketi de o sözleşmenin yerini tutmaz. Her zaman açık ve kilit cihaz ayarlarıdır, çoğu zaman cihaz sahibi tarafından uygulanır ve hariç tutulan uygulamalar için davranışlarını platform tanımlar. Ayarı okuyun, rozeti değil.

Tasarım incelemesi için dört soru

Birincisi, kim onay verdi: hangi paket, hangi profil ve kullanıcı mı yoksa yönetilen cihaz politikası mı? İkincisi, uygulama ne istedi: hangi rotalar, hangi adres aileleri, hangi uygulamalar dahil veya hariç tutuldu? Üçüncüsü, tünel kullanılamadığında ne olur: sistem engeller mi yoksa trafik alttaki ağa mı düşer? Dördüncüsü, uygulama aldığı paketlerle ne yapar?

Dördüncü soru, izin modelinin yanıtlayamadığı sorudur. Onay ve bir TUN arayüzü, uygulamanın trafik alabildiğini kanıtlar; onu şifrelediğini, karşı tarafı doğruladığını veya temiz biçimde toparlandığını değil. Bunlar uygulama özellikleridir ve dürüst bir inceleme zamanını orada geçirir.

Gereksiz bir root isteği, sonucu kill switch diye adlandırmakla meşru olmaz ve onay iletişim penceresi bir güvenlik denetimi değildir. Üç izni ayrı tutun, her iddia denetlenebilir hale gelir.

İlgili makaleler