پخش های چسبنده

دسته OWASP: MASVS-PLATFORM: پلتفرم تعامل

نمای کلی

برنامه‌های اندروید و سیستم اندروید می‌توانند از پخش‌ها به‌عنوان یک سیستم پیام‌رسان برای اطلاع‌رسانی به برنامه‌های دیگر از رویدادهایی که ممکن است به آنها علاقه‌مند باشند، استفاده کنند. پخش‌های چسبنده نوع خاصی از پخش هستند که شیء(های) هدف ارسال شده پس از پخش در حافظه پنهان باقی می‌مانند. کامل است. این سیستم ممکن است مقاصد چسبنده را برای ثبت‌های بعدی گیرنده‌ها مجدداً پخش کند. متأسفانه، API پخش چسبنده از تعدادی کاستی های مرتبط با امنیت رنج می برد، به همین دلیل است که در Android 5.0 (سطح API 21) منسوخ شده است.

همه می توانند به پخش های چسبناک دسترسی داشته باشند

پخش های چسبنده را نمی توان به گیرنده هایی که دارای مجوزهای خاصی هستند محدود کرد. بنابراین، آنها برای پخش اطلاعات حساس مناسب نیستند. ممکن است وسوسه انگیز باشد که فکر کنیم تعیین نام بسته برنامه در Intent پخش مجموعه BroadcastReceivers را محدود می کند:

کاتلین

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

جاوا

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

در مثال، تنها گیرنده‌های بسته com.example.myapp هنگام ارسال پیام، هدف را دریافت می‌کنند. با این حال، فیلتر نام بسته زمانی که Intent مجدداً از کش چسبنده پخش می شود اعمال نمی شود. هنگام ثبت یک گیرنده با استفاده از متد registerReceiver() ، تمام مقاصد موجود در کش چسبنده که با فیلتر مشخص شده مطابقت دارند، بدون توجه به نام بسته ای که گیرنده در آن قرار دارد، مجدداً برای گیرنده پخش می شود.

هر کسی می تواند پخش های چسبناک ارسال کند

برای ارسال پخش‌های چسبنده، یک برنامه فقط به مجوز android.permission.BROADCAST_STICKY نیاز دارد که به‌طور خودکار با نصب برنامه اعطا می‌شود. بنابراین، مهاجمان می توانند هر هدفی را به هر گیرنده ای ارسال کنند و به طور بالقوه به برنامه دیگری دسترسی غیرمجاز پیدا کنند. گیرنده های پخش می توانند فرستنده ها را محدود به کسانی کنند که مجوز خاصی دارند. با این حال، با انجام این کار، گیرنده نمی‌تواند پخش‌ها را از حافظه نهان چسبنده دریافت کند، زیرا آن‌ها در چارچوب هویت هیچ برنامه‌ای ارسال نمی‌شوند و با هیچ مجوزی پخش نمی‌شوند.

هر کسی می تواند پخش های چسبناک را تغییر دهد

هنگامی که یک intent بخشی از یک پخش چسبنده است، آن intent جایگزین هر نمونه قبلی می شود که دارای عملکرد، داده، نوع، شناسه، کلاس و دسته های یکسان در حافظه پنهان چسبنده است. بنابراین، یک مهاجم می‌تواند داده‌های اضافی را در یک هدف چسبنده از یک برنامه قانونی بازنویسی کند، که ممکن است مجدداً برای گیرنده‌های دیگر پخش شود.

پخش‌هایی که با استفاده از روش sendStickyOrderedBroadcast() ارسال می‌شوند هر بار به یک گیرنده تحویل داده می‌شوند تا به گیرنده‌هایی که اولویت بالاتری دارند اجازه دهند پخش را قبل از تحویل به گیرنده‌های با اولویت پایین‌تر مصرف کنند. همانطور که هر گیرنده به نوبه خود اجرا می شود، می تواند نتیجه ای را به گیرنده بعدی ارسال کند، مانند فراخوانی setResultData() ، یا می تواند پخش را متوقف کند ، و از دریافت کننده های بعدی جلوگیری کند. مهاجمی که می‌تواند پخش‌های سفارشی چسبنده را از یک برنامه قانونی دریافت کند، می‌تواند یک گیرنده با اولویت بالا برای دستکاری داده‌های نتیجه پخش ایجاد کند یا پخش را به طور کامل حذف کند.

تاثیر

تاثیر بسته به نحوه استفاده از پخش چسبناک و داده‌هایی که به گیرنده‌های پخش ارسال می‌شود، متفاوت است. به طور کلی، استفاده از پخش‌های چسبنده می‌تواند منجر به قرار گرفتن در معرض داده‌های حساس، دستکاری داده‌ها، دسترسی غیرمجاز برای اجرای رفتار در برنامه دیگر و انکار سرویس شود.

کاهش

پخش های چسبنده نباید استفاده شوند. الگوی توصیه شده این است که از پخش های غیر چسبنده با مکانیسم دیگری مانند پایگاه داده محلی استفاده کنید تا هر زمان که بخواهید مقدار فعلی را بازیابی کنید.

توسعه‌دهندگان می‌توانند با استفاده از مجوزها یا با تنظیم نام بسته برنامه روی intent، کنترل کنند که چه کسی می‌تواند پخش‌های غیر چسبنده را دریافت کند. علاوه بر این، اگر نیازی به ارسال یک پخش به اجزای خارج از برنامه نیست، از LiveData استفاده کنید که الگوی مشاهدهگر را پیاده‌سازی می‌کند.

اطلاعات بیشتر در مورد ایمن سازی پخش ها را می توانید در صفحه نمای کلی پخش بیابید.