دسته OWASP: MASVS-CODE: کیفیت کد
نمای کلی
استفاده از PendingIntent.getCreator*()
یا PendingIntent.getTarget*()
برای تعیین اینکه آیا باید به فرستنده PendingIntent اعتماد کرد، خطر بهره برداری را ایجاد می کند.
PendingIntent.getCreator*()
یا PendingIntent.getTarget*()
سازنده PendingIntent را برمی گرداند که همیشه با فرستنده آن مطابقت ندارد. ممکن است سازنده قابل اعتماد باشد، اما هرگز نباید به فرستنده اعتماد کرد، زیرا ممکن است فرستنده یک برنامه مخرب باشد که PendingIntent برنامه دیگری را با استفاده از مکانیسمهای مختلف به دست آورده است، به عنوان مثال:
- از
NotificationListenerService
- موارد استفاده قانونی که بخشی از برنامه آسیب پذیر هستند.
نمونه ای از استفاده مشروع از 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 Store همپوشانی داشته باشند.
منابع
،دسته OWASP: MASVS-CODE: کیفیت کد
نمای کلی
استفاده از PendingIntent.getCreator*()
یا PendingIntent.getTarget*()
برای تعیین اینکه آیا باید به فرستنده PendingIntent اعتماد کرد، خطر بهره برداری را ایجاد می کند.
PendingIntent.getCreator*()
یا PendingIntent.getTarget*()
سازنده PendingIntent را برمی گرداند که همیشه با فرستنده آن مطابقت ندارد. ممکن است سازنده قابل اعتماد باشد، اما هرگز نباید به فرستنده اعتماد کرد، زیرا ممکن است فرستنده یک برنامه مخرب باشد که PendingIntent برنامه دیگری را با استفاده از مکانیسمهای مختلف به دست آورده است، به عنوان مثال:
- از
NotificationListenerService
- موارد استفاده قانونی که بخشی از برنامه آسیب پذیر هستند.
نمونه ای از استفاده مشروع از 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 Store همپوشانی داشته باشند.