DNS Çözümleyici

DNS Çözümleyici modülü, DNS müdahalesi ve yapılandırma güncelleme saldırıları için kullanıcı koruması ve DNS çözümleri için geliştirilmiş ağ performansı sağlar. Modül, www.google.com gibi adları 2001:db8::1 gibi IP adreslerine çeviren DNS saplama çözümleyicisini uygulayan kodu içerir. DNS saplama çözümleyicisi, InetAddress#getAllByName ve Network#getAllByName gibi Java API öğelerinin yanı sıra yerel ağ işlevlerini destekler ve DNS sorguları gönderip almayı ve sonuçları önbelleğe almayı uygular.

Android 10'daki değişiklikler

Android 9 ve önceki sürümleri çalıştıran cihazlarda, DNS çözümleyici kodu Bionic ve netd . DNS aramaları, sistem genelinde önbelleğe almaya izin vermek için netd arka plan programında merkezileştirilirken, uygulamalar Bionic'teki işlevleri ( getaddrinfo gibi) çağırır. Sorgu, bir UNIX soketi üzerinden /dev/socket/dnsproxyd netd arka plan programına gönderilir, bu da isteği ayrıştırır ve DNS aramaları yapmak için getaddrinfo tekrar çağırır, ardından diğer uygulamaların kullanabilmesi için sonuçları önbelleğe alır. DNS çözümleyici uygulaması çoğunlukla bionic/libc/dns/ ve kısmen system/netd/server/dns .

Android 10, DNS çözümleyici kodunu system/netd/resolv, C++'a dönüştürür, ardından kodu modernleştirir ve yeniden düzenler. Bionic'teki kod, uygulama uyumluluğu nedeniyle var olmaya devam ediyor, ancak artık sistem tarafından çağrılmıyor. Bu kaynak yolları, yeniden düzenlemeden etkilenir:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener.*
  • system/netd/resolv

Biçim ve bağımlılıklar

DNS Çözümleyici modülü bir APEX dosyası olarak teslim edilir ve netd tarafından dinamik olarak bağlanır; ancak, modül doğrudan /dev/socket/dnsproxyd yerel soketine hizmet verdiği için netd bir bağımlılık değildir . Çözümleyici yapılandırması için Binder uç noktası netd çözümleyiciye taşındı, yani sistem hizmeti netd geçmeden doğrudan çözümleyici modülüne çağrı yapabilir.

DNS Çözümleyici modülü, libc (Bionic) bağlıdır ve bağımlılıklarını statik olarak bağlar; başka kütüphanelere gerek yoktur.

mDNS .yerel çözünürlük

Android çözümleyici, standart DNS sorgularını körü körüne 224.0.0.251:5353 veya [FF02::FB]:5353'e göndermek için RFC 6762'de "5.1 One-Shot çok noktaya yayın DNS Sorguları" uygulayan mDNS .local çözünürlüğünü destekler. mDNS çözünürlüğü, *.local ile biten bir ana bilgisayar getaddrinfo() çağrılarak şeffaf bir şekilde desteklenir.

mDNS .local çözünürlüğü, adresleri almak için getaddrinfo() 'nun mevcut işlevselliğini artırır. Bir cihaz mDNS .local çözünürlüğünü destekliyorsa, getaddrinfo() API'si mDNS sorgularını 224.0.0.251:5353 veya [FF02::FB]:5353'e gönderir ve yerel adresleri döndürür. Bir cihaz mDNS .local çözünürlüğünü desteklemiyorsa, getaddrinfo() API yöntemi, DNS sunucusuna bir DNS sorgusu gönderir.

Kod AOSP'dedir, packages/modules/DnsResolver içinde bulunur. Hedef kapsam yalnızca kablosuz LAN içindir. Kullanıcılar adresleri almak için mevcut mDNS tasarımlarını koruyabilir veya bunun yerine getaddrinfo() 'yu kullanabilir. Bu özelliğin davranışı, mDNS çok noktaya yayın adreslerine gönderilen normal bir DNS sorgusu gibidir. Bu özelliğin sistem sağlığı üzerinde hiçbir etkisi yoktur.

Kullanıcılar, adb shell ping6 HOSTNAME .local komutunu kullanabilir; burada HOSTNAME , LAN üzerindeki bir hedef cihazın ana bilgisayar adıdır, örneğin adb shell ping6 ipad.local .