محلل DNS

توفر وحدة محلل DNS حماية المستخدم لاعتراض DNS وهجمات تحديث التكوين وتحسين أداء الشبكة لقرارات DNS. تحتوي الوحدة على الكود الذي ينفذ محلل كعب روتين DNS ، والذي يترجم أسماء مثل www.google.com إلى عناوين IP مثل 2001: db8 :: 1 . يدعم محلل كعب DNS عناصر Java API مثل InetAddress # getAllByName و Network # getAllByName ، بالإضافة إلى وظائف الشبكات الأصلية ، ويقوم بتنفيذ إرسال واستقبال استعلامات DNS والتخزين المؤقت للنتائج.

التغييرات في Android 10

على الأجهزة التي تعمل بنظام Android 9 والإصدارات الأقدم ، ينتشر رمز محلل DNS عبر Bionic و netd . تتمركز عمليات بحث DNS في برنامج netd الخفي للسماح بالتخزين المؤقت على مستوى النظام ، بينما تستدعي التطبيقات وظائف (مثل getaddrinfo ) في Bionic. يتم إرسال الاستعلام عبر مقبس UNIX إلى /dev/socket/dnsproxyd إلى برنامج netd daemon ، الذي يحلل الطلب ويستدعي 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/server/ResolverController
  • system/netd/resolv

التنسيق والتبعيات

يتم تسليم وحدة محلل DNS (`com.android.resolv`) كملف APEX ويتم ربطها ديناميكيًا بواسطة netd ؛ ومع ذلك ، فإن netd ليس تبعية لأن الوحدة تخدم المقبس المحلي /dev/socket/dnsproxyd مباشرة. تم نقل نقطة نهاية Binder لتكوين المحلل من netd إلى وحدة الحل ، مما يعني أن خدمة النظام يمكنها الاتصال مباشرة بوحدة المحلل دون المرور عبر netd .

تعتمد وحدة محلل DNS على libc (Bionic) وتربط تبعياتها بشكل ثابت ؛ لا توجد مكتبات أخرى مطلوبة.

mDNS. القرار المحلي

بدءًا من تشرين الثاني (نوفمبر) 2021 ، يدعم محلل Android دقة mDNS. المحلية ، التي تنفذ "5.1 استعلامات DNS متعددة البث المتعدد اللقطة الواحدة" في RFC 6762 لإرسال استعلامات DNS القياسية بشكل أعمى إلى 224.0.0.251:5353 أو [FF02 :: FB]: 5353. يتم دعم دقة mDNS بشفافية من خلال استدعاء getaddrinfo() باسم مضيف ينتهي بـ *.local .

يعمل mDNS. الدقة المحلية على زيادة الوظيفة الحالية لـ getaddrinfo() للحصول على العناوين. إذا كان الجهاز يدعم دقة mDNS. المحلية ، فإن واجهة برمجة تطبيقات getaddrinfo() ترسل استعلامات mDNS إلى 224.0.0.251:5353 أو [FF02 :: FB]: 5353 وتقوم بإرجاع العناوين المحلية. إذا كان الجهاز لا يدعم دقة mDNS. المحلية ، فإن طريقة API getaddrinfo() ترسل استعلام DNS إلى خادم DNS.

الكود موجود في AOSP ، ويقع في packages/modules/DnsResolver . يمكن للمستخدمين الاحتفاظ بتصميم mDNS الحالي للحصول على العناوين ، أو استخدام getaddrinfo() بدلاً من ذلك. يشبه سلوك هذه الميزة استعلام DNS العادي الذي يتم إرساله إلى عناوين الإرسال المتعدد mDNS. هذه الميزة ليس لها أي تأثير على سلامة النظام.

يمكن للمستخدمين استخدام الأمر adb shell ping6 HOSTNAME .local ، حيث يكون HOSTNAME هو اسم مضيف الجهاز المستهدف على الشبكة المحلية ، على سبيل المثال ، adb shell ping6 ipad.local .

يتم استبعاد اتصالات بيانات الجوال و VPN من الدقة المحلية.