دستگاههای موجود در یک شبکه محلی (LAN) میتوانند توسط هر برنامهای که مجوز INTERNET دارد، قابل دسترسی باشند. این امر اتصال برنامهها به دستگاههای محلی را آسان میکند، اما پیامدهای حریم خصوصی مانند تشکیل اثر انگشت کاربر و تبدیل شدن به یک پروکسی برای موقعیت مکانی را نیز به همراه دارد.
پروژه حفاظت از شبکههای محلی (Local Network Protections) با هدف محافظت از حریم خصوصی کاربر، دسترسی به شبکه محلی را با مجوز زمان اجرا (runtime permission) جدیدی مسدود میکند.
تأثیر
در اندروید ۱۶، این مجوز یک ویژگی اختیاری است، به این معنی که فقط برنامههایی که این ویژگی را انتخاب کردهاند تحت تأثیر قرار میگیرند. هدف از این قابلیت این است که توسعهدهندگان برنامه بفهمند کدام بخشهای برنامهشان به دسترسی ضمنی به شبکه محلی نیاز دارد تا بتوانند برای محافظت از دسترسیها در نسخههای بعدی اندروید آماده شوند.
اگر برنامهها با استفاده از روشهای زیر به شبکه محلی کاربر دسترسی پیدا کنند، تحت تأثیر قرار خواهند گرفت:
- استفاده مستقیم یا کتابخانهای از سوکتهای خام روی آدرسهای شبکه محلی، برای مثال،
Multicast DNS (mDNS)یاSimple Service Discovery Protocol (SSDP). - استفاده از کلاسهای سطح چارچوب که به شبکه محلی دسترسی دارند، برای مثال،
NsdManager.
جزئیات تأثیر
ترافیک ورودی و خروجی از یک آدرس شبکه محلی نیاز به مجوز دسترسی به شبکه محلی دارد. جدول زیر برخی از موارد رایج را فهرست میکند:
| عملیات شبکه سطح پایین برنامه | مجوز شبکه محلی مورد نیاز است |
|---|---|
| ایجاد یک اتصال TCP خروجی | بله |
| پذیرش یک اتصال TCP ورودی | بله |
| ارسال UDP به صورت تک پخشی، چندپخشی، پخش همگانی | بله |
| دریافت یک UDP ورودی به صورت تک پخشی، چندپخشی، پخش همگانی | بله |
این محدودیتها در اعماق پشته شبکه پیادهسازی شدهاند و بنابراین بر همه APIهای شبکه اعمال میشوند. این شامل سوکتهای ایجاد شده در پلتفرم یا کد مدیریتشده، کتابخانههای شبکه مانند Cronet و OkHttp و هر API پیادهسازی شده بر روی آنها میشود. تلاش برای حل سرویسهایی در شبکه محلی که پسوند .local دارند، نیاز به مجوز شبکه محلی دارد.
استثنائات قوانین قبلی:
- اگر سرور DNS یک دستگاه در یک شبکه محلی باشد، ترافیک به/از آن (در پورت ۵۳) نیازی به مجوز دسترسی به شبکه محلی ندارد.
- برنامههایی که از Output Switcher به عنوان انتخابگر درونبرنامهای خود استفاده میکنند، به مجوزهای شبکه محلی نیاز نخواهند داشت (راهنمایی بیشتر در نسخه بعدی ارائه خواهد شد).
راهنمایی
برای اعمال محدودیتهای شبکه محلی، موارد زیر را انجام دهید:
- دستگاه خود را به نسخهای با اندروید ۱۶ بتا ۳ یا بالاتر فلش کنید.
- برنامه را برای آزمایش نصب کنید
با استفاده از adb، تنظیمات Appcompat را تغییر دهید.
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>دستگاه را دوباره راه اندازی کنید
اکنون دسترسی برنامه شما به شبکه محلی محدود شده است و هرگونه تلاشی برای دسترسی به شبکه محلی منجر به خطاهای سوکت خواهد شد. اگر از APIهایی استفاده میکنید که عملیات شبکه محلی را خارج از فرآیند برنامه شما انجام میدهند - به عنوان مثال، NsdManager - آنها در طول فرآیند انتخاب تحت تأثیر قرار نمیگیرند.
برای بازیابی دسترسی، باید به برنامه خود اجازه دسترسی به NEARBY_WIFI_DEVICES را بدهید.
- مطمئن شوید که برنامه مجوز
NEARBY_WIFI_DEVICESرا درmanifestخود اعلام کرده است. - به تنظیمات > برنامهها > [نام برنامه] > مجوزها > دستگاههای نزدیک > اجازه دادن بروید
اکنون دسترسی برنامه شما به شبکه محلی باید بازیابی شده باشد و تمام سناریوهای شما باید مانند قبل از انتخاب برنامه کار کنند. در اینجا نحوه تأثیر ترافیک شبکه برنامه آورده شده است.
| اجازه | درخواست شبکه محلی خروجی | درخواست اینترنت خروجی/ورودی | درخواست شبکه محلی ورودی |
|---|---|---|---|
| اعطا شده | آثار | آثار | آثار |
| اعطا نشده | شکستها | آثار | شکستها |
برای غیرفعال کردن پیکربندی Appcompat از دستور زیر استفاده کنید.
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
خطاها
اگر درخواست دسترسی به شبکه محلی به دلیل عدم دسترسی رد شد:
- اتصالات TCP معمولاً منجر به خطای timeout میشوند.
- خطاهای UDP و رد مجوزهای عمومی معمولاً منجر به کد خطای EPERM میشوند.
اشکالات
ارسال اشکالات و بازخورد برای:
- اختلاف در دسترسی به شبکه محلی (فکر نمیکنید که یک دسترسی خاص باید به عنوان دسترسی به "شبکه محلی" در نظر گرفته شود)
- اشکالاتی که در آنها دسترسی به شبکه محلی باید مسدود شود اما این کار را نمیکند
- اشکالاتی که در آنها دسترسی به شبکه محلی نباید مسدود شود، اما مسدود شده است
موارد زیر نباید تحت تأثیر این تغییر قرار گیرند:
- دسترسی به اینترنت
- شبکه تلفن همراه