כל אפליקציה שיש לה הרשאה 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 של NDKandroid_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
כדי להפעיל את ההגבלות על הגישה לרשת המקומית:
- צריבת ROM (flash) במכשיר לגרסת build עם Android 16 Beta 3 ואילך
- התקנת האפליקציה שרוצים לבדוק
החלפת מצב ההגדרה של Appcompat באמצעות adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>הפעלת המכשיר מחדש
עכשיו הגישה של האפליקציה לרשת המקומית מוגבלת, וכל ניסיון לגשת לרשת המקומית מוביל לשגיאות בשקע.
אם אתם משתמשים בממשקי 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 אמורה להיחסם אבל לא נחסמת
- באגים שבהם הגישה לרשת המקומית נחסמת למרות שהיא לא אמורה להיחסם
השינוי הזה לא ישפיע על:
- גישה לאינטרנט
- רשת סלולרית