Yerel alan ağındaki (LAN) cihazlara, INTERNET iznine sahip tüm uygulamalar erişebilir.
Bu, uygulamaların yerel cihazlara bağlanmasını kolaylaştırır ancak kullanıcının parmak izini oluşturma ve konum için proxy olma gibi gizlilik etkileri de vardır.
Yerel Ağ Korumaları projesi, yerel ağa erişimi yeni bir çalışma zamanı izniyle sınırlayarak kullanıcının gizliliğini korumayı amaçlar.
Etki
Android 16'da bu izin, isteğe bağlı olarak etkinleştirilebilen bir özelliktir. Bu nedenle, yalnızca bu izni etkinleştiren uygulamalar etkilenir. Bu özelliği etkinleştirmenin amacı, uygulama geliştiricilerin uygulamalarının hangi bölümlerinin örtülü yerel ağ erişimine bağlı olduğunu anlamalarını sağlamaktır. Böylece, gelecekteki bir Android sürümünde bu bölümler için izin koruması hazırlayabilirler.
Uygulamalar, kullanıcının yerel ağına aşağıdaki yöntemlerle erişirse etkilenir:
- Yerel ağ adreslerinde ham soketlerin doğrudan veya kütüphane tarafından kullanılması (ör.
Multicast DNS (mDNS)veyaSimple Service Discovery Protocol (SSDP)). - Yerel ağa erişen çerçeve düzeyindeki sınıfların (ör.
NsdManager) kullanılması.
Etkinin ayrıntıları
Yerel ağ adresine ve adresinden gelen trafik için yerel ağ erişimi izni gerekir. Aşağıdaki tabloda sık rastlanan bazı durumlar listelenmiştir:
| Uygulama Düşük Düzeyli Ağ İşlemi | Yerel Ağ İzni Gerekli |
|---|---|
| Giden TCP bağlantısı oluşturma | evet |
| Gelen TCP bağlantısını kabul etme | evet |
| UDP tek noktaya yayın, çok noktaya yayın veya yayın gönderme | evet |
| Gelen UDP tek yayını, çoklu yayını, yayını alma | evet |
Bu kısıtlamalar ağ yığınına derinlemesine uygulanır ve bu nedenle tüm ağ API'leri için geçerlidir. Platformda veya yönetilen kodda oluşturulan soketler, Cronet ve OkHttp gibi ağ kitaplıkları ve bunların üzerinde uygulanan tüm API'ler buna dahildir. Yerel ağda .local soneki olan hizmetleri çözümlemek için yerel ağ izni gerekir.
Önceki kurallarla ilgili istisnalar:
- Bir cihazın DNS sunucusu yerel ağdaysa bu sunucuya / sunucudan gelen trafik (53 numaralı bağlantı noktasında) için yerel ağ erişim izni gerekmez.
- Uygulama içi seçici olarak Çıkış Değiştirici'yi kullanan uygulamaların yerel ağ izinlerine ihtiyacı olmayacak (daha fazla bilgi sonraki bir sürümde paylaşılacaktır).
Android 17'nin Uygulanması
Android 17'den itibaren, Android 17 veya sonraki sürümleri hedefleyen uygulamalar için yerel ağ korumaları zorunlu hale getirilmiş ve uygulanmaya başlanmıştır.
| En Boy Oranı | Android 16 | Android 17 |
|---|---|---|
| Hedef SDK | 36 | 37 veya sonraki sürümler |
| İzin | Geçici olarak NEARBY_WIFI_DEVICES kullanıldı | ACCESS_LOCAL_NETWORK |
| Varsayılan erişim | Yerel ağ erişimi açık olmalıdır. | Hedef SDK'sını güncelleyen tüm uygulamalar için yerel ağ varsayılan olarak engellenir. |
| İzin Grubu | Mevcut NEARBY_DEVICES izin grubunun bir parçası |
Uygulama işlevselliğinin yaptırım uygulandıktan sonra bozulmadığını doğrulamak için SDK 37 veya sonraki sürümleri hedefleyen uygulamaların yerel ağ erişimini yönetmek üzere aşağıdaki yollardan birini kullanması gerekir:
1. yol: Gizliliği korumaya yönelik seçicileri kullanma
Sistem aracılı keşif ve bağlantı görevlerinde, çalışma zamanında geniş kapsamlı izin isteğinde bulunmamak için seçicileri kullanın. Kullanım alanınıza bağlı olarak aşağıdaki seçicileri kullanın:
- Medya oynatma: Google Cast'i destekleyen uygulamalarda çıkış değiştirici özelliği kullanılabilir. Bu sayede geliştiriciler, uygulamanın geniş kapsamlı
ACCESS_LOCAL_NETWORKiznini istemesine gerek kalmadan kullanıcıların belirli aktarım cihazlarını seçmesine olanak tanıyabilir. - Genel Bağlantı:
NsdManager, mDNS keşfi için sistem tarafından çalıştırılan bir hizmet seçici içerir. Uygulama tüm ağı taramak yerine, sistem kullanıcının uygulamaya erişim için tek bir cihaz seçmesine olanak tanıyan bir iletişim kutusu gösterir.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
B yolu: Çalışma zamanı izni isteme (geniş erişim)
Bu yol, yerel ağa geniş ve kalıcı erişim gerektiren ev otomasyonu veya IoT cihaz yönetimi gibi karmaşık kullanım alanları için gereklidir.
Manifest Dosyasında İzin Bildirme: Geliştiriciler,
ACCESS_LOCAL_NETWORKizniniAndroidManifest.xmliçinde açıkça bildirmelidir.Çalışma Zamanında İzin İste: Uygulamalar, yerel ağ erişimi denemeden önce iznin verilip verilmediğini kontrol etmelidir. Aksi takdirde, standart sistem istemini tetiklemek için
Activity.requestPermission()numaralı telefonu aramaları gerekir.Önceden verilmiş senaryo:
ACCESS_LOCAL_NETWORKizni,NEARBY_DEVICESizin grubunun bir parçasıdır. Bu grupta başka bir izin (ör. Bluetooth izinleri) vermiş olan kullanıcılara yerel ağ erişimi için tekrar istem gösterilmez.Reddetme ve İptal İşlemleri: Uygulamalar, kullanıcının isteği reddettiği veya daha sonra sistem ayarlarında izni iptal ettiği durumları sorunsuz bir şekilde ele almalıdır. Bu gibi senaryolarda yerel ağ trafiği engellenir.
İzin isteği sıfırlama sayacı stratejisi
Platform, bir uygulamanın daha önce NEARBY_DEVICES izin grubunu (artık ACCESS_LOCAL_NETWORK iznini de içeriyor) reddetmesinin, gerekçesini yeterince sunduktan sonra izni istemesini engellediği senaryoları ele alan bir sayaç sıfırlama stratejisi uygular. Bu mekanizma, uygulamanın requestPermission() API'sini çağırması için ek fırsatlar sunar ve ACCESS_LOCAL_NETWORK izniyle ilgili ret sayısını etkili bir şekilde sıfırlar. Bu sayede, özellikle ilk ret, uygulama temel işlevi için yerel ağ erişiminin gerekliliğini iletmeden önce gerçekleştiyse kullanıcıyla daha ayrıntılı bir yeniden etkileşim sağlanabilir.
Bölünmüş izin modeli
Yerel Ağ İzni, hedef SDK'larına göre yeni ve eski uygulamaları farklı şekilde işlemek için bölünmüş izin taşıma stratejisi kullanır.
| Kategori | Hedef SDK düzeyi | Yerel ağ erişimi davranışı | Geliştiricinin yapması gereken işlem |
|---|---|---|---|
| Yeni Uygulamalar / Güncellenen Uygulamalar | >= 37 (Android 17) | Varsayılan olarak engellenir | ACCESS_LOCAL_NETWORK çalışma zamanı iznini beyan etme ve isteme |
| Eski uygulamalar | < 37 | INTERNET izni olan uygulamalar, ACCESS_LOCAL_NETWORK için örtülü bir izin alır ve erişimlerini koruyabilir. Bu durum geçicidir ve uygulama, hedef SDK'yı 37'ye yükselttiğinde varsayılan olarak engellenir. |
Hemen kod değişikliği yapmanız gerekmez. |
Kullanım Alanına Göre LNP Stratejisi
Yayınlama: Medya yayınlama işlevleri için en uygun ve gizliliği koruyan strateji, çıkış değiştiriciyi kullanmaktır. Bu yöntem, sistemin kullanıcının adına yerel ağ keşfi ve bağlantısını yönetmesine olanak tanır. Böylece uygulamanın
ACCESS_LOCAL_NETWORKizni istemesine gerek kalmaz.Tarayıcılar: Hataların işlenmesi, protokole bağlı olarak farklı yaklaşımlar gerektirir. UDP hataları
EPERMhata koduyla sonuçlanır. TCP bağlantıları için tarayıcılar, bir paketin LNP tarafından engellenip engellenmediğini belirlemek üzere NDK API'sini kullanmalıdır. Bu APIandroid_getnetworkblockedreason(int sockFd)döndürür.ANDROID_NETWORK_BLOCKED_REASON_LNPDiğer Kullanım Alanları (ör. IoT): mDNS kullanarak cihaz bulan uygulamalar, cihazların izinsiz bulunmasına olanak tanıyan
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER'yi ve IP adreslerini almak içinNsdManager#registerServiceInfoCallback/NsdManager#resolveService'yi kullanmalıdır. Bu şekilde elde edilen IP adreslerine yapılan bağlantılar içinACCESS_LOCAL_NETWORKizni gerekmez.
Doğrudan yerel ağ iletişimi gerektiren ve sistem aracılı seçicileri kullanamayan uygulamalar için önerilen yaklaşım, izin sıfırlama sayacı stratejisini kullanmaktır. ACCESS_LOCAL_NETWORK izni kullanıcı tarafından iptal edilirse bu mekanizma, uygulamanın izni yeniden istemesi için ek fırsatlar sunar. Böylece geliştiriciler, kullanıcıya daha net bir gerekçe sunabilir.
Android 16 Kılavuzu
Yerel ağ kısıtlamalarını etkinleştirmek için aşağıdakileri yapın:
- Cihazınıza Android 16 Beta 3 veya sonraki bir sürümün yüklü olduğu sistem görüntüsü yükleme
- Test edilecek uygulamayı yükleyin.
adb kullanarak Appcompat yapılandırmasını etkinleştirme/devre dışı bırakma
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>Cihazı yeniden başlatın
Artık uygulamanızın yerel ağa erişimi kısıtlanıyor ve yerel ağa erişme girişimleri soket hatalarına yol açıyor.
Uygulama sürecinizin dışında yerel ağ işlemleri gerçekleştiren API'ler (ör. NsdManager) kullanıyorsanız bu API'ler kayıt sırasında etkilenmez.
Erişimi geri yüklemek için uygulamanıza NEARBY_WIFI_DEVICES izni vermeniz gerekir.
- Uygulamanın
NEARBY_WIFI_DEVICESizninimanifestiçinde beyan ettiğinden emin olun. - Ayarlar > Uygulamalar > [Uygulama Adı] > İzinler > Yakındaki cihazlar > İzin ver'e gidin.
Uygulamanızın yerel ağa erişimi geri yüklenir ve tüm senaryolarınız, uygulamayı kaydetmeden önceki gibi çalışır. Uygulama ağı trafiği bu durumdan nasıl etkilenir?
| İzin | Giden LAN İsteği | Giden/Gelen İnternet İsteği | Gelen LAN İsteği |
|---|---|---|---|
| Verildi | Works | Works | Works |
| İzin Verilmedi | Başarısızlar | Works | Başarısızlar |
Uyumluluk yapılandırmasını devre dışı bırakmak için aşağıdaki komutu kullanın.
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Hatalar
Eksik izin nedeniyle yerel ağ erişimi isteği başarısız olursa:
TCP bağlantıları genellikle zaman aşımı hatası ile sonuçlanır.
UDP hataları ve genel izin retleri genellikle EPERM hata koduyla sonuçlanır.
Hatalar
Aşağıdakilerle ilgili hata gönderin ve geri bildirimde bulunun:
- LAN erişimindeki tutarsızlıklar (belirli bir erişimin "yerel ağ" erişimi olarak kabul edilmemesi gerektiğini düşünüyorsanız)
- LAN erişiminin engellenmesi gerektiği ancak engellenmediği hatalar
- LAN erişiminin engellenmemesi gerektiği halde engellendiği hatalar
Aşağıdakiler bu değişiklikten etkilenmemelidir:
- İnternet erişimi
- Mobil Ağ