כל אפליקציה עם הרשאת 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 APIandroid_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:
- צריבת ROM (flash) במכשיר לגרסת build עם Android 16 בטא 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 (לדעתכם גישה מסוימת לא צריכה להיחשב כגישה ל"רשת מקומית")
- באגים שבהם הגישה לרשת LAN צריכה להיות חסומה אבל היא לא
- באגים שבהם הגישה לרשת LAN לא אמורה להיחסם אבל היא נחסמת
השינוי הזה לא אמור להשפיע על:
- גישה לאינטרנט
- רשת סלולרית