لتحسين أمان الجهاز، يقسّم نظام التشغيل Android 7.0 عملية
mediaserver
المتكاملة إلى عمليات متعددة تتضمّن أذونات و
إمكانات تقتصر على تلك المطلوبة لكل عملية. تعمل هذه التغييرات على تقليل الثغرات الأمنية في إطار عمل الوسائط من خلال:
- تقسيم مكوّنات مسار معالجة الفيديوهات في الوقت الفعلي إلى عمليات في مساحة مغلقة خاصة بالتطبيق
- تفعيل مكونات الوسائط القابلة للتحديث (المستخرجات وبرامج الترميز وما إلى ذلك)
تعمل هذه التغييرات أيضًا على تحسين أمان المستخدمين النهائيين من خلال الحد بشكل كبير من شدة معظم الثغرات الأمنية المتعلّقة بالوسائط، ما يحافظ على أمان أجهزة المستخدمين النهائيين وبياناتهم.
على المصنّعين الأصليّين للأجهزة ومورّدي شرائح المعالجة المتقدّمة (SoC) تعديل التغييرات في HAL والإطار الأساسي لجعلها
متوافقة مع البنية الجديدة. على وجه التحديد، لأنّ رمز Android الذي يقدّمه المورّد يفترض غالبًا أنّ كل شيء يتم تشغيله في العملية نفسها، على المورّدين تعديل رمزهم لتوزيع الأسماء المعرِّفة الأصلية (native_handle
) التي لها معنى في جميع العمليات. للحصول على مرجع لتنفيذ التغييرات
المرتبطة بتقوية الوسائط، يُرجى الرجوع إلى frameworks/av
و
frameworks/native
.
التغييرات المعمارية
كانت الإصدارات السابقة من Android تستخدم عملية واحدة موحّدة
mediaserver
تمتلك أذونات كثيرة جدًا (الوصول إلى الكاميرا،
الوصول إلى الصوت، والوصول إلى برنامج تشغيل الفيديو، والوصول إلى الملفات، والوصول إلى الشبكة، وما إلى ذلك). يقسّم الإصدار
7.0 من Android عملية mediaserver
إلى عدة عمليات جديدة تتطلب كلّ واحدة منها مجموعة أصغر بكثير من الأذونات:
الشكل 1: تغييرات في البنية لتعزيز أمان mediaserver
تضمن هذه البنية الجديدة عدم تمكّن الرمز الضار من الوصول إلى المجموعة الكاملة من الأذونات التي كانت مملوكة سابقًا لـ mediaserver
، حتى في حال اختراق إحدى العمليات. يتم حظر العمليات من خلال سياسات SElinux وseccomp.
ملاحظة: بسبب الاعتماد على المورّدين، تظل بعض برامج الترميز
تُشغَّل في mediaserver
، وبالتالي تمنح
mediaserver
أذونات أكثر من اللازم. على وجه التحديد، سيستمر تشغيل Widevine
Classic في mediaserver
لنظام التشغيل Android 7.0.
تغييرات MediaServer
في Android 7.0، تكون عملية mediaserver
متوفّرة لتشغيل
المحتوى وتسجيله، مثل تمرير ذاكرة التخزين المؤقت ومزامنتها بين
المكوّنات والعمليات. تتواصل العمليات من خلال آلية Binder
المعيار.
في جلسة تشغيل ملف محلي عادية، يُرسِل التطبيق وصفًا (FD) للملف إلى mediaserver
(عادةً من خلال واجهة برمجة التطبيقات MediaPlayer Java)، ويقوم mediaserver
بما يلي:
- لفّ FD في كائن DataSource من Binder يتم تمريره إلى عملية
المستخرج التي تستخدمه للقراءة من الملف باستخدام Binder IPC (لا يحصل
mediaextractor على FD، ولكنه بدلاً من ذلك يُجري مكالمات Binder إلى
mediaserver
للحصول على البيانات). - يفحص الملف، وينشئ أداة الاستخراج المناسبة لنوع الملف
(مثل MP3Extractor أو MPEG4Extractor)، ويعرض واجهة Binder لأداة
الاستخراج في عملية
mediaserver
. - يُجري Binder IPC مكالمات إلى أداة الاستخراج لتحديد نوع البيانات في الملف (مثل بيانات MP3 أو H.264).
- طلبات إلى عملية
mediacodec
لإنشاء برامج ترميز من النوع المطلوب، وتتلقّى واجهات Binder لهذه برامج الترميز - يُجري عمليات اتصال Binder IPC متكررة مع أداة الاستخراج لقراءة عيّنات مُشفَّرة، ويستخدم Binder IPC لإرسال البيانات المشفَّرة إلى عملية
mediacodec
لفك التشفير، ويتلقّى البيانات التي تم فك تشفيرها.
في بعض حالات الاستخدام، لا يتم استخدام برنامج ترميز (مثل التشغيل الذي يتم نقله إلى جهاز آخر حيث يتم إرسال البيانات المشفَّرة مباشرةً إلى جهاز الإخراج)، أو قد يعرض برنامج الترميز البيانات التي تم فك تشفيرها مباشرةً بدلاً من عرض ذاكرة تخزين مؤقت للبيانات التي تم فك تشفيرها (تشغيل الفيديو).
التغييرات في MediaCodecService
وتوفر خدمة الترميز برامج الترميز وفك الترميز. بسبب تبعية المورّد، لا تتوفّر بعض برامج الترميز في عملية ترميز الفيديو بعد. في Android 7.0:
- إنّ برامج الترميز وبرامج فك التشفير غير الآمنة تكون موجودة في عملية ترميز الفيديو.
- يمكن العثور على برامج الترميز وفك الترميز الآمنة في
mediaserver
(لم يتغيّر).
يطلب التطبيق (أو mediaserver
) عملية ترميز لإنشاء ترميز من نوعه المطلوب، ثم يطلب هذا الترميز لتمرير البيانات المشفَّرة واسترداد البيانات المشفَّرة (للترميز) أو لتمرير البيانات المشفَّرة واسترداد البيانات المشفَّرة (للترميز). يستخدم نقل البيانات إلى برامج الترميز ومنها ذاكرة مشترَكة، لذا
لم تتغيّر هذه العملية.
تغييرات MediaDrmServer
يتم استخدام خادم إدارة الحقوق الرقمية عند تشغيل محتوى محمي بموجب إدارة الحقوق الرقمية، مثل الأفلام في أفلام Google Play. وتتولى هذه الخدمة فك تشفير البيانات المشفّرة بطريقة آمنة، وبالتالي يمكنها الوصول إلى تخزين الشهادات والمفاتيح وغيرها من المكونات الحسّاسة. بسبب الاعتماد على المورّدين، لا يتم استخدام عملية إدارة الحقوق الرقمية في جميع الحالات حتى الآن.
تغييرات في AudioServer
تستضيف عملية AudioServer المكوّنات ذات الصلة بالصوت، مثل إدخال ملف صوتي وإخراجه، وخدمة policymanager التي تحدّد توجيه الصوت، وخدمة راديو FM. لمعرفة تفاصيل عن التغييرات في المحتوى الصوتي وإرشادات التنفيذ، يُرجى الاطّلاع على مقالة تنفيذ المحتوى الصوتي.
تغييرات في CameraServer
يتحكّم CameraServer في الكاميرا ويُستخدَم عند تسجيل الفيديو للحصول على لقطات الفيديو من الكاميرا ثم تمريرها إلى mediaserver
لإجراء المزيد من المعالجة. لمعرفة تفاصيل التغييرات وإرشادات التنفيذ المتعلّقة بتغييرات CameraServer، يُرجى الرجوع إلى مقالة تعزيز أمان إطار عمل الكاميرا.
التغييرات في ExtractorService
تستضيف خدمة المستخرج المستخرجات، وهي مكونات تُحلِّل
تنسيقات الملفات المختلفة المتوافقة مع إطار عمل الوسائط. خدمة الاستخراج هي
الخدمة التي تملك أقل امتيازات من بين جميع الخدمات، إذ لا يمكنها قراءة ملفات البيانات الوصفية، لذلك بدلاً من ذلك،
تُجري مكالمات إلى واجهة Binder (يقدّمها إليها
mediaserver for
كل جلسة تشغيل) للوصول إلى الملفات.
يُجري تطبيق (أو mediaserver
) مكالمة إلى عملية extractor
للحصول على IMediaExtractor
، ويُجري مكالمة إلى
IMediaExtractor
للحصول على IMediaSources
للأغنية
المضمّنة في الملف، ثم يُجري مكالمة إلى IMediaSources
لقراءة البيانات
منه.
لنقل البيانات بين العمليات، يُدرج التطبيق (أو
mediaserver
) البيانات في حزمة الردّ كجزء من معاملة
Binder أو يستخدم الذاكرة المشتركة:
- يتطلب استخدام الذاكرة المشتركة طلبًا إضافيًا من Binder لإطلاق الذاكرة المشتركة، ولكنه أسرع ويستهلك طاقة أقل في ذاكرة التخزين المؤقت الكبيرة.
- يتطلب استخدام in-Parcel عملية نسخ إضافية، ولكنه أسرع ويستهلك موارد أقل للمخازن المؤقتة التي يقل حجمها عن 64 كيلوبايت.
التنفيذ
لتسهيل نقل مكوّنات MediaDrm
وMediaCrypto
إلى عملية mediadrmserver
الجديدة، على المورّدين تغيير
طريقة تخصيص المخازن المؤقتة الآمنة للسماح بمشاركة المخازن المؤقتة بين
العمليات.
في إصدارات Android السابقة، يتم تخصيص وحدات تخزين مؤقتة آمنة في
mediaserver
بواسطة OMX::allocateBuffer
ويتم استخدامها أثناء
فك التشفير في العملية نفسها، كما هو موضّح أدناه:
الشكل 2: تخصيص ملف التخزين المؤقت في mediaserver على الإصدار 6.0 من نظام التشغيل Android والإصدارات الأقدم
في الإصدار 7.0 من نظام التشغيل Android، تم تغيير عملية تخصيص المخزن المؤقت إلى آلية جديدة
توفّر المرونة مع الحدّ من التأثير على عمليات التنفيذ
الحالية. باستخدام حِزم MediaDrm
وMediaCrypto
في عملية mediadrmserver
الجديدة، يتم تخصيص المخزن المؤقت
بشكل مختلف ويجب أن يعدّل المورّدون عناصر تحكّم المخزن المؤقت الآمن حتى يمكن نقلها عبر الرابط عندما يُطلِق MediaCodec
عملية فك تشفير
على MediaCrypto
.
الشكل 3: تخصيص ملف التخزين المؤقت في خادم الوسائط على الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث
استخدام الأسماء المعرِّفة المدمجة مع المحتوى
يجب أن تعرض الدالة OMX::allocateBuffer
مؤشرًا إلى بنية
native_handle
التي تحتوي على أوصاف الملفات (FD) و
بيانات عددية إضافية. توفّر native_handle
كل مزايا استخدام ملفات البيانات الوصفية، بما في ذلك إمكانية استخدام أداة الربط الحالية لتحويل البيانات إلى تنسيق سلسلة أو تحويلها من تنسيق سلسلة، مع السماح بمزيد من المرونة للمورّدين الذين لا يستخدمون حاليًا ملفات البيانات الوصفية.
استخدِم native_handle_create()
لتخصيص الاسم المعرِّف الأصلي.
يحصل رمز الإطار على ملكية native_handle
struct المخصّصة، وهو مسؤول عن تحرير الموارد في كلّ من العملية التي يتم فيها تخصيصnative_handle
في الأصل والعملية التي يتم فيها تحويلها إلى سلسلة. يُطلق إطار العمل الأسماء المعرِّفة الأصلية باستخدام native_handle_close()
متبوعًا بnative_handle_delete()
ويُسلسل/يفكّ سلسلة الرمز البرمجي native_handle
باستخدام Parcel::writeNativeHandle()/readNativeHandle()
.
يمكن لمورّدي وحدات المعالجة المركزية (SoC) الذين يستخدمون وحدات تخزين مؤقتة آمنة تمثيل وحدات التخزين المؤقتة الآمنة في native_handle
باستخدام وحدات التخزين المؤقتة الخاصة بهم. يمكن للمورّدين الذين لا يستخدمون عناوين IP ثابتة
تمثيل ذاكرات التخزين المؤقت الآمنة باستخدام حقول إضافية في
native_buffer
.
تحديد موقع فك التشفير
على المورّدين تعديل طريقة فك التشفير OEMCrypto التي تعمل على
native_handle
لتنفيذ أي عمليات ضرورية خاصة بالمورّد
لجعل native_handle
قابلاً للاستخدام في مساحة العملية الجديدة (تشمل التغييرات عادةً تعديلات على مكتبات OEMCrypto).
بما أنّ allocateBuffer
هي عملية OMX عادية، يتضمّن Android 7.0
إضافة OMX جديدة
(OMX.google.android.index.allocateNativeHandle
) للبحث عن هذه الميزة
وطلب OMX_SetParameter
الذي يُعلم عملية تنفيذ OMX بأنّه يجب استخدام المعرّفات الأصلية.