محلل نظام أسماء النطاقات

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

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

يتم نشر رمز برنامج تعيين نظام أسماء النطاقات على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل 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

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

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

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

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

يتم استبعاد اتصالات الشبكات الظاهرية الخاصة واتصالات بيانات الجوّال من الدقة المحلية.