DNS 리졸버

DNS 리졸버 모듈은 DNS 가로채기 및 구성 업데이트 공격으로부터 사용자를 보호하며 DNS 해상도에 관한 네트워크 성능을 개선했습니다. 모듈에는 www.google.com과 같은 이름을 2001:db8::1과 같은 IP 주소로 해석하는 DNS 스터브 리졸버를 구현하는 코드가 포함되어 있습니다. DNS 스터브 리졸버는 InetAddress#getAllByNameNetwork#getAllByName과 같은 자바 API 요소와 네이티브 네트워킹 기능을 지원하고 DNS 쿼리의 송수신과 결과 캐싱을 구현합니다.

Android 10 변경사항

Android 9 이하를 실행하는 기기에서 DNS 리졸버 코드는 Bionic 및 netd 전체에 걸쳐 확산됩니다. DNS 조회는 시스템 전체 캐싱을 허용하기 위해 netd 데몬에서 중앙 집중화되며 앱은 Bonic에서 함수(예: getaddrinfo)를 호출합니다. 쿼리는 UNIX 소켓을 통해 netd 데몬의 /dev/socket/dnsproxyd에 전송되며 데몬은 요청을 파싱하고 getaddrinfo를 다시 호출하여 DNS 조회를 실행한 다음 결과를 캐시하므로 다른 앱에서 사용할 수 있습니다. DNS 리졸버 구현은 대부분 bionic/libc/dns/에 포함되었고 일부가 system/netd/server/dns에 포함되어 있었습니다.

Android 10은 DNS 리졸버 코드를 system/netd/resolv,로 이동하여 C++로 변환한 다음 코드를 현대화하고 리팩터링합니다. Bionic의 코드는 앱 호환성을 위해 계속 존재하지만 더 이상 시스템에 의해 호출되지 않습니다. 이러한 소스 경로는 리팩터링의 영향을 받습니다.

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

형식 및 종속 항목

DNS 리졸버 모듈은 APEX 파일로 제공되며 netd에서 동적으로 연결됩니다. 그러나 모듈이 로컬 소켓 /dev/socket/dnsproxyd를 직접 제공하므로 netd는 종속 항목이 아닙니다. 리졸버 구성의 바인더 엔드포인트가 netd에서 리졸버로 이동했습니다. 즉, 시스템 서비스에서 netd를 거치지 않고 리졸버 모듈로 직접 호출할 수 있습니다.

DNS 리졸버 모듈은 libc(Bionic)에 종속되며 종속 항목을 정적으로 연결합니다. 다른 라이브러리는 필요하지 않습니다.