השולח של מנגנוני Intent בהמתנה

קטגוריה ב-OWASP: MASVS-CODE: איכות הקוד

סקירה כללית

שימוש ב-PendingIntent.getCreator*() או ב-PendingIntent.getTarget*() כדי לקבוע אם לתת אמון לשולח של PendingIntent יוצר סיכון לניצול לרעה.

PendingIntent.getCreator*() או ‫PendingIntent.getTarget*() מחזירה את היוצר של PendingIntent, שלא תמיד זהה לשולח שלו. יכול להיות שהיוצר מהימן, אבל לעולם לא צריך לסמוך על השולח, כי יכול להיות שהשולח הוא אפליקציה זדונית שקיבלה PendingIntent של אפליקציה אחרת באמצעות מגוון מנגנונים, למשל:

דוגמה לשימוש לגיטימי ב-PendingIntent.getCreator*() או ב-PendingIntent.getTarget*() היא הצגת הסמל של האפליקציה שתופעל על ידי PendingIntent.

השפעה

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

אמצעי צמצום סיכונים

הבחנה בין השולח לבין היוצר

כל סוג של לוגיקה של אימות או הרשאה שמופעלת כשמתקבל PendingIntent לא יכולה להתבסס על הנחות לגבי היוצר של PendingIntent שזוהה באמצעות PendingIntent.getCreator*() או PendingIntent.getTarget*().

שימוש בדרכים חלופיות לאימות המתקשרים

אם צריך לאמת את מבצע הקריאה, במקום להשתמש ב-PendingIntent, צריך להשתמש ב-Service או ב-ContentProvider – שניהם מאפשרים אחזור של ה-UID של מבצע הקריאה באמצעות Binder.getCallingUid() כשנמצאים בהקשר של שליחת IPC נכנס. אפשר לשלוח שאילתה לגבי ה-UID מאוחר יותר באמצעות PackageManager.getPackagesForUid().

גישה נוספת, שזמינה מ-API ברמה 34, היא שימוש ב-BroadcastReceiver.getSentFromUid()‎ או ב-BroadcastReceiver.getSentFromPackage()‎ אם השולח בחר לשתף את הזהות שלו במהלך השידור באמצעות BroadcastOptions.isShareIdentityEnabled()‎.

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

משאבים