التحقّق من التشغيل

تتطلّب ميزة "التمهيد التحقق منه" التحقّق من صحة جميع الرموز البرمجية والبيانات القابلة للتنفيذ التي تشكّل جزءًا من إصدار Android الذي يتم تشغيله قبل استخدامه. ويشمل ذلك النواة (التي يتم تحميلها من القسم boot) وشجرة الجهاز (التي يتم تحميلها من القسم dtbo) والقسم system والقسم vendor وما إلى ذلك.

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

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

يتم عادةً تخزين التجزئات المتوقّعة في نهاية أو بداية كل قسم تم إثبات ملكيته، أو في قسم مخصّص، أو كليهما. من المهمّ الإشارة إلى أنّه يتم توقيع هذه التجزئات (سواء بشكل مباشر أو غير مباشر) من خلال جذر الثقة. على سبيل المثال، يتيح تنفيذ AVB كلا الطريقتَين، راجِع التشغيل المُتحقّق منه في Android لمعرفة التفاصيل.

الحماية من الرجوع إلى الحالة السابقة

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

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

لمزيد من التفاصيل حول كيفية تعامل بروتوكول AVB مع وسائل الحماية من التراجع، يُرجى الاطّلاع على ملف README الخاص ببروتوكول AVB.

التعامل مع أخطاء إثبات الهوية

يمكن أن يتعذّر إثبات صحة المحتوى إما في وقت التشغيل (مثلاً، إذا لم تتطابق التجزئة المحسوبة في القسم boot مع التجزئة المتوقّعة) أو في وقت التشغيل (مثلاً، إذا واجه dm-verity خطأ في إثبات صحة المحتوى في القسم system). إذا تعذّر إثبات الملكية في وقت التشغيل، لن يتم التمهيد للجهاز، وعلى المستخدم النهائي اتّباع الخطوات اللازمة لاسترداد الجهاز.

إذا تعذّر إثبات الملكية أثناء التشغيل، يصبح الإجراء أكثر تعقيدًا. إذا كان الجهاز يستخدم dm-verity، يجب ضبطه في وضع restart. في وضع restart، إذا حدث خطأ في عملية التحقّق، تتم إعادة تشغيل الجهاز على الفور مع ضبط علامة معيّنة للإشارة إلى السبب. من المفترض أن يلاحظ مثبّت التمهيد هذه العلامة ويبدّل dm-verity لاستخدام وضع خطأ I/O (eio) ويبقى في هذا الوضع إلى أن يتم تثبيت تحديث جديد.

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

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