تنفيذ dm-verity

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

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

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

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

dm-verity-hash-table

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

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

العملية

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

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

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

بدلاً من ذلك، تتحقّق 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 إلى وحدات 4 كيلوبايت، ويتم تعيين تجزئة SHA256 لكل منها. يتم إنشاء الطبقة 1 من خلال دمج تجزئات SHA256 هذه فقط في مجموعات بدقة 4K، ما يؤدي إلى الحصول على صورة أصغر بكثير. يتم تشكيل الطبقة 2 بالطريقة نفسها، باستخدام تجزئات SHA256 للطبقة 1.

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

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

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

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

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

  1. اختَر مفتاح تشويش عشوائيًا (ترميز سداسي عشري).
  2. قسّم صورة النظام إلى وحدات بحجم 4k.
  3. احصل على تجزئة SHA256 (المعقّدة) لكل كتلة.
  4. ربط علامات التجزئة هذه لإنشاء مستوى
  5. أضِف أصفارًا إلى المستوى حتى تصل إلى حدود كتلة 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 في البيانات الوصفية لنظام 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

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

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