وضع الحماية للتطبيقات

يستفيد نظام Android الأساسي من الحماية القائمة على المستخدم في Linux تحديد موارد التطبيق وعزلها. ويؤدي ذلك إلى عزل التطبيقات عن بعضها ويحمي التطبيقات والنظام من التطبيقات الضارة. ولإجراء ذلك، يخصّص نظام التشغيل Android رقم تعريف مستخدم فريدًا (UID) لكل تطبيق Android ويشغّله في عملية خاصة به.

يستخدم Android رقم التعريف المطلق لإعداد "وضع الحماية للتطبيقات" على مستوى النواة. يفرض ملف المعالجة الأساسية الأمان بين التطبيقات والنظام على مستوى العملية من خلال مرافق Linux العادية، مثل أرقام تعريف المستخدمين والمجموعات التي يتم إسنادها إلى التطبيقات. بشكل تلقائي، لا يمكن للتطبيقات التفاعل مع بعضها البعض، ويتم فرض قيود الوصول إلى نظام التشغيل. إذا حاول التطبيق "أ" تنفيذ إجراء ضار، مثل قراءة بيانات التطبيق "ب" أو الاتصال بالهاتف بدون إذن، سيتم منعه من تنفيذ ذلك لأنّه لا يملك امتيازات المستخدم التلقائية المناسبة. إنّ المساحة الرملية بسيطة ويمكن مراجعتها، وهي تستند إلى أسلوب UNIX القديم في فصل المستخدمين عن العمليات وأذونات الملفات.

بما أنّ "حاجز التطبيقات" مضمّن في النواة، فإنّ نموذج الأمان هذا يشمل كلّ من الرموز البرمجية الأصلية وتطبيقات نظام التشغيل. يتم تشغيل جميع البرامج فوق النواة، مثل مكتبات نظام التشغيل وإطار عمل التطبيق ووقت تشغيل التطبيق وجميع التطبيقات، داخل "وضع الحماية للتطبيقات". في بعض المنصّات، يقتصر المطوّرون على إطار عمل تطوير معيّن أو مجموعة من واجهات برمجة التطبيقات أو لغة معيّنة. في نظام التشغيل Android، لا تُفرض أي قيود على كيفية كتابة التطبيق لفرض الأمان، وفي هذا الصدد، يتم وضع الرمز البرمجي الأصلي في مساحة مغلقة مثل الرمز البرمجي الذي يتم تفسيره.

إجراءات الحماية

بشكل عام، للخروج من "وضع الحماية للتطبيقات" في جهاز تم ضبطه بشكل صحيح، يجب اختراق أمان نواة Linux. ومع ذلك، بميزات الأمان الأخرى، وإجراءات الحماية الفردية التي تفرض استخدام التطبيق وضع الحماية ليس معرَّضًا للخطر، لذا من المهم الدفاع بعمق لمنع ثغرات أمنية فردية من شأنها أن تؤدي إلى اختراق نظام التشغيل أو التطبيقات الأخرى.

يعتمد Android على عدد من إجراءات الحماية لفرض "وضع الحماية" للتطبيقات. وقد تم تطبيق إجراءات التنفيذ هذه بمرور الوقت، تم إجراء تحسينات كبيرة على التحكُّم في الوصول التقديري الأصلي المستند إلى المعرف الفريد وضع الحماية (DAC) تضمّنت إصدارات Android السابقة ما يلي: وسائل الحماية:

  • في نظام التشغيل Android 5.0، وفّر SELinux ميزة التحكّم الإلزامي في الوصول (MAC) بين النظام والتطبيقات. ومع ذلك، كان يتم تشغيل جميع التطبيقات التابعة لجهات خارجية ضمن سياق SELinux، ولذلك تم فرض العزل بين التطبيقات بشكل أساسي من خلال UID DAC.
  • في نظام التشغيل Android 6.0، تم توسيع وضع الحماية SELinux لعزل التطبيقات عبر لكل مستخدم ماديًا. بالإضافة إلى ذلك، يعيّن Android أيضًا إعدادات افتراضية أكثر أمانًا بيانات التطبيق: للتطبيقات التي تتضمّن targetSdkVersion >= 24، الإعداد التلقائي تم تغيير أذونات DAC على التطبيق الرئيسي للتطبيق من 751 إلى 700. تم توفير هذه المعلومات الإعداد التلقائي الأكثر أمانًا لبيانات التطبيقات الخاصة (رغم أنّ التطبيقات يمكنها تجاوز هذه الافتراضية).
  • في الإصدار 8.0 من نظام التشغيل Android، تم ضبط جميع التطبيقات لتعمل باستخدام seccomp-bpf فلتر يحدّ من طلبات نظام التشغيل التي يُسمح للتطبيقات باستخدامها، وبالتالي تعزيز حدود التطبيق/النواة.
  • في Android 9، يجب تشغيل جميع التطبيقات غير المميّزة التي تتضمّن targetSdkVersion >= 28 في قيود حماية فردية في SELinux، ما يوفر إمكانية الوصول إلى MAC على أساس كل تطبيق . تعمل هذه الحماية على تحسين عملية فصل التطبيقات، ومنع إلغاء الإعدادات التلقائية الآمنة، و(الأهم من ذلك) منع التطبيقات من إتاحة الوصول إلى بياناتها على مستوى العالم.
  • في Android 10، يكون للتطبيقات طريقة عرض أولية محدودة مع عدم إمكانية الوصول المباشر إلى مسارات مثل /sdcard/DCIM. في المقابل، تطبيقات الاحتفاظ بإمكانية الوصول الأولي الكامل إلى المسارات الخاصة بالحزمة، كما يعرضها أي الطرق السارية، مثل Context.getExternalFilesDir().

إرشادات حول مشاركة الملفات

يعتبر ضبط بيانات التطبيقات بحيث يمكن الوصول إليها على مستوى العالم ممارسة أمنية سيئة. يتم منح إذن الوصول للجميع ولا يمكن حصر إذن الوصول بالمستلمين المقصودين فقط. وقد أدّت هذه الممارسة إلى تسرُّب معلومات واختلاط بالثغرات الأمنية، وهي هدف مفضّل للبرامج الضارة التي تستهدف التطبيقات التي تحتوي على بيانات حسّاسة (مثل برامج البريد الإلكتروني). في الإصدار 9 من Android والإصدارات الأحدث، لا يُسمح صراحةً بمشاركة الملفات بهذه الطريقة للتطبيقات التي تملك targetSdkVersion>=28.

بدلاً من إتاحة الوصول إلى بيانات التطبيق على مستوى العالم، استخدِم الإرشادات التالية: عند مشاركة الملفات:

  • إذا كان تطبيقك يحتاج إلى مشاركة الملفات مع تطبيق آخر، استخدِم المحتوى. يشارك مقدّمو المحتوى البيانات بالدقة المناسبة بدون السلبيات العديدة لأذونات UNIX المتاحة للجميع (للحصول على التفاصيل، يُرجى الاطّلاع على أساسيات مقدّمي المحتوى).
  • إذا كان تطبيقك يتضمّن ملفات يجب أن يتمكن الجميع من الوصول إليها (مثل الصور)، يجب أن تكون ملفات خاصة بالوسائط (الصور والفيديوهات والملفات الصوتية فقط) وأن يتم تخزينها باستخدام فئة MediaStore. (لمزيد من التفاصيل حول كيفية إضافة ملف وسائط، يُرجى الاطّلاع على مقالة الوصول إلى ملفات الوسائط من مساحة تخزين مشتركة.)

يتحكّم إذن التشغيل مساحة التخزين في الوصول إلى المجموعات ذات النوع المحدد بدقة من خلال MediaStore. للوصول إلى الملفات المكتوبة بطريقة ضعيفة، مثل ملفات PDF وفئة MediaStore.Downloads، يجب أن تستخدم التطبيقات أغراض مثل هدف ACTION_OPEN_DOCUMENT.

لتفعيل سلوك Android 10، استخدِم بيان requestLegacyExternalStorage واتّبِع أفضل الممارسات المتعلقة بأذونات التطبيقات.

  • القيمة التلقائية لعلامة البيان هي true لتطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android (أو الإصدارات الأقدم).
  • القيمة التلقائية هي false للتطبيقات التي تستهدف الإصدار 10 من Android. لإيقاف مؤقتًا عرض مساحة التخزين التي تمّت فلترتها في التطبيقات التي تستهدف الإصدار 10 من Android، اضبط قيمة علامة البيان على true.
  • باستخدام الأذونات المحظورة، يضيف مثبّت التطبيق التطبيقات المُسموحة لوحدة التخزين غير المحمية ببيئة معزولة إلى القائمة المسموح بها. التطبيقات غير المُدرَجة في القائمة المسموح بها هي وضع الحماية.