پلتفرم اندروید از محافظت مبتنی بر کاربر لینوکس برای شناسایی و جداسازی منابع برنامه بهره می برد. این برنامه ها را از یکدیگر جدا می کند و از برنامه ها و سیستم در برابر برنامه های مخرب محافظت می کند. برای انجام این کار، اندروید یک شناسه کاربری (UID) منحصر به فرد را به هر برنامه اندروید اختصاص می دهد و آن را در فرآیند خودش اجرا می کند.
Android از UID برای راه اندازی یک Application Sandbox در سطح هسته استفاده می کند. هسته امنیت بین برنامهها و سیستم را در سطح فرآیند از طریق امکانات استاندارد لینوکس مانند شناسههای کاربر و گروهی که به برنامهها تخصیص داده میشود، اعمال میکند. به طور پیش فرض، برنامه ها نمی توانند با یکدیگر تعامل داشته باشند و دسترسی محدودی به سیستم عامل دارند. اگر برنامه A سعی کند کار مخربی انجام دهد، مانند خواندن داده های برنامه B یا شماره گیری تلفن بدون اجازه، از انجام این کار جلوگیری می شود زیرا دارای امتیازات پیش فرض کاربر مناسب نیست. سندباکس ساده، قابل ممیزی است و بر اساس چندین دهه جداسازی کاربر به سبک یونیکس از فرآیندها و مجوزهای فایل است.
از آنجایی که Application Sandbox در هسته قرار دارد، این مدل امنیتی هم به کدهای بومی و هم برنامه های سیستم عامل گسترش می یابد. همه نرم افزارهای بالای هسته، مانند کتابخانه های سیستم عامل، چارچوب برنامه، زمان اجرای برنامه و همه برنامه ها در Application Sandbox اجرا می شوند. در برخی از پلتفرمها، توسعهدهندگان به یک چارچوب توسعه خاص، مجموعهای از APIها یا زبان محدود میشوند. در اندروید، هیچ محدودیتی در مورد نحوه نوشتن یک برنامه وجود ندارد که برای اجرای امنیت لازم است. از این نظر، کد بومی به اندازه کد تفسیر شده جعبهبندی شده است.
حفاظت ها
به طور کلی، برای خارج شدن از Application Sandbox در دستگاهی که به درستی پیکربندی شده است، باید امنیت هسته لینوکس را به خطر انداخت. با این حال، مانند سایر ویژگیهای امنیتی، حفاظتهای فردی که جعبه ایمنی برنامه را اعمال میکنند، آسیبناپذیر نیستند، بنابراین دفاع عمیق برای جلوگیری از آسیبپذیریهای منفرد از به خطر افتادن سیستمعامل یا سایر برنامهها مهم است.
اندروید برای اجرای سندباکس برنامه به تعدادی حفاظت متکی است. این اعمال در طول زمان معرفی شده اند و به طور قابل توجهی جعبه ایمنی کنترل دسترسی اختیاری مبتنی بر UID (DAC) را تقویت کرده اند. نسخه های قبلی اندروید شامل محافظت های زیر بود:
- در اندروید 5.0، SELinux جداسازی اجباری کنترل دسترسی (MAC) را بین سیستم و برنامهها فراهم کرد. با این حال، همه برنامههای شخص ثالث در یک زمینه SELinux اجرا میشدند، بنابراین جداسازی بین برنامهای عمدتاً توسط UID DAC اعمال شد.
- در اندروید 6.0، جعبه شنی SELinux برای ایزوله کردن برنامهها در سراسر مرز فیزیکی هر کاربر گسترش یافت. علاوه بر این، Android پیشفرضهای ایمنتری را برای دادههای برنامه تنظیم میکند: برای برنامههای دارای
targetSdkVersion >= 24
، مجوزهای پیشفرض DAC در صفحه اصلی برنامه از 751 به 700 تغییر کرد. این پیشفرض پیشفرض امنتری را برای دادههای برنامه خصوصی ارائه میکند (اگرچه برنامهها میتوانند این پیشفرضها را لغو کنند) . - در اندروید 8.0، همه برنامهها با فیلتر
seccomp-bpf
اجرا میشدند که سیستمهای سیستمی را که برنامهها مجاز به استفاده از آنها بودند محدود میکرد، بنابراین مرز برنامه/کرنل را تقویت میکرد. - در Android 9 همه برنامههای غیرمجاز با
targetSdkVersion >= 28
باید در جعبههای sandbox SELinux جداگانه اجرا شوند و MAC را بر اساس هر برنامه ارائه کنند. این محافظت جداسازی برنامهها را بهبود میبخشد، از نادیده گرفتن پیشفرضهای ایمن جلوگیری میکند و (بهطور قابل توجهی) از دسترسی برنامهها به دنیای دادههایشان جلوگیری میکند. - در اندروید 10، برنامهها دید خام محدودی از سیستم فایل دارند، بدون دسترسی مستقیم به مسیرهایی مانند /sdcard/DCIM. با این حال، برنامهها دسترسی خام کامل به مسیرهای بسته خاص خود را حفظ میکنند، همانطور که با هر روش قابل اجرا، مانند Context.getExternalFilesDir() بازگردانده میشوند.
راهنمایی برای اشتراک گذاری فایل ها
تنظیم دادههای برنامه بهعنوان قابل دسترسی جهانی، یک عمل امنیتی ضعیف است. دسترسی به همه اعطا می شود و نمی توان دسترسی را فقط به گیرنده(های) مورد نظر محدود کرد. این عمل منجر به افشای اطلاعات و آسیبپذیریهای گیجشده معاون شده است و هدف مورد علاقه بدافزارهایی است که برنامههایی را با دادههای حساس (مانند کلاینتهای ایمیل) هدف قرار میدهند. در اندروید 9 و بالاتر، اشتراکگذاری فایلها به این روش برای برنامههای دارای targetSdkVersion>=28
به صراحت مجاز نیست.
به جای اینکه داده های برنامه را در دسترس جهانی قرار دهید، هنگام به اشتراک گذاری فایل ها از دستورالعمل های زیر استفاده کنید:
- اگر برنامه شما نیاز به اشتراک گذاری فایل ها با برنامه دیگری دارد، از یک ارائه دهنده محتوا استفاده کنید. ارائهدهندگان محتوا دادهها را با جزئیات مناسب و بدون جنبههای منفی بسیاری از مجوزهای یونیکس در دسترس جهان به اشتراک میگذارند (برای جزئیات، به اصول ارائهدهنده محتوا مراجعه کنید).
- اگر برنامه شما فایلهایی دارد که واقعاً باید در دسترس جهانیان باشد (مانند عکسها)، آنها باید مختص رسانه باشند (فقط عکسها، ویدیوها و فایلهای صوتی) و با استفاده از کلاس MediaStore ذخیره شوند. (برای جزئیات بیشتر در مورد نحوه افزودن یک مورد رسانه، به دسترسی به فایلهای رسانه از فضای ذخیرهسازی مشترک مراجعه کنید.)
مجوز زمان اجرا Storage دسترسی به مجموعههای با تایپ قوی را از طریق MediaStore کنترل میکند. برای دسترسی به فایلهایی با تایپ ضعیف مانند PDF و کلاس MediaStore.Downloads ، برنامهها باید از هدفهایی مانند هدف ACTION_OPEN_DOCUMENT
استفاده کنند.
برای فعال کردن رفتار Android 10، از ویژگی مانیفست requestLegacyExternalStorage
استفاده کنید و بهترین شیوههای مجوزهای برنامه را دنبال کنید.
- مقدار پیشفرض پرچم مانیفست برای برنامههایی که اندروید 9 (و پایینتر) را هدف قرار میدهند
true
است. - مقدار پیشفرض برای برنامههایی که Android 10 را هدف قرار میدهند نادرست است. برای انصراف موقت از نمای فضای ذخیرهسازی فیلتر شده در برنامههایی که Android 10 را هدف قرار میدهند، مقدار پرچم مانیفست را روی
true
تنظیم کنید. - نصبکننده با استفاده از مجوزهای محدود، برنامههای مجاز را برای ذخیرهسازی غیرباکسدار فهرستبندی میکند. برنامه های غیر مجاز در جعبه ایمنی قرار دارند.