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

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

نمای کلی

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

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

پخش‌های Sticky را نمی‌توان به گیرنده‌هایی که مجوزهای خاصی دارند محدود کرد. بنابراین، آنها برای پخش اطلاعات حساس مناسب نیستند. ممکن است وسوسه‌انگیز باشد که فکر کنید مشخص کردن نام بسته برنامه در 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 هنگام ارسال broadcast، intent را دریافت می‌کنند. با این حال، فیلتر نام پکیج هنگام پخش مجدد Intent از sticky cache اعمال نمی‌شود. هنگام ثبت یک گیرنده با استفاده از متد registerReceiver() ، تمام intentهای موجود در sticky cache که با فیلتر مشخص شده مطابقت دارند، صرف نظر از نام پکیجی که گیرنده در آن قرار دارد، دوباره به گیرنده پخش می‌شوند.

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

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

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

وقتی یک intent بخشی از یک sticky broadcast باشد، آن intent جایگزین هر نمونه قبلی می‌شود که همان action، data، type، identifier، class و categories را در sticky cache داشته باشد. بنابراین، یک مهاجم می‌تواند به راحتی داده‌های اضافی را در یک sticky intent از یک برنامه قانونی بازنویسی کند، که ممکن است بعداً دوباره به سایر گیرنده‌ها broadcast شود.

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

تأثیر

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

کاهش‌ها

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

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

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