تنفيذ dm-verity

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

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

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

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

جدول-هاش-دي إم-فيرتي

الشكل 1. جدول تجزئة dm-verity

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

العملية

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

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

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

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

إذا تعذّر إجراء عملية التحقّق، سيظهر خطأ إدخال/إخراج في الجهاز يشير إلى الحظر لا يمكن قراءتها. سيظهر النظام كما لو كان نظام الملفات تالفًا، كما هو متوقع.

يمكن أن تختار التطبيقات المتابعة بدون البيانات الناتجة، مثل هذه النتائج ليست مطلوبة للوظيفة الأساسية للتطبيق. ومع ذلك، فإذا لم يتمكن التطبيق من الاستمرار بدون البيانات، فسيفشل.

تصحيح الأخطاء في الجزء الأمامي

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

التنفيذ

ملخّص

  1. إنشاء صورة نظام ext4
  2. أنشئ شجرة تجزئة لتلك الصورة.
  3. أنشئ جدول dm-verity لشجرة التجزئة هذه.
  4. أشِر إلى جدول dm-verity لإنشاء جدول. التوقيع.
  5. تجميع توقيع الجدول وجدول dm-verity إلى بيانات التعريف الصحيحة.
  6. ربط صورة النظام والبيانات الوصفية للتحقق وشجرة التجزئة

يُرجى الاطّلاع على مشاريع Chromium - التشغيل المتحقَّق منه للحصول على وصف تفصيلي لجدول شجرة التجزئة وdm-verity.

إنشاء شجرة تجزئة

كما هو موضّح في المقدمة، تعتبر شجرة التجزئة جزءًا لا يتجزأ من dm-verity. تشير رسالة الأشكال البيانية cryptsetup إنشاء شجرة تجزئة لك. كحل بديل، يتم تحديد اسم متوافق هنا:

<your block device name> <your block device name> <block size> <block size> <image size in blocks> <image size in blocks + 8> <root hash> <salt>

لتكوين التجزئة، يتم تقسيم صورة النظام في الطبقة 0 إلى كتلة 4k، قامت بتعيين تجزئة SHA256. يتم تكوين الطبقة الأولى من خلال ضم تجزئات SHA256 فقط إلى قوالب بدقة 4k، مما يؤدي إلى صورة أصغر بكثير. تم تشكيل الطبقة 2 بشكل مطابق، مع تجزئات SHA256 للطبقة 1.

يتم ذلك إلى أن تتلاءم تجزئات SHA256 للطبقة السابقة مع حظر. عندما تحصل على SHA256 لهذه المجموعة، يكون لديك تجزئة الجذر للشجرة.

يختلف حجم شجرة التجزئة (واستخدام مساحة القرص) باختلاف حجم القسم الذي تم التحقق منه. من الناحية العملية، غالبًا ما يكون حجم أشجار التجزئة صغيرة، غالبًا ما تكون أقل من 30 ميغابايت.

إذا كان لديك كتلة في طبقة غير مملوءة بالكامل بشكل طبيعي تجزئات الطبقة السابقة، فيجب وضعها مع الأصفار لتحقيق المتوقع 4k. وهذا يتيح لك معرفة أنه لم تتم إزالة شجرة التجزئة وأنه بدلاً من ذلك، تم إكماله ببيانات فارغة.

لإنشاء شجرة التجزئة، أنشئ تسلسلاً لتجزئات الطبقة 2 مع تجزئات الطبقة 1، الطبقة 3 هي قيم التجزئات الموجودة في الطبقة 2، وهكذا. كتابة كل ما سبق إلى القرص. تجدر الإشارة إلى أنّ ذلك لا يشير إلى الطبقة 0 من تجزئة الجذر.

باختصار، الخوارزمية العامة لإنشاء شجرة التجزئة هي كما يلي:

  1. اختر قيمة عشوائية مضافة (ترميز سداسي عشري).
  2. قسّم صورة النظام إلى وحدات بحجم 4k.
  3. احصل على تجزئة SHA256 (المعقّدة) لكل كتلة.
  4. ربط علامات التجزئة هذه لإنشاء مستوى
  5. أضِف 0 ثانية إلى حدود مربّعة 4k.
  6. اربط المستوى بشجرة التجزئة.
  7. كرِّر الخطوات من 2 إلى 6 باستخدام المستوى السابق كمصدر للانتقال إلى الخطوة التالية حتى تكون لديك تجزئة واحدة فقط.

والنتيجة هي تجزئة واحدة، وهي تجزئة الجذر. هذا والملح أثناء إنشاء جدول تعيين dm-verity.

إنشاء جدول ربط dm-verity

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

يمكنك الاطلاع على cryptsetup للحصول على وصف مفصل لحقول جدول تعيين أهداف الحقيقة.

توقيع جدول dm-verity

قم بالتوقيع على جدول dm-verity لإنشاء توقيع جدول. عند التحقق من يتم التحقق من صحة توقيع الجدول أولاً. يتم ذلك مقابل مفتاح على صورة التمهيد في موقع ثابت. يتم تضمين المفاتيح في ملف الشركات المصنّعة وإنشاء أنظمة للتضمين التلقائي على الأجهزة في الموقع.

للتحقّق من عملية التقسيم باستخدام هذا التوقيع ومجموعة المفاتيح، عليك إجراء ما يلي:

  1. أضِف مفتاح RSA-2048 بتنسيق متوافق مع libmincrypt إلى العنصر قسم واحد (/boot) في /verity_key تحديد موقع المفتاح المُستخدَم لإثبات الملكية شجرة التجزئة.
  2. في fstab للإدخال ذي الصلة، أضف verify إلى علامات fs_mgr.

تجميع توقيع الجدول في بيانات وصفية

ادمِج توقيع الجدول وجدول dm-verity في بيانات الصحّة الوصفية. من البيانات الوصفية، وبالتالي يمكن تمديدها، مثل إضافة علامة التوقيع أو تغيير ترتيب معين.

كفحص لضمان السلامة، يتم ربط رقم سحري بكل مجموعة من بيانات التعريف للجدول تساعد في تحديد الجدول. بما أنّ المدة مضمّنة في نظام ext4 صورة رأس الصورة، يوفر هذا وسيلة للبحث عن بيانات التعريف دون معرفة محتويات البيانات نفسها.

يضمن هذا الإجراء أنّك لم تختر التحقّق من القسم الذي لم يتم التحقّق منه. إذا كان الأمر كذلك، وسيؤدّي عدم توفّر هذا الرقم السحري إلى إيقاف عملية التحقّق. هذا الرقم يشبه:
0xb001b001

قيم البايت في النظام السداسي العشري هي:

  • البايت الأول = b0
  • البايت الثاني = 01
  • البايت الثالث = b0
  • البايت الرابع = 01

يوضِّح الرسم البياني التالي تفصيل بيانات الصحّة الوصفية:

<magic number>|<version>|<signature>|<table length>|<table>|<padding>
\-------------------------------------------------------------------/
\----------------------------------------------------------/   |
                            |                                  |
                            |                                 32K
                       block content

ويصف هذا الجدول حقول بيانات التعريف هذه.

الجدول 1. حقول البيانات الوصفية للتحقق من صحة المعلومات

الحقل الغرض حجم الملف القيمة
عدد سحري يستخدمه fs_mgr كفحص السلامة 4 بايت 0xb001b001
إصدار يُستخدم لإصدار مجموعة بيانات التعريف 4 بايت حاليًا 0
التوقيع توقيع الجدول في نموذج PKCS1.5 المسطّح 256 بايت
طول الجدول طول جدول dm-verity بالبايت 4 بايت
مائدة جدول dm-verity الموضح سابقًا بايت طول الجدول
padding يبلغ طول هذه البنية 0 إلى 32 كيلوبايت. 0

تحسين dm-verity

لتحقيق أفضل أداء من dm، عليك تنفيذ ما يلي:

  • في النواة، يجب تفعيل خوارزمية NEON SHA-2 لكل من ARMv7 وSHA-2. امتدادات لـ ARMv8.
  • تجربة تنسيقات مختلفة للقراءة المسبقة وprefetch_cluster الإعدادات للعثور على أفضل إعدادات لجهازك.