اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
وضع الحماية للتطبيقات
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تستفيد منصة Android من الحماية المستندة إلى المستخدم في Linux لتحديد موارد التطبيقات وعزلتها. ويؤدي ذلك إلى عزل التطبيقات عن بعضها ويحمي التطبيقات والنظام من التطبيقات الضارة. ولإجراء ذلك، يخصّص نظام التشغيل Android
رقم تعريف مستخدم فريدًا (UID) لكل تطبيق Android ويشغّله في
عملية خاصة به.
يستخدم نظام التشغيل Android رقم التعريف المطلق لإعداد "وضع الحماية للتطبيقات" على مستوى النواة. يفرض ملف المعالجة الأساسية الأمان بين التطبيقات والنظام على مستوى العملية من خلال مرافق Linux العادية، مثل أرقام تعريف المستخدمين والمجموعات التي يتم إسنادها إلى التطبيقات. لا يمكن للتطبيقات التفاعل مع بعضها تلقائيًا، ويكون لديها إذن وصول محدود
إلى نظام التشغيل. إذا حاول التطبيق "أ" تنفيذ إجراء ضار، مثل قراءة
بيانات التطبيق "ب" أو الاتصال بالهاتف بدون إذن، سيتم منعه من
تنفيذ ذلك لأنّه لا يملك امتيازات المستخدم التلقائية المناسبة. إنّ
مساحة المحاكاة بسيطة ويمكن مراجعتها، وهي تستند إلى أسلوب UNIX القديم في
فصل المستخدمين عن العمليات وأذونات الملفات.
بما أنّ "حاجز التطبيقات" مضمّن في النواة، فإنّ نموذج الأمان هذا
يشمل كلّ من الرموز البرمجية الأصلية وتطبيقات نظام التشغيل. يتم تشغيل جميع البرامج فوق
النواة، مثل مكتبات نظام التشغيل وإطار عمل التطبيق ووقت تشغيل التطبيق
وجميع التطبيقات، داخل "وضع الحماية للتطبيقات". في بعض المنصّات، يقتصر المطوّرون على إطار عمل تطوير معيّن أو مجموعة من واجهات برمجة التطبيقات أو
لغة معيّنة. في نظام التشغيل Android، لا تُفرض أي قيود على كيفية كتابة التطبيق لفرض الأمان، وفي هذا الصدد، يتم وضع الرمز البرمجي الأصلي في مساحة مغلقة مثل الرمز البرمجي المُفترَض.
إجراءات الحماية
بشكل عام، للخروج من "وضع الحماية للتطبيقات" في جهاز تم ضبطه بشكل صحيح، يجب اختراق أمان نواة Linux. ومع ذلك، فإنّ وسائل الحماية الفردية التي تفرض بيئة التطبيق المُدمَجة ليست محصّنة تمامًا، تمامًا مثل ميزات الأمان الأخرى، لذا من المهم استخدام استراتيجية "الحماية الشاملة" لمنع هجمات تكنولوجيا المعلومات الفردية من التسبب في اختراق نظام التشغيل أو التطبيقات الأخرى.
يعتمد Android على عدد من إجراءات الحماية لفرض "وضع الحماية" في التطبيقات. تمّ تقديم إجراءات التنفيذ هذه بمرور الوقت، وساهمت في strengthening significantly the original UID-based discretionary access control
(DAC) sandbox. تضمّنت إصدارات 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، تتوفّر للتطبيقات طريقة عرض محدودة للملفّات في ملف DCIM، بدون إمكانية الوصول مباشرةً إلى مسارات مثل /sdcard/DCIM. ومع ذلك، تحتفظ التطبيقات
بإمكانية الوصول الكامل إلى المسارات الخاصة بحزمها، كما تظهر في أي methods
سارية، مثل Context.getExternalFilesDir().
إرشادات حول مشاركة الملفات
إنّ ضبط بيانات التطبيق على أنّها متاحة للجميع هو ممارسة أمنية سيئة. يتم منح إذن الوصول
لجميع المستخدمين، ولا يمكن حصر إذن الوصول بالمستقبلين المقصودين
فقط. وقد أدّت هذه الممارسة إلى تسرُّب معلومات واختلاط
بالثغرات الأمنية، وهي هدف مفضّل للبرامج الضارة التي تستهدف التطبيقات التي تتعلّق
ببيانات حسّاسة (مثل برامج البريد الإلكتروني). في الإصدار 9 من Android والإصدارات الأحدث، لا يُسمح صراحةً بمشاركة
الملفات بهذه الطريقة للتطبيقات التي تستخدم
targetSdkVersion>=28
.
بدلاً من إتاحة بيانات التطبيق للجميع، اتّبِع الإرشادات التالية عند مشاركة الملفات:
- إذا كان تطبيقك يحتاج إلى مشاركة الملفات مع تطبيق آخر، استخدِم
فئة ContentProvider. يشارك موفّرو المحتوى البيانات بالدقة المناسبة
وبدون السلبيات العديدة لأذونات UNIX التي يمكن للجميع الوصول إليها (للحصول على
التفاصيل، يُرجى الاطّلاع على
أساسيات موفّري المحتوى).
- إذا كان تطبيقك يتضمّن ملفات يجب أن يتمكن الجميع من الوصول إليها
(مثل الصور)، يجب أن تكون ملفات خاصة بالوسائط (الصور والفيديوهات والملفات الصوتية
فقط) وأن يتم تخزينها باستخدام فئة
MediaStore. (لمزيد من التفاصيل حول كيفية إضافة ملف وسائط، يُرجى الاطّلاع على مقالة
الوصول إلى ملفات الوسائط من مساحة تخزين مشتركة.)
يتحكّم إذن التشغيل مساحة التخزين في الوصول
إلى المجموعات ذات النوع المحدد بدقة من خلال MediaStore.
للوصول إلى الملفات ذات النوع غير المحدد بدقة، مثل ملفات PDF وفئتها MediaStore.Downloads، يجب أن تستخدم التطبيقات
المهام مثل مهمة ACTION_OPEN_DOCUMENT
.
لتفعيل سلوك Android 10، استخدِم سمة
requestLegacyExternalStorage
manifest
واتّبِع أفضل الممارسات المتعلّقة بأذونات التطبيقات.
- القيمة التلقائية لعلامة البيان هي
true
لتطبيقات
التي تستهدف الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم.
- القيمة التلقائية هي false للتطبيقات التي تستهدف الإصدار 10 من Android. لإيقاف عرض مساحة التخزين المنفلت
مؤقتًا في التطبيقات التي تستهدف الإصدار 10 من Android،
اضبط قيمة علامة البيان على
true
.
- باستخدام الأذونات المحظورة، يضيف مثبّت التطبيق التطبيقات المُسموحة لوحدة التخزين غير المحمية ببيئة معزولة إلى القائمة المسموح بها. يتم وضع التطبيقات غير المدرَجة في القائمة المسموح بها في بيئة معزولة.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Application Sandbox\n\nThe Android platform takes advantage of the Linux user-based protection to\nidentify and isolate app resources. This isolates apps from each other and\nprotects apps and the system from malicious apps. To do this, Android assigns a\nunique user ID (UID) to each Android app and runs it in its own\nprocess.\n\nAndroid uses the UID to set up a kernel-level Application Sandbox. The\nkernel enforces security between apps and the system at the process level\nthrough standard Linux facilities such as user and group IDs that are assigned\nto apps. By default, apps can't interact with each other and have limited\naccess to the OS. If app A tries to do something malicious, such as read\napp B's data or dial the phone without permission, it's prevented from\ndoing so because it doesn't have the appropriate default user privileges. The\nsandbox is simple, auditable, and based on decades-old UNIX-style user\nseparation of processes and file permissions.\n\nBecause the Application Sandbox is in the kernel, this security model\nextends to both native code and OS apps. All of the software above the\nkernel, such as OS libraries, app framework, app runtime, and\nall apps, run within the Application Sandbox. On some platforms,\ndevelopers are constrained to a specific development framework, set of APIs, or\nlanguage. On Android, there are no restrictions on how an app can be\nwritten that are required to enforce security; in this respect, native code is\nas sandboxed as interpreted code.\n\nProtections\n-----------\n\n\nGenerally, to break out of the Application Sandbox in a properly configured\ndevice, one must compromise the security of the Linux kernel. However, similar\nto other security features, individual protections enforcing the app\nsandbox are not invulnerable, so defense-in-depth is important to prevent\nsingle vulnerabilities from leading to compromise of the OS or other apps.\n\n\nAndroid relies on a number of protections to enforce the app\nsandbox. These enforcements have been introduced over time and have\nsignificantly strengthened the original UID-based discretionary access control\n(DAC) sandbox. Previous Android releases included the following\nprotections:\n\n- In Android 5.0, SELinux provided mandatory access control (MAC) separation between the system and apps. However, all third-party apps ran within the same SELinux context so inter-app isolation was primarily enforced by UID DAC.\n- In Android 6.0, the SELinux sandbox was extended to isolate apps across the per-physical-user boundary. In addition, Android also set safer defaults for app data: For apps with `targetSdkVersion \u003e= 24`, default DAC permissions on an app's home dir changed from 751 to 700. This provided safer default for private app data (although apps can override these defaults).\n- In Android 8.0, all apps were set to run with a `seccomp-bpf` filter that limited the syscalls that apps were allowed to use, thus strengthening the app/kernel boundary.\n- In Android 9 all nonprivileged apps with `targetSdkVersion \u003e=\n 28` must run in individual SELinux sandboxes, providing MAC on a per-app basis. This protection improves app separation, prevents overriding safe defaults, and (most significantly) prevents apps from making their data world accessible.\n- In Android 10 apps have a limited raw view of the filesystem, with no direct access to paths like /sdcard/DCIM. However, apps retain full raw access to their package-specific paths, as returned by any applicable methods, such as [Context.getExternalFilesDir()](https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(jav%20a.lang.String)).\n\nGuidelines for sharing files\n----------------------------\n\nSetting app data as world accessible is a poor security practice. Access\nis granted to everyone and it's not possible to limit access to only the intended\nrecipient(s). This practice has led to information disclosure leaks and confused\ndeputy vulnerabilities, and is a favorite target for malware that targets apps\nwith sensitive data (such as email clients). In Android 9 and higher, sharing\nfiles this way is explicitly disallowed for apps with\n`targetSdkVersion\u003e=28`.\n\n\nInstead of making app data world-accessible, use the following guidelines\nwhen sharing files:\n\n- If your app needs to share files with another app, use a [content provider](https://developer.android.com/guide/topics/providers/content-provider-basics.html). Content providers share data with the proper granularity and without the many downsides of world-accessible UNIX permissions (for details, refer to [Content provider basics](https://developer.android.com/guide/topics/providers/content-provider-basics.html)).\n- If your app has files that genuinely should be accessible to the world (such as photos), they must be media-specific (photos, videos, and audio files only) and stored using the [MediaStore](https://developer.android.com/reference/android/provider/MediaStore) class. (For more details on how to add a media item, see [Access media files from shared storage](https://developer.android.com/training/data-storage/shared/media#add-item).)\n\nThe **Storage** runtime permission controls access\nto strongly-typed collections through **MediaStore** .\nFor accessing weakly typed files such as PDFs and the [MediaStore.Downloads](https://developer.android.com/reference/android/provider/MediaStore.Downloads) class, apps must use\nintents like the [`ACTION_OPEN_DOCUMENT`](https://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT) intent.\n\nTo enable Android 10 behavior, use the\n[requestLegacyExternalStorage](https://developer.android.com/training/data-storage/files/external-scoped#opt-out-of-%20filtered-view) manifest\nattribute, and follow [App permissions best practices](https://developer.android.com/training/permissions/usage-notes).\n\n- The manifest flag default value is `true` for apps targeting Android 9 and lower.\n- The default value is false for apps targeting Android 10. To temporarily opt out of the filtered storage view in apps targeting Android 10, set the manifest flag's value to `true`.\n- Using restricted permissions, the installer allowlists apps permitted for nonsandboxed storage. Nonallowlisted apps are sandboxed."]]