التمهيد الآمن في i.MX6

التمهيد الآمن في i.MX6


عند تطوير أي مشروع للأنظمة المدمجة ، يجب على المطور حل مشكلتين إضافيتين:

  • كيفية حماية البرامج الثابتة من الانتحال في المنتج ؛
  • كيفية حماية البرامج من النسخ.

توضح هذه المقالة كيفية حماية معالج i.MX6 من تغيير أداة تحميل التشغيل في المنتج وتعقيد عملية نسخ البرامج الثابتة.



المقدمة


لحماية الملكية الفكرية في حال ساعد مشروع المعدن [1] بشكل أساسي مجمع الأجهزة ، الموجود في وحدة التحكم الدقيقة والخارجية. يتم إعطاء أمثلة على موقع مرموق [2] . يتم استخدام طرق برمجية إضافية ، مثل [3] ، ومع ذلك ، فهي تستند إلى آلية الحماية غير المعروفة. ويرجع ذلك إلى انخفاض قوة الحوسبة للأجهزة وإزعاج تنفيذ إنشاء البرامج الثابتة الديناميكية.

عندما تدخل SoC في أنظمة التشغيل مثل Linux ، يجب تنظيم الحماية في وقت واحد على عدة مستويات:

  • مستوى التطبيق النهائي
  • مستوى نظام التشغيل
  • مستوى برنامج Bootloader

في حالة الوصول إلى أي مستوى من المستويات ، من السهل التأثير على برنامج المستويات الأخرى وإجراء تغييرات على التفاعلات بين المستويات.
أبسط الأمثلة: يتصل برنامجك المثبت على Linux عبر بروتوكول UART (على سبيل المثال ، من خلال / dev / ttyACM0) باستخدام متحكم دقيق. يستخدم المهاجم الذي يمكنه الوصول إلى النظام نفس مورد UART ويكرر الحزم المرسلة عشوائيًا. أو ، على سبيل المثال ، إذا كان السائق مدمجًا في النواة ، فإن المهاجم يعيد تجميع النواة عن طريق إعادة كتابة كود سائق UART بطريقة أخرى. التطبيق النهائي لا يعرف ما يحدث.

ما هو التمهيد الآمن ولماذا هو مطلوب؟


المستوى الأول من الحماية لبرنامجك على النظام المستهدف هو التمهيد الآمن. فيما بعد ، يتم شرح التمهيد الآمن لمعالجات عائلة i.MX6.

يتم تنفيذ التمهيد الآمن في i.MX6 من خلال التمهيد عالي الضمان (HAB) ويمكنه أداء وظيفتين:

  • الإقلاع الآمن
  • تحميل مشفر.

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

حول التعريف الذي أعطيته التمهيد الآمن. التمهيد الآمن لا يوفر عليك من نسخ المنتج. نعم ، هذا يجعل الإجراء أكثر صعوبة ، ولكن ليس كثيرًا. لا يستطيع محمل الإقلاع التوقيع على FS بالكامل ، وبالتالي لا يوفر الحماية على مستوى نظام التشغيل وعلى مستوى التطبيق النهائي. تعمل جميعها بشكل كلاسيكي: من خلال التشفير غير المتماثل. سأصف العملية على الأصابع ، ويمكن قراءتها بشكل أعمق في [4]. يشير محمل الإقلاع إلى البرنامج النصي لـ HAB ، حيث يشار إلى مناطق الذاكرة الموقعة ، وحيث يكمن التوقيع الرقمي. المفتاح العام موجود مسبقًا في ذاكرة المعالج القابلة للبرمجة لمرة واحدة (OTP). عند التحميل ، يتحقق البرنامج النصي من مساحة الذاكرة المحددة باستخدام التوقيع الرقمي المرفق ومفتاح سلكي. إذا فشل الاختبار ، فلن يبدأ المعالج التنزيل. يجب أيضًا تنشيط عملية HAB من خلال تعيين بت في منطقة ذاكرة OTP.

عيوب التمهيد الآمن:

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

التنفيذ


بشكل عام ، هناك الكثير من المقالات باللغة الإنجليزية [5] [6] على الإنترنت حول موضوع التنفيذ ، ولكن لم تنطلق طريقة واحدة مقترحة في وقت واحد ، وبدأت الروابط إلى البرنامج تموت ، لذلك قررت حفظ هذا كمقال بشكل أساسي لنفسي ، عندما سأعود إلى هذه القضية في المستقبل.

تحتاج أولاً إلى تنزيل البرنامج التالي: أداة توقيع الكود [7] والنصوص اللازمة لتوليد المفاتيح والتوقيع. في الأرشيف المحدد ، أزلت جميع الأدوات المساعدة والمكتبات غير الضرورية ، حيث يوجد الكثير من المهام غير المستخدمة لمهمتنا.

بعد ذلك ، تحتاج إلى إنشاء المفاتيح:

cd ${CST_PATH}/release/keys
echo ${serial} > serial //8 ,     
echo ${password} >  key_pass.txt //   ,     
echo ${password} >>  key_pass.txt //
./hab4_pki_tree.sh //     
Do you want to use an existing CA key (y/n)?: n 
Do you want to use Elliptic Curve Cryptography (y/n)?: n
Enter key length in bits for PKI tree: 4096
Enter PKI tree duration (years): 10
How many Super Root Keys should be generated? 4
Do you want the SRK certificates to have the CA flag set? (y/n)?: y
 ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin \
 -d sha256 -c ./SRK1_sha256_4096_65537_v3_ca_crt.pem,\
./SRK2_sha256_4096_65537_v3_ca_crt.pem,./SRK3_sha256_4096_65537_v3_ca_crt.pem,\
./SRK4_sha256_4096_65537_v3_ca_crt.pem -f 1

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

cd ${CST_PATH}/release/linux64/bin
./var-u-boot_fuse_commands.sh 
fuse prog 3 0 0xFFFFFFFF //   uboot.
fuse prog 3 1 0xFFFFFFFF //     
fuse prog 3 2 0xFFFFFFFF //       .
fuse prog 3 3 0xFFFFFFFF //  -   .
fuse prog 3 4 0xFFFFFFFF //      .
fuse prog 3 5 0xFFFFFFFF //
fuse prog 3 6 0xFFFFFFFF  //
fuse prog 3 7 0xFFFFFFFF //

يمكن تطبيق هذه المهمة على uboot مع SPL مدمج أو مع SPL و uboot منفصلة (إصدار rocko على سبيل المثال). أنا أكتب بيانًا حتى تعرف مكان استخدامه كمعيار. إذا جمعت uboot بنفسك ، فمن المرجح أن يتم دمج SPL في uboot. من النقاط المهمة في أداة تحميل التمهيد defconfig إضافة الخيارات التالية:

CONFIG_SECURE_BOOT=y
CONFIG_SYS_FSL_HAS_SEC=y 
#define CONFIG_SYS_FSL_SEC_COMPAT    4 /* HAB version */
#define CONFIG_FSL_CAAM
#define CONFIG_CMD_DEKBLOB
#define CONFIG_SYS_FSL_SEC_LE
#define CONFIG_FAT_WRITE

تعمل هذه الخيارات على تنشيط برامج التشغيل للعمل مع وحدات الأجهزة. كل شيء مثل menuconfig لنظام Linux. عند تجميع أداة تحميل التشغيل ، استخدم الوضع المطول (إزالة V = 1. تتم كتابة التجميع مع هذه المعلمة في الدليل. ومع ذلك ، قمت بتنظيفها بنفسي). في هذه الحالة ، تتم إضافة معلومات حول عنوان نقطة الدخول والأشياء الأخرى اللازمة لتسجيل توقيع رقمي إلى سجلات التجميع. بعد التجميع ، نحتاج إلى ملفات الإخراج التالية:

  • u-boot-ivt.img
  • u-boot-ivt.img.log
  • SPL
  • SPL.log

انسخها إلى $ {CST_PATH} / release / linux64 / bin. بعد ذلك ، تحتاج إلى تشغيل برنامج نصي بسيط إلى حد ما.

وصف مفصل لإجراء البرنامج النصي
(*.csf). , :

  • .

. , ( ).

:

Image Name:   U-Boot 2019 //  U-boot
Created:      XXXXXX
Image Type:   ARM U-Boot Firmware with HABv4 IVT (uncompressed)
Data Size:    339904 Bytes = 331.94 KiB = 0.32 MiB
Load Address: 17800000
Entry Point:  00000000
HAB Blocks:   0x177fffc0   0x0000   0x00051020

Image Type:   Freescale IMX Boot Image //  SPL
Image Ver:    2 (i.MX53/6/7 compatible)
Mode:         DCD
Data Size:    61440 Bytes = 60.00 KiB = 0.06 MiB
Load Address: 00907420
Entry Point:  00908000
HAB Blocks:   00907400 00000000 0000cc00
DCD Blocks:   00910000 0000002c 00000004

«HAB Blocks». ,

cd ${CST_PATH}/release/linux64/bin
./cst --o u-boot_csf.bin --i u-boot.csf
cat u-boot-ivt.img u-boot_csf.bin > u-boot_signed.img


بقدر ما أتذكر في حالة SPL المدمجة ، فمن المرجح أن كل شيء سيعمل بنفس الطريقة ، ولكن الأمر يستحق التحقق منه. لا أتذكر الآن ولم أبدأ في الترجمة عند كتابة هذا المقال.

cd ${CST_PATH}/release/linux64/bin
SOC=mx6 ./var-som_sign_image.sh SPL u-boot-ivt.img

وفقًا لنتائج البرنامج النصي ، ستحصل على ملفين: SPL_signed ، u-boot-ivt.img_signed ، والتي يجب كتابتها إلى قرص النظام الهدف. أقوم بتطبيق مثال على برنامج نصي للتسجيل على النظام المستهدف. بدون sudo ، حتى لا تطلق النار على ساقك عن طريق الخطأ.

dd if=SPL_signed of=${DEVICE(/dev/sd*)} bs=1K seek=1; sync
dd if=u-boot-ivt.img_signed of=${DEVICE(/dev/sd*)} bs=1K seek=69; sync

بعد الكتابة إلى وسيط فارغ ، يجب أن تحصل على محمل إقلاع بدون نواة تتعطل في وحدة التحكم ، حيث لن تجد dtb و kernel. في وحدة التحكم ، يمكنك التحقق مما إذا كان ما فعلته أم لا يعمل حقًا. في وجود الحدث - حدث خطأ ما. هام: إذا تم تجميع أداة تحميل التشغيل بدون دعم HAB ، فلن تكون هناك أخطاء أيضًا.

hab_status
HAB Configuration: 0xf0, HAB State: 0x66
No HAB Events Found!

الخطوة الأخيرة هي تنشيط HAB ، الانتباه هو أمر لمرة واحدة ، لا يمكن إصلاحه ، لذا كن حذرًا

fuse prog 0 6 0x2

استنتاج


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

مرجع


[1] برنامج مدمج بالمعادن عارية يعمل مباشرة على الأجهزة دون أي تجريد في شكل أنظمة تشغيل
[2] we.easyelectronics.ru/Soft/zaschita-ustroystva-ot-vzloma-i-kopirovaniya.html
[3] ] habr.com/en/post/350602
[4] HAB4_API.pdf في github.com/BMValeev/CST_TOOL
[5] variwiki.com/index.php؟title=High_Assurance_Boot
[6] boundarydevices.com/high-assurance-boot -hab-dummies
[7] github.com/BMValeev/CST_TOOL

All Articles