
بيئة بنواة معرضة للثغرات لاستغلال سائق TEE (CVE-2021-44733)
مؤخرًا، تم اكتشاف ثغرة استخدام بعد التحرير (use-after-free) في نظام TEE الفرعي في نواة لينكس، حتى الإصدار 5.15.11 وما يشملها، وقد تم تخصيص CVE-2021-44733 [1] لها.
للوهلة الأولى، لم تكن تبدو قابلة للاستغلال لعدة أسباب، لكن بعد مزيد من التحليل لمسار الكود القابل للثغرة ومن خلال تنفيذ استغلال إثبات مفهوم مبدئي، كان من الممكن الكتابة فوق مؤشر دالة في النواة. لا يتم تقديم حمولة رفع صلاحيات في هذه المقالة، ومع ذلك، فإن البيئة الكاملة لتشغيل OPTEE والاستغلال متاحة لمزيد من الاختبار، انظر «إعداد البيئة».
بيئة التنفيذ الموثوقة (TEE) هي نظام تشغيل موثوق يعمل في بيئة آمنة معينة، على سبيل المثال TrustZone على معالجات ARM. يتولى برنامج تشغيل TEE التفاصيل اللازمة للتواصل مع TEE. من بين الواجبات الأكثر أهمية لبرنامج التشغيل توفير واجهة برمجة تطبيقات عامة نحو TEE استنادًا إلى مواصفات Globalplatform TEE Client API [3]، وكذلك إدارة الذاكرة المشتركة بين لينكس وTEE. يمكن تمكين هذا النظام الفرعي عن طريق تكوين CONFIG_OPTEE في تكوينات النواة لمعماريات ARM.
يحتوي العالم الآمن على نظام التشغيل الموثوق المسمى OP-TEE OS [4]. وفوق هذا النظام، من الممكن تشغيل ما يسمى بالتطبيقات الموثوقة (TAs) التي يمكنها تنفيذ بعض العمليات في البيئة المعزولة، انظر الشكل 1.
الشكل 1: نظرة عامة على TEE - من عرض Linaro التقديمي [5]
يمكن للعالم العادي (فضاء المستخدم/النواة في لينكس) التفاعل مع هذه التطبيقات باستخدام تطبيقات العميل (CAs) وواجهة البرمجة التي يكشفها نظام TEE الفرعي. يمكن لتطبيق CA فتح جلسة نحو TA محددة واستدعاء الدوال التي تنفّذها TA. يتم تمرير أي وسائط ذهابًا وإيابًا بين TA وCA باستخدام الذاكرة المشتركة. يتم وصف التفاعل بين CA وTA باستخدام جميع استدعاءات النظام ذات الصلة فيما يلي.
يفتح تطبيق CA /dev/tee[0-9] للتواصل مع برنامج التشغيل. لاحظ أنه بالنسبة للطريقة التقليدية لاستخدام هذه الواجهات البرمجية، يتم ذلك ضمنيًا باستخدام libteec.
يمكن لتطبيق CA تسجيل الذاكرة المشتركة باستخدام IOCTL TEE_IOC_SHM_ALLOC. يخصص هذا الذاكرة المشتركة ويعيد واصف ملف يمكن لفضاء المستخدم استخدامه كجزء من mmap.
الخطوة التالية هي إنشاء جلسة باستخدام IOCTL TEE_IOC_OPEN_SESSION وتحديد uuid لـ TA محددة. هذا uuid مضمّن بشكل ثابت أثناء تجميع TA.
لاستدعاء أي دالة محددة في TA، يقوم CA باستدعائها بتحديد معرّف الدالة مع أي وسائط إدخال، ويتم ذلك باستخدام TEE_IOC_INVOKE.
عندما ينتهي CA من جميع الطلبات، يمكن إغلاق الجلسة باستخدام TEE_IOC_CLOSE_SESSION.
الشكل 2: جلسة بين CA وTA - من عرض Linaro التقديمي [5]
جزء كبير من الاتصال بين العملاء وTEE يكون غير شفاف بالنسبة لبرنامج التشغيل. المهمة الرئيسية لبرنامج التشغيل هي إدارة السياق، واستقبال الطلبات من العملاء، وإعادة توجيهها إلى TEE، وإرسال النتائج مرة أخرى [2].