
UEFI shim loader
shim هو تطبيق EFI بسيط يحاول، عند تشغيله، فتح وتنفيذ تطبيق آخر. سيحاول في البداية القيام بذلك عبر استدعاءات EFI القياسية LoadImage() وStartImage(). إذا فشلت هذه (لأن Secure Boot مفعّل والملف الثنائي غير موقّع بمفتاح مناسب، على سبيل المثال)، فسيقوم بعد ذلك بالتحقق من الملف الثنائي مقابل شهادة مدمجة. إذا نجح ذلك ولم يكن الملف الثنائي أو مفتاح التوقيع محظورًا، فسيقوم shim بإعادة تموضع الملف الثنائي وتنفيذه.
سيقوم shim أيضًا بتثبيت بروتوكول يسمح لمُحمّل الإقلاع في المرحلة الثانية بإجراء تحقق مماثل من الملف الثنائي. يحمل هذا البروتوكول معرّف GUID كما هو موصوف في ملف الرأس shim.h ويوفّر نقطة دخول واحدة. في الأنظمة ذات 64 بت، من المتوقع أن تُستدعى نقطة الدخول هذه باستخدام SysV ABI بدلاً من MSABI، لذا لا ينبغي تغليف الاستدعاءات إليها.
منذ الإصدار 16.1، يستبدل shim جدول النظام ويُثبّت نسخته الخاصة من دوال LoadImage()/StartImage()/UnloadImage()/Exit()، بحيث يمكن للمراحل الثانية ببساطة استدعاءها من جدول النظام، وسيعمل ذلك سواء كان shim هو المرحلة الأولى أم لا، دون الحاجة إلى كود خاص بـ shim في المراحل الثانية.
عند تثبيت هذا البروتوكول، يمكن تحميل صور UKI الموقّعة صور النواة الموحّدة حتى لو لم تكن النواة المتداخلة موقّعة، إذ بعد تحميل الـ UKI والتحقق منها، يُنشئ shim قائمة سماح داخلية بجميع الأقسام الموجودة في الـ UKI. عند تحميل صورة من أحد هذه الأقسام، يتم التحقق منها مقابل قوائم الحظر (DBX/MOKX/SBAT وقت كتابة هذا النص)، ولكن لا يتم فحصها مقابل قوائم السماح (تجزئات/توقيعات DB/MOK)، لأن الصورة الخارجية تم التحقق منها بالفعل، وبالتالي فإن الصورة الداخلية مشمولة بتلك التوقيعات أو التجزئات. علاوة على ذلك، لا يتم قياس الصورة الداخلية في TPM، لتجنّب القياس المزدوج.
في الأنظمة التي تحتوي على شريحة TPM مفعّلة ومدعومة من البرنامج الثابت للنظام (firmware)، سيقوم shim بتمديد سجلات PCR المختلفة بملخصات الأهداف التي يحمّلها. توجد القائمة الكاملة في الملف README.tpm .
لاستخدام shim، ما عليك سوى وضع شهادة عامة مُرمّزة بـ DER في ملف مثل pub.cer ثم البناء باستخدام make VENDOR_CERT_FILE=pub.cer.
هناك عدد من خيارات البناء، وعدد من الطرق لتخصيص البناء، موصوفة في BUILDING.
راجع خطة الاختبار، وأنشئ تذكرة إذا فشل أي شيء!
في حال الحاجة إلى التواصل مع المطورين بخصوص حادثة أمنية أو ثغرة أمنية، يرجى مراسلة [email protected].