يمكن لأي تطبيق لديه إذن INTERNET الوصول إلى الأجهزة على شبكة المنطقة المحلية (LAN).
يسهّل ذلك على التطبيقات الاتصال بالأجهزة المحلية، ولكن له أيضًا آثار على الخصوصية، مثل إنشاء بصمة للمستخدم والعمل كخادم وكيل للموقع الجغرافي.
يهدف مشروع "حماية الشبكة المحلية" إلى حماية خصوصية المستخدم من خلال حصر الوصول إلى الشبكة المحلية بإذن جديد أثناء التشغيل.
التأثير
خلال الإصدار 16 من نظام التشغيل Android، سيكون هذا الإذن ميزة اختيارية، ما يعني أنّ التطبيقات التي توافق على استخدامها فقط هي التي ستتأثر بها. والهدف من الموافقة هو أن يتعرّف مطوّرو التطبيقات على الأجزاء التي تعتمد على الوصول الضمني إلى الشبكة المحلية، وذلك حتى يتمكّنوا من الاستعداد لحماية الأذونات في إصدار Android مستقبلي.
ستتأثر التطبيقات إذا كانت تصل إلى الشبكة المحلية للمستخدم باستخدام:
- الاستخدام المباشر أو استخدام المكتبة لمقابس البيانات الأولية على عناوين الشبكة المحلية، مثل
Multicast DNS (mDNS)أوSimple Service Discovery Protocol (SSDP) - استخدام فئات على مستوى إطار العمل يمكنها الوصول إلى الشبكة المحلية، مثل
NsdManager
تفاصيل التأثير
يتطلّب نقل البيانات من عنوان شبكة محلية وإليه الحصول على إذن بالوصول إلى الشبكة المحلية. يسرد الجدول التالي بعض الحالات الشائعة:
| عمليات الشبكة المنخفضة المستوى في التطبيق | يجب منح الإذن بالوصول إلى الشبكة المحلية |
|---|---|
| إجراء اتصال TCP صادر | نعم |
| قبول اتصال TCP وارد | نعم |
| إرسال بث أحادي أو بث متعدّد أو بث عادي عبر UDP | نعم |
| تلقّي بث أحادي أو متعدد أو عادي وارد عبر UDP | نعم |
يتم تنفيذ هذه القيود في عمق حزمة الشبكات، وبالتالي فهي تنطبق على جميع واجهات برمجة التطبيقات المتعلقة بالشبكات. ويشمل ذلك المقابس التي تم إنشاؤها في النظام الأساسي أو الرمز البرمجي المُدار، ومكتبات الشبكات مثل Cronet وOkHttp، وأي واجهات برمجة تطبيقات تم تنفيذها فوق هذه المكتبات. يتطلّب حلّ الخدمات على الشبكة المحلية التي تتضمّن اللاحقة .local إذنًا بالوصول إلى الشبكة المحلية.
استثناءات للقواعد السابقة:
- إذا كان خادم DNS الخاص بالجهاز على شبكة محلية، لن تتطلّب حركة البيانات من وإلى هذا الخادم (على المنفذ 53) إذن الوصول إلى الشبكة المحلية.
- لن تحتاج التطبيقات التي تستخدم أداة اختيار Output Switcher كأداة اختيار داخل التطبيق إلى أذونات الشبكة المحلية (سيتم تقديم المزيد من الإرشادات في إصدار لاحق).
فرض استخدام Android 17
اعتبارًا من Android 17، أصبحت وسائل الحماية على الشبكة المحلية إلزامية ويتم فرضها على التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث.
| جانب | Android 16 | Android 17 |
|---|---|---|
| حزمة SDK المستهدفة | 36 | 37 أو أكثر |
| الإذن | استخدام NEARBY_WIFI_DEVICES مؤقتًا | ACCESS_LOCAL_NETWORK |
| إذن الوصول التلقائي | إذن الوصول إلى الشبكة المحلية متاح | يتم حظر الوصول إلى الشبكة المحلية تلقائيًا لجميع التطبيقات التي تُحدِّث حزمة SDK المستهدَفة. |
| مجموعة أذونات | جزء من مجموعة أذونات NEARBY_DEVICES الحالية |
للتأكّد من أنّ وظائف التطبيق لا تتوقّف بعد فرض القيود، يجب أن تتّبع التطبيقات التي تستهدف الإصدار 37 من حزمة تطوير البرامج (SDK) أو إصدارًا أحدث أحد المسارات التالية لإدارة إذن الوصول إلى الشبكة المحلية:
المسار (أ): استخدام أدوات اختيار تحافظ على الخصوصية
بالنسبة إلى مهام الاكتشاف والاتصال التي يتوسّط فيها النظام، استخدِم أدوات الاختيار لتجنُّب طلب إذن التشغيل الواسع النطاق تمامًا. استخدِم أدوات الاختيار التالية استنادًا إلى حالة الاستخدام:
- بث الوسائط: يمكن للتطبيقات التي تتوافق مع Google Cast استخدام ميزة أداة التبديل بين أجهزة التشغيل. يتيح ذلك للمطوّرين السماح للمستخدمين باختيار أجهزة بث معيّنة بدون أن يحتاج التطبيق إلى طلب الإذن العام
ACCESS_LOCAL_NETWORK. - الاتصال العام: يتضمّن
NsdManagerأداة اختيار خدمة يديرها النظام لاكتشاف mDNS. وبدلاً من أن يفحص التطبيق الشبكة بأكملها، يعرض النظام مربّع حوار يسمح للمستخدم باختيار جهاز واحد يمكن للتطبيق الوصول إليه.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
المسار (ب): طلب إذن الوصول في وقت التشغيل (وصول واسع النطاق)
هذا المسار مطلوب لحالات الاستخدام المعقّدة، مثل التشغيل الآلي للمنزل أو إدارة أجهزة إنترنت الأشياء التي تحتاج إلى وصول واسع النطاق ودائم إلى الشبكة المحلية.
الإفصاح عن الإذن في البيان: على المطوّرين الإفصاح صراحةً عن
ACCESS_LOCAL_NETWORKفيAndroidManifest.xml.طلب الإذن في وقت التشغيل: قبل محاولة الوصول إلى أي شبكة محلية، يجب أن تتحقّق التطبيقات مما إذا تم منح الإذن. إذا لم يكن الأمر كذلك، يجب أن يتصلوا بالرقم
Activity.requestPermission()لتفعيل طلب النظام العادي.سيناريو منح الإذن مسبقًا: يشكّل الإذن
ACCESS_LOCAL_NETWORKجزءًا من مجموعة الأذوناتNEARBY_DEVICES. إذا سبق للمستخدم منح إذن آخر في هذه المجموعة (مثل أذونات Bluetooth)، لن يُطلب منه مجددًا منح إذن الوصول إلى الشبكة المحلية.التعامل مع الرفض والإبطال: يجب أن تتعامل التطبيقات بشكل ملائم مع الحالات التي يرفض فيها المستخدم الطلب أو يبطل الإذن لاحقًا في إعدادات النظام. في مثل هذه السيناريوهات، سيتم حظر زيارات الشبكة المحلية.
استراتيجية إعادة ضبط عدّاد طلبات الإذن
تتّبع المنصة استراتيجية لإعادة ضبط العداد تتناول الحالات التي أدى فيها رفض التطبيق السابق لمجموعة أذونات NEARBY_DEVICES (التي تتضمّن الآن ACCESS_LOCAL_NETWORK) إلى منع التطبيق من طلب الإذن بعد تقديم الأساس المنطقي بشكل كافٍ. تمنح هذه الآلية فرصًا إضافية للتطبيق لاستدعاء واجهة برمجة التطبيقات requestPermission()، ما يؤدي إلى إعادة ضبط عدد الرفض للإذن ACCESS_LOCAL_NETWORK. يتيح ذلك إعادة التفاعل مع المستخدم بشكل أكثر دقة،
خاصةً عندما تم الرفض الأوّلي قبل أن يتمكّن التطبيق من توضيح
ضرورة الوصول إلى الشبكة المحلية لتنفيذ وظائفه الأساسية.
نموذج الأذونات المقسَّمة
يستخدم إذن الوصول إلى الشبكة المحلية استراتيجية نقل الإذن المجزّأ للتعامل مع التطبيقات الجديدة والقديمة بشكل مختلف، وذلك استنادًا إلى حزمة تطوير البرامج (SDK) المستهدَفة.
| الفئة | مستوى حزمة تطوير البرامج (SDK) المستهدَف | سلوك الوصول إلى الشبكة المحلية | الإجراء المطلوب من المطوّر |
|---|---|---|---|
| التطبيقات الجديدة / التطبيقات المحدَّثة | >= 37 (الإصدار 17 من نظام التشغيل Android) | محظورة تلقائيًا | تضمين إذن ACCESS_LOCAL_NETWORK في بيان الأذونات وطلبه |
| التطبيقات القديمة | أقل من 37 | تحصل التطبيقات التي لديها إذن الوصول إلى الإنترنت على إذن ضمني لاستخدام ACCESS_LOCAL_NETWORK، ما يسمح لها بالاحتفاظ بإمكانية الوصول. هذا الإجراء مؤقت وسيتم حظره تلقائيًا بعد أن يستهدف التطبيق الإصدار 37 من حزمة تطوير البرامج (SDK). |
لا حاجة إلى إجراء تغيير فوري على الرمز البرمجي |
استراتيجية نقل الأرقام حسب حالة الاستخدام
البث: بالنسبة إلى وظائف بث الوسائط، فإنّ الاستراتيجية الأنسب والأكثر حفاظًا على الخصوصية هي استخدام أداة اختيار جهاز الإخراج. تتيح هذه الطريقة للنظام التعامل مع عملية البحث عن الأجهزة على الشبكة المحلية والاتصال بها نيابةً عن المستخدم، ما يلغي حاجة التطبيق إلى طلب
ACCESS_LOCAL_NETWORKإذن.المتصفّحات: تتطلّب معالجة الأخطاء اتّباع أساليب مختلفة استنادًا إلى البروتوكول. تؤدي أخطاء UDP إلى رمز الخطأ
EPERM. بالنسبة إلى اتصالات TCP، يجب أن تستخدم المتصفحات واجهة برمجة تطبيقات NDKandroid_getnetworkblockedreason(int sockFd)لتحديد ما إذا كانت حزمة قد تم حظرها بواسطة LNP، وتعرض واجهة برمجة التطبيقات هذه القيمةANDROID_NETWORK_BLOCKED_REASON_LNP.حالات الاستخدام الأخرى (مثل إنترنت الأشياء): يجب أن تستخدم التطبيقات التي تعثر على الأجهزة باستخدام mDNS
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERالتي تتيح العثور على الأجهزة بدون إذن، وNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceللحصول على عناوين IP. لا تتطلّب عمليات الربط بعناوين IP التي يتم الحصول عليها بهذه الطريقة الإذنACCESS_LOCAL_NETWORK.
بالنسبة إلى التطبيقات التي تتطلّب اتصالاً مباشرًا بالشبكة المحلية ولا يمكنها استخدام أدوات الاختيار التي يوفّرها النظام، فإنّ الطريقة المقترَحة هي استخدام استراتيجية عدّاد إعادة ضبط الأذونات. في حال ألغى المستخدم الإذن ACCESS_LOCAL_NETWORK، تتيح هذه الآلية فرصًا إضافية للتطبيق لإعادة طلب الإذن، ما يسمح للمطوّرين بتقديم أساس منطقي أكثر وضوحًا للمستخدم.
إرشادات Android 16
لفرض قيود على الشبكة المحلية، اتّبِع الخطوات التالية:
- تثبيت الإصدار التجريبي 3 أو إصدار أحدث من Android 16 على جهازك
- تثبيت التطبيق المطلوب اختباره
تبديل إعدادات Appcompat باستخدام adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>أعِد تشغيل الجهاز
سيتم الآن حظر وصول تطبيقك إلى الشبكة المحلية، وسيؤدي أي محاولة للوصول إلى الشبكة المحلية إلى حدوث أخطاء في المقبس.
إذا كنت تستخدم واجهات برمجة تطبيقات تنفّذ عمليات على الشبكة المحلية خارج عملية تطبيقك (على سبيل المثال، NsdManager)، لن تتأثر هذه الواجهات أثناء الموافقة.
لاستعادة إمكانية الوصول، يجب منح تطبيقك الإذن بالوصول إلى NEARBY_WIFI_DEVICES.
- تأكَّد من أنّ التطبيق يوضّح إذن
NEARBY_WIFI_DEVICESفيmanifest. - انتقِل إلى الإعدادات > التطبيقات > [اسم التطبيق] > الأذونات > الأجهزة القريبة > السماح
من المفترض الآن أن يكون قد تم استعادة إذن وصول تطبيقك إلى الشبكة المحلية، وأن تعمل جميع السيناريوهات كما كانت قبل منح التطبيق الإذن. في ما يلي كيفية تأثّر زيارات شبكة التطبيقات.
| الإذن | Outbound LAN Request | طلب الإنترنت الصادر/الوارد | طلب شبكة LAN وارد |
|---|---|---|---|
| تم منح الأذونات | Works | Works | Works |
| لم يتم المنح | الإخفاقات | Works | الإخفاقات |
استخدِم الأمر التالي لإيقاف إعدادات Appcompat:
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
الأخطاء
في حال تعذُّر طلب الوصول إلى الشبكة المحلية بسبب عدم توفّر الإذن:
ستؤدي عمليات ربط TCP عادةً إلى حدوث خطأ في المهلة.
ستؤدي أخطاء UDP ورفض الأذونات العامة عادةً إلى رمز الخطأ EPERM
Bugs
إرسال الأخطاء والملاحظات بشأن:
- التناقضات في إذن الوصول إلى الشبكة المحلية (لا تعتقد أنّه يجب اعتبار إذن وصول معيّن إذنًا بالوصول إلى "الشبكة المحلية")
- الأخطاء التي يجب فيها حظر الوصول إلى الشبكة المحلية ولكن لا يتم ذلك
- الأخطاء التي يتم فيها حظر الوصول إلى الشبكة المحلية على الرغم من عدم وجوب ذلك
لن تتأثر العناصر التالية بهذا التغيير:
- الوصول إلى الإنترنت
- شبكة الجوّال