رافع ساناد

ماژول «رافع ساناد» از کاربر دربرابر حملات رهگیری ساناد و به‌روزرسانی پیکربندی محافظت می‌کند و عملکرد شبکه را برای وضوح ساناد بهبود می‌بخشد. این واحد حاوی کدی است که حل‌کننده ساناد را پیاده‌سازی می‌کند و نام‌هایی مثل www.google.com را به نشانی‌های IP مثل 2001:db8::1 ترجمه می‌کند. حل‌کننده ساناد پشتیبان عناصر «میانای برنامه‌سازی کاربردی جاوا» مثل InetAddress#getAllByName و Network#getAllByName، و همچنین عملکردهای شبکه بومی است و ارسال و دریافت پُرسمان‌های ساناد و ذخیره نتایج در حافظه نهان را پیاده‌سازی می‌کند.

تغییرات در Android 10

در دستگاه‌های دارای Android نسخه ۹ و پایین‌تر، کد حل‌کننده «نام دامنه» در Bionic و netd پخش می‌شود. جستجوی ساناد در کارگزار netd متمرکز شده است تا امکان ذخیره کردن در کل سیستم فراهم شود، درحالی‌که برنامه‌ها توابعی (مثل getaddrinfo) را در Bionic فرا می‌خوانند. پرسمان ازطریق سوکت UNIX به /dev/socket/dnsproxyd به شبح netd ارسال می‌شود، که درخواست را تجزیه می‌کند و getaddrinfo را دوباره فرا می‌خواند تا جستجوهای ساناد را صادر کند، سپس نتایج را ذخیره می‌کند تا برنامه‌های دیگر بتوانند از آن‌ها استفاده کنند. پیاده‌سازی رافع ساناد بیشتر در bionic/libc/dns/ و بخشی در system/netd/server/dns انجام شده است.

‫Android 10 کد حل‌کننده ساناد را به system/netd/resolv, منتقل می‌کند، سپس آن را به ++C تبدیل می‌کند، و بعد کد را مدرن‌سازی و بازسازی می‌کند. کد موجود در Bionic همچنان به دلایل سازگاری برنامه وجود دارد، اما دیگر توسط سیستم فراخوانی نمی‌شود. این مسیرهای منبع تحت تأثیر بازسازی قرار گرفته‌اند:

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

قالب و وابستگی‌ها

ماژول «رافع ساناد» (`com.android.resolv`) به‌صورت فایل APEX ارائه می‌شود و به‌طور پویا توسط netd پیوند داده می‌شود؛ بااین‌حال، netd وابستگی نیست زیرا ماژول مستقیماً به سوکت محلی /dev/socket/dnsproxyd خدمات ارائه می‌دهد. نقطه پایانی Binder برای پیکربندی حل‌وفصل‌کننده از netd به حل‌وفصل‌کننده منتقل شد، به این معنی که سرویس سیستم می‌تواند بدون گذر از netd مستقیماً به واحد حل‌وفصل‌کننده فراخوانی کند.

مدول «رافع ساناد» به libc (Bionic) وابسته است و وابستگی‌هایش را به‌صورت ایستا پیوند می‌دهد؛ به کتابخانه‌های دیگری نیاز نیست.

وضوح mDNS .local

از نوامبر ۲۰۲۱، حل‌کننده Android از وضوح mDNS .local پشتیبانی می‌کند که «پرس‌وجوهای DNS چندپخشی یک‌باره ۵.۱» را در RFC 6762 پیاده‌سازی می‌کند تا پرس‌وجوهای استاندارد DNS را به‌صورت کورکورانه به ‎224.0.0.251:5353 یا ‎[FF02::FB]:5353 ارسال کند. وضوح mDNS به‌طور شفاف با فراخوانی getaddrinfo() با نام میزبان منتهی به *.local پشتیبانی می‌شود.

‫mDNS .local resolution عملکرد موجود getaddrinfo() برای دریافت نشانی‌ها را بهبود می‌بخشد. اگر دستگاهی از تفکیک .local mDNS پشتیبانی کند، getaddrinfo() API پُرسمان‌های mDNS را به 224.0.0.251:5353 یا [FF02::FB]:5353 ارسال می‌کند و نشانی‌های محلی را برمی‌گرداند. اگر دستگاهی از تفکیک .local ساناد چندپخشی پشتیبانی نکند، روش API getaddrinfo() پُرسمان ساناد را به سرور ساناد ارسال می‌کند.

کد در AOSP است و در packages/modules/DnsResolver قرار دارد. کاربران می‌توانند طراحی mDNS فعلی‌شان را برای دریافت نشانی‌ها حفظ کنند، یا به‌جای آن از getaddrinfo() استفاده کنند. عملکرد این ویژگی مانند پُرسمان ساناد معمولی است که به نشانی‌های چندپخشی mDNS ارسال می‌شود. این ویژگی هیچ تأثیری بر سلامت سیستم ندارد.

کاربران می‌توانند از فرمان adb shell ping6 HOSTNAME.local استفاده کنند، که در آن HOSTNAME نام میزبان دستگاه هدف در LAN است، برای مثال، adb shell ping6 ipad.local.

اتصال‌های VPN و داده تلفن همراه از وضوح .local مستثنا هستند.