يتطلّب برنامج 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
.