קטגוריה ב-OWASP: MASVS-PLATFORM: Platform Interaction
סקירה כללית
אפליקציות ל-Android ומערכת Android יכולות להשתמש בשידורים כמערכת שליחת הודעות כדי להודיע לאפליקציות אחרות על אירועים שעשויים לעניין אותן. שידורים מודבקים הם סוג מיוחד של שידור שבו אובייקטי ה-intent שנשלחו נשארים במטמון אחרי שהשידור מסתיים. המערכת עשויה לשדר מחדש כוונות מודבקות לרישומים מאוחרים יותר של מקלטים. לצערנו, ל-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 מופץ מחדש מהמטמון הקבוע. כשרושמים מקלט באמצעות השיטה registerReceiver()
, כל הכוונות במטמון הקבוע שתואמות למסנן שצוין משודרות מחדש למקלט, ללא קשר לשם החבילה שבה נמצא המקלט.
כל אחד יכול לשלוח שידורים דביקים
כדי לשלוח שידורים מוצמדים, האפליקציה צריכה רק את ההרשאה android.permission.BROADCAST_STICKY
, שמוענק באופן אוטומטי כשהאפליקציה מותקנת. לכן, תוקפים יכולים לשלוח כל כוונה לכל נמען, וכך לקבל גישה לא מורשית לאפליקציה אחרת. נמעני השידור יכולים להגביל את השולחים רק למי שיש לו הרשאה מסוימת. עם זאת, הפעולה הזו מונעת מהמקבל לקבל שידורים מהמטמון הקבוע, כי השידורים האלה לא נשלחים בהקשר של זהות של אפליקציה כלשהי ולא משודרים עם הרשאות כלשהן.
כל אחד יכול לשנות שידורים מוצמדים
כשכוונת שימוש היא חלק משידור דביק, הכוונה הזו מחליפה כל מופע קודם שיש לו את אותה פעולה, נתונים, סוג, מזהה, סיווג וקטגוריות במטמון הדביק. לכן, תוקף יכול בקלות לשכתב את הנתונים הנוספים בכוונה תחילה (sticky intent) מאפליקציה לגיטימית, וייתכן שהם יועברו מחדש למקלטים אחרים.
שידורים שנשלחים באמצעות השיטה sendStickyOrderedBroadcast()
מועברים לנמען אחד בכל פעם, כדי לאפשר לנמענים עם עדיפות גבוהה יותר לצרוך את השידור לפני שהוא מועבר לנמענים עם עדיפות נמוכה יותר. כשכל מקלט פועל בתורו, הוא יכול להעביר את התוצאה למקלט הבא, למשל על ידי קריאה ל-setResultData()
, או לבטל את השידור, כדי למנוע ממקלטים הבאים לקבל את השידור. תוקף שיכול לקבל שידורים במיקום קבוע לפי סדר מאפליקציה לגיטימית יכול ליצור מקלט בעדיפות גבוהה כדי לשבש את נתוני התוצאות של השידור או להפסיק את השידורים לחלוטין.
השפעה
ההשפעה משתנה בהתאם לאופן שבו נעשה שימוש בשידורים המוצמדים ולנתונים שמועברים למקלטי השידור. באופן כללי, שימוש בשידורים מודבקים עלול להוביל לחשיפת מידע אישי רגיש, לזיוף נתונים, לגישה לא מורשית לביצוע פעולות באפליקציה אחרת ולהתקפת מניעת שירות (DoS).
פעולות מיטיגציה
אין להשתמש בשידורים מוצמדים. התבנית המומלצת היא להשתמש בשידורים לא דביקים עם מנגנון אחר, כמו מסד נתונים מקומי, כדי לאחזר את הערך הנוכחי בכל שלב.
מפתחים יכולים לקבוע מי יוכל לקבל שידורים לא מוצמדים באמצעות הרשאות או על ידי הגדרת שם חבילת האפליקציה בכוונה. בנוסף, אם אין צורך לשלוח שידור לרכיבים מחוץ לאפליקציה, אפשר להשתמש ב-LiveData
, שמטמיע את תבנית הצופה.
מידע נוסף על אבטחת שידורים זמין בדף סקירה כללית על שידורים.