لینوکس با امنیت بالا در اندروید

به عنوان بخشی از مدل امنیتی اندروید، اندروید از لینوکس تقویت‌شده با امنیت (SELinux) برای اعمال کنترل دسترسی اجباری (MAC) بر روی همه فرآیندها، حتی فرآیندهایی که با امتیازات روت/ابر کاربر (قابلیت‌های لینوکس) اجرا می‌شوند، استفاده می‌کند. بسیاری از شرکت‌ها و سازمان‌ها در پیاده‌سازی SELinux اندروید مشارکت داشته‌اند. با SELinux، اندروید می‌تواند بهتر از خدمات سیستم محافظت و محدود کند، دسترسی به داده‌های برنامه و گزارش‌های سیستم را کنترل کند، اثرات نرم‌افزارهای مخرب را کاهش دهد و از کاربران در برابر نقص‌های احتمالی در کد دستگاه‌های تلفن همراه محافظت کند.

SELinux بر اساس اصل انکار پیش فرض عمل می کند: هر چیزی که به صراحت مجاز نباشد رد می شود. SELinux می تواند در دو حالت جهانی کار کند:

  • حالت مجاز ، که در آن رد مجوز ثبت می شود اما اجرا نمی شود.
  • حالت اجرایی ، که در آن رد مجوزها هم ثبت و هم اجرا می‌شوند.

اندروید شامل SELinux در حالت اعمال و یک خط مشی امنیتی مربوطه است که به طور پیش فرض در سراسر AOSP کار می کند. در حالت اجباری، از اقدامات غیرمجاز جلوگیری می‌شود و تمام تخلفات تلاش شده توسط هسته در dmesg و logcat ثبت می‌شوند. هنگام توسعه، باید از این خطاها برای اصلاح نرم‌افزار و سیاست‌های SELinux قبل از اجرای آنها استفاده کنید. برای جزئیات بیشتر، به پیاده سازی SELinux مراجعه کنید.

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

زمینه

مدل امنیتی اندروید تا حدی بر مفهوم جعبه‌های ایمنی برنامه‌ها استوار است. هر برنامه در جعبه شنی مخصوص به خود اجرا می شود. قبل از اندروید 4.3، این sandboxها با ایجاد یک UID لینوکس منحصر به فرد برای هر برنامه در زمان نصب تعریف می شدند. اندروید 4.3 و بالاتر از SELinux برای تعریف بیشتر مرزهای جعبه ایمنی برنامه اندروید استفاده می کند.

در اندروید 5.0 و جدیدتر، SELinux به طور کامل اجرا می‌شود که مبتنی بر انتشار آسان اندروید 4.3 و اجرای جزئی اندروید 4.4 است. با این تغییر، اندروید از اجرای مجموعه محدودی از دامنه های حیاتی ( installd شده، zygote ، netd و vold ) به همه چیز (بیش از 60 دامنه) تغییر مکان داد. به طور مشخص:

  • همه چیز در اندروید 5.x و بالاتر در حالت اعمال است.
  • هیچ فرآیند دیگری به جز init نباید در دامنه init اجرا شود.
  • هر گونه انکار عمومی (برای block_device ، socket_device ، default_service ) نشان می دهد که دستگاه به یک دامنه خاص نیاز دارد.

Android 6.0 سیستم را با کاهش سهل‌انگاری خط‌مشی ما سخت‌تر کرد تا شامل ایزوله‌سازی بهتر بین کاربران، فیلتر IOCTL، کاهش خطر سرویس‌های در معرض خطر، سخت‌تر شدن بیشتر دامنه‌های SELinux و دسترسی بسیار محدود به /proc باشد.

Android 7.0 پیکربندی SELinux را برای قفل کردن بیشتر سندباکس برنامه و کاهش سطح حمله به روز کرد. این نسخه همچنین پشته مدیا سرور یکپارچه را به فرآیندهای کوچکتر تقسیم کرد تا دامنه مجوزهای آنها کاهش یابد. برای جزئیات بیشتر، به محافظت از اندروید با دفاع بیشتر هسته لینوکس و سخت کردن پشته رسانه مراجعه کنید.

Android 8.0 SELinux را برای کار با Treble به روز کرد که کد فروشنده سطح پایین را از چارچوب سیستم Android جدا می کند. این نسخه خط‌مشی SELinux را به‌روزرسانی کرد تا به سازندگان دستگاه و فروشندگان SOC اجازه دهد بخش‌های خط‌مشی خود را به‌روزرسانی کنند، تصاویر خود را بسازند ( vendor.img ، boot.img ، و غیره)، سپس آن تصاویر را مستقل از پلتفرم به‌روزرسانی کنند یا برعکس.

در حالی که ممکن است نسخه (فریم ورک) بالاتر/جدیدتر در دستگاه اجرا شود، حالت مخالف پشتیبانی نمی شود. تصاویر فروشنده ( vendor.img/odm.img ) نمی توانند نسخه جدیدتری نسبت به پلتفرم ( system.img ) داشته باشند. بنابراین، یک نسخه پلتفرم جدیدتر ممکن است مشکلات سازگاری SELinux را ایجاد کند زیرا خط مشی پلتفرم SELinux در نسخه جدیدتر از بخش های SELinux فروشنده این خط مشی است. مدل Android 8.0 روشی را برای حفظ سازگاری برای جلوگیری از OTAهای غیرضروری ارائه می دهد.

منابع اضافی

برای کمک به ایجاد خط مشی های مفید SELinux، به منابع زیر مراجعه کنید. برخی از مفاهیم SELinux توسط Android استفاده نمی شوند، هنگام در نظر گرفتن اسناد خارجی به بخش Specificity مراجعه کنید.