
مشكلة أمنية في البرنامج الثابت (firmware) لمُشغّل الأجهزة الافتراضية (hypervisor) في بعض شرائح Qualcomm الأقدم
CVE-2022-22063 هي مشكلة أمنية في البرنامج الثابت للمُشغِّل (hypervisor) لبعض شرائح Qualcomm الأقدم. يمكن إساءة استخدام مكوّن عتادي غير محمي (مُعاد التوجيه عند الإقلاع "boot remapper") للحصول على وصول كامل للقراءة/الكتابة إلى المُشغِّل من نظام تشغيل معدَّل (تصعيد صلاحيات). استغلال الثغرة أمر تافه على المنصات المتأثرة، إذ لا يتطلب معرفة بإصدار البرنامج الثابت المحدد (مثل العناوين أو المتغيرات).
ملاحظة: على الرغم من أن Qualcomm قدّمت إصلاحات للعملاء (مع متّسع من الوقت لإصدار التحديثات)، فإن العديد من الأجهزة المتأثرة قديمة بالفعل وقد لا تتلقى الإصلاح من البائع. لا يمكن استغلال الثغرة إلا من نظام تشغيل معدَّل أو مخترَق (باستخدام ثغرة أمنية أخرى). قد يكون إبقاء نظام التشغيل محدّثًا وآمنًا كافيًا حتى لو كان البرنامج الثابت عرضة للثغرة.
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hنُشرت الثغرة أيضًا في [النشرة الأمنية لشهر ديسمبر 2022 من Qualcomm].
تعتمد الثغرة على مزيج من العتاد والبرمجيات التي تعمل على الهدف المتأثر:
hyp على وحدة التخزين الداخلية).APCS_BOOT_START_ADDR_NSEC)، وهي غير محمية بواسطة المُشغِّل، وبالتالي يمكن الوصول إليها من نواة نظام التشغيل الأقل صلاحية (مثل Linux).هناك العديد من الشرائح الأخرى التي يحتمل أن تحتوي على العتاد المتأثر (مثل MSM8909 وMSM8953)، لكنها لا تحتوي على برنامج ثابت منفصل للمُشغِّل يمكن اختراقه.
تصعيد الصلاحيات: بوجود نواة نظام تشغيل مخترقة بالفعل (مثل Linux)، تسمح الثغرة بتصعيد الصلاحيات بسهولة إلى مستوى المُشغِّل (EL1 -> EL2 على ARM). يمكن قراءة أو كتابة جميع الذاكرة التي يديرها المُشغِّل. يؤدي هذا إلى كسر عزل مجالات الأمان المختلفة أو الأجهزة الافتراضية التي يديرها المُشغِّل (إن وُجدت، اعتمادًا على الإعدادات).
(انظر أيضًا: [مقدمة إلى التحكم في الوصول على منصات Qualcomm Snapdragon])
الإقلاع الآمن: تستخدم معظم أجهزة Qualcomm المتوفرة في الإنتاج الإقلاع الآمن لمنع التعديل غير المصرح به للبرنامج الثابت. البرنامج الثابت موقَّع تشفيريًا ويتم التحقق منه بواسطة سلسلة الإقلاع. تسمح الثغرة بتعديل أو حتى استبدال البرنامج الثابت للمُشغِّل المُحمَّل بالكامل أثناء التشغيل من نظام تشغيل معدَّل (إما عبر "فتح قفل مُحمِّل الإقلاع" المدعوم رسميًا أو عبر ثغرة أخرى).
(انظر أيضًا: [النظرة الفنية العامة للإقلاع الآمن والتحقق من صورة Qualcomm (الإصدار 1.0)] و(الإصدار 2.0))
ملاحظة: عُثر على الثغرة في الأصل على منصة Qualcomm Snapdragon 410 (MSM8916). قد تكون بعض الشروحات التالية خاصة بمنصة MSM8916، على سبيل المثال:
ومع ذلك، ينطبق المفهوم العام بشكل مشابه على جميع المنصات المتأثرة.
يعرّف معمار ARMv8-A 64-بت 4 مستويات صلاحية ("مستويات استثناءات"، EL). توجد مستويات منفصلة تُستخدم عادةً للتطبيقات ونوى أنظمة التشغيل والمُشغِّل:
تتبدل وحدة المعالجة المركزية بين المستويات أثناء الاستثناءات، على سبيل المثال بسبب انقطاع وارد. من الممكن أيضًا التبديل بين بعض المستويات باستخدام تعليمات خاصة، مثل استدعاء المُشغِّل (hvc).
(انظر أيضًا: [نموذج استثناءات AArch64])
يمكن للمُشغِّل استضافة جهاز افتراضي واحد أو أكثر مع نوى أنظمة تشغيل منفصلة. يمكن إعطاء كل جهاز افتراضي عرضه الخاص من الذاكرة باستخدام الترجمة من المرحلة الثانية. تمر جميع عمليات الوصول إلى الذاكرة من جهاز افتراضي عبر مرحلتين من الترجمة: الأولى تُدار بواسطة نظام التشغيل (الافتراضي)، بينما تُدار المرحلة الثانية بواسطة المُشغِّل. يمكن إخفاء الذاكرة المستخدمة من قبل المُشغِّل أو الأجهزة الافتراضية الأخرى بحذفها من جداول الترجمة.
(انظر أيضًا: [محاكاة AArch64], [إدارة ذاكرة AArch64])
يعمل البرنامج الثابت للمُشغِّل من Qualcomm في EL2 ويستخدم الترجمة من المرحلة الثانية لمنع الوصول إلى ذاكرة المُشغِّل من نواة نظام التشغيل الرئيسية التي تعمل في EL1 (عادةً Linux). لاحظ أن الترجمة من المرحلة الثانية في هذا الإعداد تُستخدم بشكل أساسي لحماية الذاكرة، دون ترجمة عناوين. يحصل نظام التشغيل الرئيسي على وصول مباشر إلى معظم مكوّنات العتاد في مساحة الإدخال/الإخراج المعيّنة في الذاكرة (MMIO)، مثل وحدة تحكم SD أو نظام الكاميرا. الوصول إلى الذاكرة التي تنتمي إلى المُشغِّل/EL2 (hyp) والمراقب الآمن/EL3 (جزء من tz) مقيد:
لا علاقة لمُعاد التوجيه عند الإقلاع بالمحاكاة الافتراضية: فهو مطلوب أثناء الإقلاع المبكر لنواة وحدة المعالجة المركزية. على منصة العتاد هذه، تبدأ نوى وحدة المعالجة المركزية التنفيذ دائمًا عند العنوان 0x0. مُعاد التوجيه عند الإقلاع هو مكوّن عتادي إضافي مبني حول وحدة المعالجة المركزية يعيد توجيه أول 64 أو 128 كيبي بايت (0x00000 - 0x20000) إلى منطقة ذاكرة قابلة للإعداد.
افتراضيًا، يشير مُعاد التوجيه عند الإقلاع إلى ذاكرة الإقلاع (أول كود يعمل عند تشغيل الجهاز). لاحقًا يتم تغيير التعيين بحيث تبدأ نوى وحدة المعالجة المركزية الأخرى التنفيذ فورًا في البرنامج الثابت EL3 (جزء من tz) الذي تم تحميله في ذاكرة الوصول العشوائي:
لاحظ كيف أن العنوان الذي تصل إليه وحدة المعالجة المركزية (داخل tz) يمكن الوصول إليه باستخدام عنوانين فيزيائيين مختلفين: العنوان الحقيقي في ذاكرة الوصول العشوائي (0x8650xxxx) والعنوان المعاد توجيهه باستخدام مُعاد التوجيه عند الإقلاع (0x0000xxxx).
يوجد في الواقع مثيلان منفصلان لمُعاد التوجيه عند الإقلاع:
APCS_BOOT_START_ADDR_SEC (= 0x0b010004) ولكن فقط في الحالة الآمنة.APCS_BOOT_START_ADDR_NSEC (= 0x0b010008)، حتى في الحالة غير الآمنة.يمكن إعداد كلا مثيلي مُعاد التوجيه عند الإقلاع باستخدام سجل ذاكرة يحتوي على العنوان الأساسي للمنطقة المعاد توجيهها وبتّي إعدادات: REMAP_EN لتفعيل إعادة التوجيه وBOOT_128KB_EN لإعادة توجيه أول 128 كيبي بايت بدلًا من 64 كيبي بايت فقط.
(انظر أيضًا: [دليل مرجعي فني لـ Qualcomm Snapdragon 410E مراجعة D], الصفحتان 85 و116)
باستخدام المعرفة من القسمين السابقين، الفكرة الأساسية بسيطة: استخدم مُعاد التوجيه عند الإقلاع لتجاوز حماية الذاكرة (الترجمة من المرحلة الثانية) الخاصة بالمُشغِّل.
مُعاد التوجيه عند الإقلاع لا يعمل فقط أثناء بدء تشغيل وحدة المعالجة المركزية. يمكن استخدامه في أي وقت ويتيح وصولًا كاملًا للقراءة/الكتابة/التنفيذ إلى المنطقة المعاد توجيهها. أيضًا، يبدو أن مُشغِّل Qualcomm لا يمنع نظام التشغيل من إعداد والوصول إلى المثيل غير الآمن لمُعاد التوجيه عند الإقلاع على الأجهزة المتأثرة (فهو غير محمي باستخدام الترجمة من المرحلة الثانية). لذلك، من السهل استغلال الثغرة عن طريق: