تعزيز إطار عمل الوسائط

لتحسين أمان الجهاز، يقسّم نظام التشغيل 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 بما يلي:

  1. لفّ FD في كائن DataSource من Binder يتم تمريره إلى عملية المستخرج التي تستخدمه للقراءة من الملف باستخدام Binder IPC (لا يحصل mediaextractor على FD، ولكنه بدلاً من ذلك يُجري مكالمات Binder إلى mediaserver للحصول على البيانات).
  2. يفحص الملف، وينشئ أداة الاستخراج المناسبة لنوع الملف (مثل MP3Extractor أو MPEG4Extractor)، ويعرض واجهة Binder لأداة الاستخراج في عملية mediaserver.
  3. يُجري Binder IPC مكالمات إلى أداة الاستخراج لتحديد نوع البيانات في الملف (مثل بيانات MP3 أو H.264).
  4. طلبات إلى عملية mediacodec لإنشاء برامج ترميز من النوع المطلوب، وتتلقّى واجهات Binder لهذه برامج الترميز
  5. يُجري عمليات اتصال 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 بأنّه يجب استخدام المعرّفات الأصلية.