استخدام "التشغيل المتحقّق منه"

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

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

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

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

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

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

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

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

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

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

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

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

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