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

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

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

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

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

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

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

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

لمزيد من التفاصيل حول كيفية تعامل AVB مع إجراءات الحماية من الرجوع إلى إصدار أقدم، يُرجى الاطّلاع على ملف README الخاص بـ AVB.

التعامل مع أخطاء التحقّق

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

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

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

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