ربودن با قصد ضمنی

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

نمای کلی

آسیب‌پذیری ربودن ضمنی اینتنت زمانی رخ می‌دهد که یک برنامه هنگام فراخوانی یک اینتنت، نام کلاس کامپوننت یا بسته‌ی کاملاً واجد شرایط را مشخص نکند. این امر به یک برنامه‌ی مخرب اجازه می‌دهد تا یک فیلتر اینتنت را ثبت کند تا به جای برنامه‌ی مورد نظر، اینتنت را رهگیری کند.

بسته به محتوای هدف، مهاجمان می‌توانند اطلاعات حساس را بخوانند یا تغییر دهند یا با اشیاء قابل تغییر، مانند PendingIntents یا Binders قابل تغییر، تعامل داشته باشند.

ربودن یک هدف ضمنی همچنین می‌تواند به مهاجم اجازه دهد اقدامات دلخواهی مانند راه‌اندازی اجزای تحت کنترل مهاجم را انجام دهد.

تأثیر

اگر یک هدف ضمنی که داده‌های حساس را مدیریت می‌کند، یک توکن جلسه را در یک رشته URL اضافی برای باز کردن یک WebView ارسال کند، هر برنامه‌ای که فیلترهای هدف مناسب را مشخص می‌کند می‌تواند این توکن را بخواند. این می‌تواند به هر برنامه‌ای که به درستی پیکربندی شده است، اجازه دهد تا هدف را رهگیری کرده و داده‌های حساس درون آن را بخواند و به مهاجمان اجازه دهد داده‌هایی مانند PII یا توکن‌های جلسه را استخراج کنند.

کاهش‌ها

مگر اینکه برنامه به آن نیاز داشته باشد، با فراخوانی setPackage() اینتنت‌ها را صریح کنید. این کار به اینتنت اجازه می‌دهد تا فقط توسط یک جزء خاص (چه درون برنامه‌ای و چه از برنامه‌های دیگر) تفسیر شود و از رهگیری داده‌های ارسالی همراه با اینتنت توسط برنامه‌های غیرقابل اعتماد جلوگیری می‌کند. قطعه کد زیر نحوه صریح کردن یک اینتنت را نشان می‌دهد:

کاتلین

val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
    addCategory("android.intent.category.OPENABLE")
    setPackage("com.some.packagename")
    setType("*/*")
    putExtra("android.intent.extra.LOCAL_ONLY", true)
    putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)

جاوا

Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);

اگر نیاز به استفاده از intent های ضمنی دارید، هرگونه اطلاعات حساس یا اشیاء قابل تغییر را که نمی خواهید در معرض نمایش قرار دهید، حذف کنید. intent های ضمنی ممکن است زمانی مورد نیاز باشند که یک برنامه دانش دقیقی در مورد اینکه کدام برنامه عمل را حل خواهد کرد (مثلاً نوشتن ایمیل، گرفتن عکس و غیره) نداشته باشد.

منابع