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

כל אפליקציה שיש לה הרשאה INTERNET יכולה לגשת למכשירים ברשת מקומית (LAN). כך קל לאפליקציות להתחבר למכשירים מקומיים, אבל יש לכך גם השלכות על הפרטיות, כמו יצירת טביעת אצבע של המשתמש ושימוש כפרוקסי למיקום.

מטרת הפרויקט Local Network Protections (הגנות על הרשת המקומית) היא להגן על פרטיות המשתמש באמצעות הגבלת הגישה לרשת המקומית מאחורי הרשאת זמן ריצה חדשה.

השפעה

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

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

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

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

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

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

ההגבלות האלה מוטמעות עמוק במערך של רכיבי הרשת, ולכן הן חלות על כל ממשקי ה-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 אין צורך לשנות את הקוד באופן מיידי

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

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

  • דפדפנים: כדי לטפל בשגיאות צריך להשתמש בגישות שונות בהתאם לפרוטוקול. שגיאות UDP מובילות לקוד השגיאה EPERM. בחיבורי TCP, דפדפנים צריכים להשתמש ב-API של NDK‏ 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.

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

הנחיות לגבי Android 16

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

  1. צריבת ROM‏ (flash) במכשיר לגרסת build עם Android 16 Beta 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 אמורה להיחסם אבל לא נחסמת
  • באגים שבהם הגישה לרשת המקומית נחסמת למרות שהיא לא אמורה להיחסם

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

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