Risolutore DNS

Il modulo DNS Resolver fornisce protezione utente per intercettazioni DNS e attacchi di aggiornamento della configurazione e prestazioni di rete migliorate per le risoluzioni DNS. Il modulo contiene il codice che implementa il risolutore di stub DNS, che traduce nomi come www.google.com in indirizzi IP come 2001:db8::1 . Il risolutore di stub DNS supporta elementi 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.

Cambiamenti in Android 10

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

Android 10 sposta il codice del risolutore DNS su system/netd/resolv, lo converte in C++, quindi modernizza ed effettua il refactoring del codice. Il codice in Bionic continua ad esistere per motivi di compatibilità dell'app, ma non viene più richiamato 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 poiché il modulo serve direttamente il socket locale /dev/socket/dnsproxyd . L'endpoint Binder per la configurazione del risolutore è stato spostato da netd al risolutore, il che significa che il servizio di sistema può chiamare direttamente al modulo del risolutore senza passare attraverso netd .

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

risoluzione mDNS .local

A partire da novembre 2021, il risolutore Android supporta la risoluzione mDNS .local, che implementa "5.1 One-Shot multicast DNS Queries" nella RFC 6762 per inviare ciecamente query DNS standard 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 aumenta la funzionalità esistente di getaddrinfo() per ottenere gli indirizzi. Se un dispositivo supporta la risoluzione mDNS .local, 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 API getaddrinfo() invia una query DNS al server DNS.

Il codice è in AOSP, situato in packages/modules/DnsResolver . Gli utenti possono mantenere la progettazione mDNS corrente per ottenere gli indirizzi o utilizzare invece getaddrinfo() . Il comportamento di questa funzionalità è simile a una normale query DNS inviata agli indirizzi multicast mDNS. Questa funzionalità non ha alcun impatto sull'integrità 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 dati mobili e VPN sono escluse dalla risoluzione .local.