Resolver DNS

Il modulo DNS Resolver fornisce agli utenti protezione contro gli attacchi di intercettazione DNS e di aggiornamento della configurazione e migliora le prestazioni della rete per le risoluzioni DNS. Il modulo contiene il codice che implementa il resolver stub DNS, che traduce nomi come www.google.com in indirizzi IP come 2001:db8::1. Il resolver stub DNS supporta elementi dell'API Java come InetAddress#getAllByName e Network#getAllByName, nonché funzioni di rete native, e implementa l'invio e la ricezione di query DNS e la memorizzazione nella cache dei risultati.

Modifiche in Android 10

Sui dispositivi con Android 9 e versioni precedenti, il codice del resolver DNS è distribuito su Bionic e netd. Le ricerche DNS sono centralizzate nel daemon netd per consentire la memorizzazione nella cache a livello di sistema, mentre le app chiamano funzioni (ad esempio getaddrinfo) in Bionic. La query viene inviata tramite una socket UNIX a /dev/socket/dnsproxyd al daemon netd, che analizza la richiesta e richiama nuovamente getaddrinfo per eseguire ricerche DNS, quindi memorizza nella cache i risultati in modo che altre app possano utilizzarli. L'implementazione del resolver DNS era principalmente contenuta in bionic/libc/dns/ e in parte in system/netd/server/dns.

Android 10 sposta il codice del risolutore DNS in system/netd/resolv,, lo converte in C++, quindi lo modernizza e lo esegue refactoring. Il codice in Bionic continua a esistere per motivi di compatibilità con le app, ma non viene più chiamato dal sistema. Questi percorsi di origine sono interessati dal refactoring:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener
  • system/netd/server/ResolverController
  • system/netd/resolv

Formato e dipendenze

Il modulo DNS Resolver ("com.android.resolv") viene fornito come file APEX ed è collegato dinamicamente da netd; tuttavia, netd non è una dipendenza in quanto il modulo serve direttamente la socket locale /dev/socket/dnsproxyd. L'endpoint Binder per la configurazione del resolver è stato spostato da netd al resolver, il che significa che il servizio di sistema può chiamare direttamente il modulo del resolver senza passare per netd.

Il modulo DNS Resolver dipende da libc (Bionic) e collega staticamente le sue dipendenze. Non sono richieste altre librerie.

Risoluzione .local mDNS

A partire da novembre 2021, il resolver Android supporta la risoluzione mDNS .local, che implementa "5.1 One-Shot multicast DNS Queries" in RFC 6762 per inviare query DNS standard in modo non attendibile a 224.0.0.251:5353 o [FF02::FB]:5353. La risoluzione mDNS è supportata in modo trasparente chiamando getaddrinfo() con un nome host che termina con *.local.

La risoluzione mDNS .local amplia la funzionalità esistente di getaddrinfo() per ottenere gli indirizzi. Se un dispositivo supporta la risoluzione .local mDNS, l'API getaddrinfo() invia query mDNS a 224.0.0.251:5353 o [FF02::FB]:5353 e restituisce gli indirizzi locali. Se un dispositivo non supporta la risoluzione mDNS .local, il metodo dell'API getaddrinfo() invia una query DNS al server DNS.

Il codice è in AOSP, in packages/modules/DnsResolver. Gli utenti possono mantenere il design mDNS corrente per ottenere gli indirizzi oppure utilizzare getaddrinfo(). Il comportamento di questa funzionalità è simile a una normale query DNS inviata agli indirizzi multicast mDNS. Questa funzionalità non influisce sullo stato del sistema.

Gli utenti possono utilizzare il comando adb shell ping6 HOSTNAME.local, dove HOSTNAME è il nome host di un dispositivo di destinazione sulla LAN, ad esempio adb shell ping6 ipad.local.

Le connessioni VPN e dati mobili sono escluse dalla risoluzione .local.