הרשאת רשת מקומית

כל אפליקציה עם הרשאת INTERNET יכולה לגשת למכשירים ברשת מקומית (LAN). אומנם זה מאפשר להן להתחבר בקלות למכשירים האלה, אבל יש לזה השלכות על הפרטיות. בין היתר זה יוצר "טביעת אצבע" דיגיטלית של המשתמש והופך את האפליקציות לשרת proxy לזיהוי מיקום.

מטרת הפרויקט "אמצעי הגנה על הרשת המקומית" היא להגן על פרטיות המשתמשים על ידי הגבלת הגישה לרשת המקומית באמצעות הרשאה חדשה בתחילת ההפעלה.

השפעה

החל מ-Android 17 (רמת API ‏37), אמצעי ההגנה על הרשת המקומית נאכפים באפליקציות שמטרגטות ל-Android 17 ומעלה. ההגדרה הקודמת של הצטרפות ל-Android 16 הוצאה משימוש. דרישות ההטמעה הנוכחיות מפורטות בקטע אכיפה ב-Android 17.

אפליקציות יושפעו אם הן ניגשות לרשת המקומית של המשתמש באמצעות:

  • שימוש ישיר או שימוש בספרייה של שקעים גולמיים בכתובות של רשתות מקומיות, לדוגמה, Multicast DNS (mDNS) או Simple Service Discovery Protocol (SSDP).
  • שימוש במחלקות ברמת המסגרת שניגשות לרשת המקומית, לדוגמה, NsdManager.

פרטים על ההשפעה

כדי שתעבורת נתונים תעבור אל כתובת של רשת מקומית וממנה, נדרשת הרשאת גישה לרשת המקומית. בטבלה הבאה מפורטים כמה מקרים נפוצים:

פעולת רשת ברמה נמוכה של האפליקציה נדרשת הרשאת גישה לרשת המקומית
יצירת חיבור TCP יוצא כן
אישור של חיבור TCP נכנס כן
שליחת UDP מסוג Unicast, ‏ Multicast, ‏ Broadcast כן
קבלת שידור UDP נכנס מסוג Unicast,‏ Multicast או Broadcast כן

ההגבלות האלה מוטמעות עמוק במקבץ הרשת (network stack), ולכן הן חלות על כל ממשקי ה-API של הרשת. זה כולל שקעים שנוצרו בפלטפורמה או בקוד מנוהל, ספריות רשת כמו Cronet ו-OkHttp, וכל ממשקי ה-API שמוטמעים מעליהם. כדי לנסות לפתור שירותים ברשת המקומית עם הסיומת .local, נדרשת הרשאת גישה לרשת המקומית.

חריגים לכללים הקודמים:

  • אם שרת ה-DNS של המכשיר נמצא ברשת מקומית, התנועה אליו וממנו (ביציאה 53) לא דורשת הרשאת גישה לרשת המקומית.
  • אפליקציות שמשתמשות במתג הפלט כבורר בתוך האפליקציה לא יצטרכו הרשאות לרשת המקומית (הנחיות נוספות יפורסמו בגרסה עתידית).

אכיפה ב-Android 17

החל מ-Android 17, אמצעי ההגנה על הרשת המקומית הם חובה ונאכפים באפליקציות שמטרגטות ל-Android 17 ואילך.

יחס גובה-רוחב Android 16 Android 17
גרסת יעד של SDK 36 ‫37 ומעלה
הרשאה שימוש זמני ב-NEARBY_WIFI_DEVICES ACCESS_LOCAL_NETWORK
גישה כברירת מחדל הגישה לרשת המקומית פתוחה הרשת המקומית חסומה כברירת מחדל בכל האפליקציות שמעדכנות את ה-SDK לטירגוט
קבוצת הרשאות חלק מקבוצת ההרשאות הקיימת NEARBY_DEVICES

כדי לוודא שתכונות האפליקציה לא נפגעות אחרי האכיפה, אפליקציות שמטרגטות את SDK 37 ואילך צריכות לאמץ אחת מהדרכים הבאות לניהול הגישה לרשת המקומית:

אפשרות א': שימוש בבוררים ששומרים על הפרטיות

כדי להימנע מבקשת הרשאה רחבה בתחילת ההפעלה, השתמשו בבוררים למשימות של גילוי וחיבור שמתווכות על ידי המערכת. השתמשו בבוררים הבאים בהתאם לתרחיש לדוגמה:

  • סטרימינג של מדיה: באפליקציות שתומכות ב-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
    }
})

מסלול ב': בקשת הרשאה בתחילת ההפעלה (גישה רחבה)

הנתיב הזה נדרש לתרחישי שימוש מורכבים כמו אוטומציה של הבית או ניהול מכשירי IoT שצריכים גישה רחבה וקבועה לרשת המקומית.

  • הצהרה על ההרשאה במניפסט: צריך להצהיר במפורש על ACCESS_LOCAL_NETWORK ב-AndroidManifest.xml.

  • בקשת הרשאה בזמן הריצה: לפני שהאפליקציה מנסה לגשת לרשת המקומית, היא צריכה לבדוק אם ההרשאה ניתנה. אם לא, צריך להפעיל את Activity.requestPermission() כדי להציג את ההנחיה הרגילה של המערכת.

  • תרחיש של הרשאה שניתנה מראש: ההרשאה ACCESS_LOCAL_NETWORK היא חלק מקבוצת ההרשאות NEARBY_DEVICES. אם משתמש כבר נתן הרשאה אחרת בקבוצה הזו (כמו הרשאות Bluetooth), הוא לא יתבקש שוב לתת גישה לרשת המקומית.

  • טיפול בדחייה ובביטול: האפליקציות צריכות לטפל בצורה חלקה במקרים שבהם המשתמש דוחה את הבקשה או מבטל את ההרשאה בהמשך בהגדרות המערכת. במקרים כאלה, התנועה ברשת המקומית תיחסם.

אסטרטגיית איפוס המונה של בקשות ההרשאה

הפלטפורמה מיישמת אסטרטגיה של איפוס מונה, שמתייחסת לתרחישים שבהם דחייה קודמת של האפליקציה את קבוצת ההרשאות NEARBY_DEVICES (שכוללת עכשיו את ACCESS_LOCAL_NETWORK) מנעה מהאפליקציה לבקש את ההרשאה אחרי שהציגה את הנימוק שלה בצורה הולמת. המנגנון הזה נותן לאפליקציה הזדמנויות נוספות להפעיל את ה-API של requestPermission(), ומאפס את מספר הדחיות של ההרשאה ACCESS_LOCAL_NETWORK. כך אפשר לעודד את המשתמשים לתת גישה בצורה מתוחכמת יותר, במיוחד אם הסירוב הראשוני התרחש לפני שהאפליקציה הצליחה להעביר את הצורך בגישה לרשת המקומית בשביל הפונקציונליות העיקרית שלה.

מודל הרשאות מפוצל

הרשאת הגישה לרשת המקומית משתמשת באסטרטגיית העברה של הרשאות מפוצלות כדי לטפל באפליקציות חדשות ובאפליקציות מדור קודם באופן שונה, בהתאם ל-SDK המטורגט שלהן.

קטגוריה רמת SDK לטירגוט התנהגות הגישה לרשת המקומית פעולה נדרשת מצד המפתח
אפליקציות חדשות או מעודכנות >= 37 (Android 17) חסום כברירת מחדל הצהרה על הרשאה בתחילת ההפעלה של ACCESS_LOCAL_NETWORK ובקשה לקבל אותה
אפליקציות מדור קודם < 37 אפליקציות עם הרשאת INTERNET מקבלות הרשאה משתמעת ל-ACCESS_LOCAL_NETWORK, שמאפשרת להן לשמור על הגישה. זה זמני, והאפשרות הזו תיחסם כברירת מחדל כשהאפליקציה תעבור ל-SDK 37 לא צריך לשנות את הקוד באופן מיידי. אל תבקשו את ההרשאה ACCESS_LOCAL_NETWORK בזמן הריצה לפני שאתם מטרגטים ל-SDK 37.

אסטרטגיית LNP לפי תרחיש לדוגמה

  • העברה: לפונקציות של העברת מדיה, האסטרטגיה המתאימה ביותר ששומרת על הפרטיות היא להשתמש בבורר הפלט. השיטה הזו מאפשרת למערכת לטפל בגילוי הרשת המקומית ובחיבור אליה בשם המשתמש, כך שהאפליקציה לא צריכה לבקש הרשאת ACCESS_LOCAL_NETWORK.

  • דפדפנים: הטיפול בשגיאות דורש גישות שונות בהתאם לפרוטוקול. שגיאות UDP גורמות לקוד השגיאה EPERM. בחיבורי TCP, הדפדפנים צריכים להשתמש ב-NDK API‏ android_getnetworkblockedreason(int sockFd) כדי לקבוע אם חבילה נחסמה על ידי LNP. ה-API הזה מחזיר את הערך ANDROID_NETWORK_BLOCKED_REASON_LNP.

  • תרחישים אחרים לדוגמה (למשל, IoT): אפליקציות שמוצאות מכשירים באמצעות mDNS צריכות להשתמש ב-android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER, שמאפשר למצוא מכשירים בלי ההרשאה, וב-NsdManager#registerServiceInfoCallback או ב-NsdManager#resolveService כדי לקבל כתובות IP. חיבורים לכתובות IP שמתקבלות בדרך הזו לא דורשים את ההרשאה ACCESS_LOCAL_NETWORK.

באפליקציות שדורשות תקשורת ישירה ברשת המקומית ולא יכולות להשתמש בכלים לבחירת קבצים של המערכת, הגישה המומלצת היא להשתמש באסטרטגיית איפוס מונה ההרשאות כשמטרגטים ל-Android 17‏ (SDK 37) ומעלה. אם המשתמש מבטל את ההרשאה ACCESS_LOCAL_NETWORK, המנגנון הזה מספק לאפליקציה הזדמנויות נוספות לבקש שוב את ההרשאה, ומאפשר למפתחים להציג למשתמש נימוק ברור יותר.

הנחיות ל-Android 16 (הוצא משימוש)

כדי להפעיל את ההגבלות על הרשת המקומית ב-Android 16:

  1. צריבת ROM‏ (flash) במכשיר לגרסת build עם Android 16 בטא 3 ואילך
  2. מתקינים את האפליקציה שרוצים לבדוק.
  3. החלפת מצב ההגדרה של Appcompat באמצעות adb

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. הפעלה מחדש של המכשיר

עכשיו הגישה של האפליקציה לרשת המקומית מוגבלת, וכל ניסיון לגשת לרשת המקומית מוביל לשגיאות שקע. אם אתם משתמשים בממשקי API שמבצעים פעולות ברשת המקומית מחוץ לתהליך של האפליקציה (לדוגמה, NsdManager), הם לא מושפעים במהלך ההצטרפות.

כדי לשחזר את הגישה, צריך לתת לאפליקציה הרשאה לNEARBY_WIFI_DEVICES.

  • מוודאים שהאפליקציה מצהירה על ההרשאה NEARBY_WIFI_DEVICES בקובץ manifest שלה.
  • עוברים אל הגדרות > אפליקציות > [שם האפליקציה] > הרשאות > מכשירים בקרבת מקום > אישור

עכשיו הגישה של האפליקציה לרשת המקומית אמורה לחזור, וכל התרחישים אמורים לפעול כמו שפעלו לפני שהאפליקציה צורפה. כך זה משפיע על התנועה ברשת של האפליקציה.

הרשאה בקשת LAN יוצאת בקשת אינטרנט יוצאת/נכנסת בקשת LAN נכנסת
הוענקה Microsoft Works Microsoft Works Microsoft Works
לא ניתנה הרשאה פספוסים Microsoft Works פספוסים

כדי להשבית את ההגדרה של Appcompat, משתמשים בפקודה הבאה:

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

שגיאות

אם בקשת גישה לרשת המקומית נכשלת בגלל שאין הרשאה:

  • חיבורי TCP בדרך כלל יגרמו לשגיאת זמן קצוב לתפוגה.

  • שגיאות UDP ודחיות הרשאה כלליות יגרמו בדרך כלל לקוד השגיאה EPERM

באגים

לשלוח דיווחים על באגים ומשוב לגבי:

  • חוסר התאמה בגישה לרשת LAN (לדעתכם גישה מסוימת לא צריכה להיחשב כגישה ל"רשת מקומית")
  • באגים שבהם הגישה לרשת LAN צריכה להיות חסומה אבל היא לא
  • באגים שבהם הגישה לרשת LAN לא אמורה להיחסם אבל היא נחסמת

השינוי הזה לא אמור להשפיע על:

  • גישה לאינטרנט
  • רשת סלולרית