קטגוריה ב-OWASP: MASVS-PLATFORM: Platform Interaction
סקירה כללית
אפליקציות ל-Android ומערכת Android יכולות להשתמש בשידורים כבמערכת הודעות כדי להודיע לאפליקציות אחרות על אירועים שעשויים לעניין אותן. שידורים דביקים הם סוג מיוחד של שידורים שבהם אובייקט הכוונה שנשלח נשאר במטמון אחרי שהשידור מסתיים. יכול להיות שהמערכת תשדר מחדש כוונות דביקות לרישומים מאוחרים יותר של מקלטים. לצערנו, יש כמה חסרונות שקשורים לאבטחה ב-API של שידורים דביקים, ולכן הוא הוצא משימוש ב-Android 5.0 (רמת API 21).
לכל אחד יש גישה להודעות קבועות
אי אפשר להגביל את השימוש בשידורים קבועים לנמענים עם הרשאות מסוימות. לכן, הם לא מתאימים לשידור מידע רגיש. יכול להיות שתחשבו שציון שם החבילה של האפליקציה בשידור Intent מגביל את קבוצת BroadcastReceivers:
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
בדוגמה, רק מקלטים בחבילה com.example.myapp מקבלים את ה-intent כשהשידור נשלח. עם זאת, המסנן של שם החבילה לא מוחל כשה-Intent משודר מחדש מהמטמון הקבוע. כשרושמים מקלט באמצעות השיטה registerReceiver(), כל הכוונות במטמון הדביק שתואמות למסנן שצוין משודרות מחדש למקלט, ללא קשר לשם החבילה שבה נמצא המקלט.
כל אחד יכול לשלוח שידורים דביקים
כדי לשלוח שידורים דביקים, אפליקציה צריכה רק את ההרשאה android.permission.BROADCAST_STICKY, שניתנת באופן אוטומטי כשהאפליקציה מותקנת. לכן, תוקפים יכולים לשלוח כל כוונה לכל מקלט, ולקבל גישה לא מורשית לאפליקציה אחרת. מקלטי שידור יכולים להגביל את השולחים לאלה שמחזיקים בהרשאה מסוימת. עם זאת, אם תעשו את זה, הנמען לא יוכל לקבל שידורים מהמטמון הקבוע כי הם לא נשלחים בהקשר של זהות האפליקציה ולא משודרים עם הרשאות.
כל אחד יכול לשנות שידורים קבועים
כשאינטנט הוא חלק משידור קבוע, האינטנט הזה מחליף כל מופע קודם שיש לו את אותה פעולה, נתונים, סוג, מזהה, מחלקה וקטגוריות במטמון הקבוע. לכן, תוקף יכול בקלות להחליף את הנתונים הנוספים ב-sticky intent מאפליקציה לגיטימית, ואז הנתונים האלה עשויים להיות משודרים מחדש למקבלי נתונים אחרים.
שידורים שנשלחים באמצעות השיטה sendStickyOrderedBroadcast() מועברים לנמען אחד בכל פעם, כדי לאפשר לנמענים עם עדיפות גבוהה יותר לצרוך את השידור לפני שהוא מועבר לנמענים עם עדיפות נמוכה יותר. בזמן שכל מקלט מופעל בתורו, הוא יכול להעביר תוצאה למקלט הבא, למשל על ידי קריאה ל-setResultData(), או שהוא יכול לבטל את השידור ולמנוע ממקלטים הבאים לקבל את השידור. תוקף שיכול לקבל שידורים במיקום קבוע ומסודרים מאפליקציה לגיטימית יכול ליצור מקלט בעדיפות גבוהה כדי לשנות את נתוני התוצאה של השידור או להפיל שידורים לחלוטין.
השפעה
ההשפעה משתנה בהתאם לאופן השימוש בשידורים קבועים ולנתונים שמועברים למקלטי השידורים. באופן כללי, שימוש בשידורים קבועים עלול להוביל לחשיפה של מידע אישי רגיש, לשיבוש נתונים, לגישה לא מורשית להפעלת התנהגות באפליקציה אחרת ולהתקפת מניעת שירות (DoS).
אמצעי צמצום סיכונים
לא מומלץ להשתמש בהודעות קבועות. הדפוס המומלץ הוא להשתמש בשידורים לא במיקום קבוע עם מנגנון אחר, כמו מסד נתונים מקומי, כדי לאחזר את הערך הנוכחי בכל פעם שרוצים.
מפתחים יכולים לקבוע מי יכול לקבל שידורים לא קבועים באמצעות הרשאות או על ידי הגדרת שם חבילת האפליקציה בכוונה. בנוסף, אם אין צורך לשלוח שידור לרכיבים מחוץ לאפליקציה, אפשר להשתמש ב-LiveData, שמטמיע את דפוס הצופה.
מידע נוסף על אבטחת שידורים זמין בדף סקירה כללית על שידורים.