
إثبات المفهوم لمحرك إدارة إنتل عبر JTAG
جميع المعلومات مقدمة للأغراض التعليمية فقط. اتبع هذه التعليمات على مسؤوليتك الخاصة. لا يتحمل المؤلفون ولا جهة عملهم أي مسؤولية عن أي ضرر مباشر أو تبعي أو خسارة تنشأ عن أي شخص أو منظمة يتصرف أو يمتنع عن التصرف بناءً على المعلومات الواردة في هذه الصفحة.
مقدمة
البرمجيات المطلوبة
توليد الحمولة
توليد رمز الفتح
تحضير صورة SPI Flash
دمج الملفات في صورة البرنامج الثابت
تعطيل توقيع OEM
بناء صورة البرنامج الثابت
إقلاع المعالج الرئيسي
كتابة الصورة إلى SPI Flash
تحضير كبل تصحيح USB
ترقيع ملفات إعداد OpenIPC
فك تشفير ملفات إعداد OpenIPC
إضافة نواة LMT إلى الإعداد
ضبط متغير البيئة IPC_PATH
إجراء فحص أولي لتشغيل JTAG
عرض مسلك ME للمعالج
إيقاف الأنوية
تصحيح ME: بداية سريعة
قراءة ذاكرة عشوائية
قراءة ROM
لماذا TXE؟
قائمة المنصات المختبرة
المؤلفون
الترخيص
تسمح الثغرة INTEL-SA-00086 بتفعيل JTAG لنواة Intel Management Engine. قمنا بتطوير JTAG PoC الخاص بنا لمنصة Gigabyte Brix GP-BPCE-3350C. على الرغم من أننا نوصي الباحثين الطموحين باستخدام نفس المنصة، إلا أن منصات الشركات المصنعة الأخرى المزودة بمجموعة شرائح Intel Apollo Lake يجب أن تدعم إثبات المفهوم أيضًا (لإصدار TXE 3.0.1.1107).
تتضمن الثغرة INTEL-SA-00086 تجاوز سعة المخزن المؤقت عند معالجة ملف مخزّن على MFS (نظام ملفات ME الداخلي). المسار الكامل للملف هو /home/bup/ct. ستحتاج إلى دمجه في برنامج ME الثابت باستخدام Intel Flash Image Tool (FIT)، وهي إحدى أدوات إنتل النظامية المقدمة من إنتل إلى الشركات المصنعة للأجهزة القائمة على مجموعات شرائح Intel PCH. فيما يلي بنية الدليل الجذر لحزمة أدوات إنتل النظامية:

أدوات Intel ME (TXE, SPS) النظامية غير مخصصة للمستخدمين النهائيين — لذلك لا يمكنك العثور عليها على موقع إنتل الرسمي. ومع ذلك، تنشر بعض الشركات المصنعة هذه الأدوات كجزء من تحديثات البرمجيات إلى جانب برامج التشغيل. لذا، لدمج إثبات المفهوم الخاص بنا، ستحتاج إلى Intel TXE System Tools الإصدار 3.x، والذي يمكن العثور عليه عبر الإنترنت.
تحتاج إلى تثبيت Intel System Studio، ويمكن تنزيل نسخة تجريبية منه من موقع إنتل. في تجاربنا، استخدمنا Intel System Studio 2018.
يستهدف إثبات المفهوم برنامج Intel TXE الثابت الإصدار 3.0.1.1107. تحتوي صورة SPI Flash الخاصة بـ Gigabyte GB-BPCE-3350C الإصدار F5 على إصدار البرنامج الثابت المطلوب.
جميع نصوصنا مكتوبة بلغة Python. نوصي باستخدام Python 2.7 كما تتطلب النصوص حزمة pycrypto. لتثبيت pycrypto، نفّذ الأمر التالي:
pip install pycrypto
هذه الأداة ضرورية فقط إذا كنت بحاجة إلى إقلاع المعالج (CPU).
البنية التحتية لواجهة المستخدم البشرية EFI (HII) هي آلية خاصة لإنشاء واجهة مستخدم في UEFI، بالإضافة إلى معالجة وإدارة مدخلات المستخدم. يحدد EFI HII القيم الافتراضية لجميع الخيارات، بما فيها المخفية. بمجرد العثور على الخيار المتعلق بـ DCI، يمكن تفعيله للإعداد الافتراضي، ويمكن تمكين DCI عبر استعادة إعدادات المصنع للـ BIOS. لإقلاع المعالج الرئيسي، ستحتاج إلى AMI BIOS Configuration Program الإصدار 5.xx، والذي يمكن العثور عليه أيضًا عبر الإنترنت.
شغّل السكربت me_exp_bxtp.py:
me_exp_bxtp.py -f <file_name>
يقوم السكربت بتوليد البيانات اللازمة وتصديرها إلى الملف المحدد (حدد إما مسار الملف الكامل أو، داخل الدليل الحالي، اسمًا ببساطة، ct.bin افتراضيًا). سيُستخدم هذا الملف لاحقًا بواسطة FIT.
شغّل السكربت me_utok_bxtp.py:
me_utok_bxtp.py -f <file_name>
يقوم السكربت بتوليد البيانات اللازمة وتصديرها إلى الملف المحدد (حدد إما مسار الملف الكامل أو، داخل الدليل الحالي، اسمًا ببساطة، utok.bin افتراضيًا). سيُستخدم هذا الملف لاحقًا بواسطة FIT.
تخطَّ هذه الخطوة إذا لم تكن بحاجة إلى إقلاع المعالج (CPU).
لتفعيل خيار DCI Enable، شغّل أداة AMIBCP واستخدمها لفتح صورة البرنامج الثابت SPI المرفقة مع منصتك. بالنسبة إلى Gigabyte Brix GP-BPCE-3350C، افتح الملف الذي تم تنزيله من رابط Gigabyte المشار إليه أعلاه (مسار ملف الصورة في الأرشيف: F5/image.bin).

الآن نحتاج إلى تمكين خيار HDCIEN في تبويب Setup Configuration.
لدمج الملفين ct.bin و utok.bin، شغّل أداة FIT (fit.exe) واستخدمها لفتح صورة البرنامج الثابت SPI.

إذا كنت تستخدم منصة أجهزة أخرى ولا تملك وصولًا إلى TXE 3.0.1.1107، يمكنك تنزيل صورة SPI Flash الخاصة بـ Gigabyte GB-BPCE-3350C الإصدار F5 واستخراج قسم TXE عبر FIT. يستخرج FIT أقسامًا مختلفة من صورة SPI الكلية (وصف SPI، برنامج UEFI/BIOS الثابت، برنامج Intel ME الثابت، ورمز الفتح Unlock Token) عند فتح الصورة، ويحفظها في المجلد *"image_name"/Decomp *.

لذا يمكنك العثور على الملف الذي يحتوي برنامج Intel TXE الثابت المطلوب في المسار /Decomp/TXE Region.bin بعد ذلك، في FIT، افتح صورة SPI الخاصة بمنصتك المحددة واستبدل الملف الذي يحتوي برنامج Intel TXE الثابت بالإصدار الذي حصلت عليه من صورة GB Brix 3350c ("Intel(R) TXE Binary File" في تبويب Flash Layout):

الآن نحتاج إلى تحديد الملفات التي ولّدناها لـ /home/bup/ct و Unlock Token في FIT. في تبويب Debug في FIT، يمكنك تحديد Trace Hub Binary وUnlock Token لدمجهما في البرنامج الثابت. يجب أن تكون هذه هي الملفات التي ولّدناها بالفعل.

ببساطة قم بإزالة حقل OEM Public Key Hash من FIT:

قم ببناء الصورة عن طريق تحديد Build Image في قائمة Build.

تجاهل الرسالة المتعلقة بإعدادات BootGuard (انقر "Yes"):

إذا تم كل شيء بشكل صحيح حتى هذه النقطة، فيجب أن تنجح عملية البناء ويخرج FIT رسالة مشابهة لرسالة وحدة التحكم التالية:

تخطَّ هذه الخطوة إذا لم تكن بحاجة إلى إقلاع المعالج (CPU).
يجب عليك تفعيل وضع HAP لإقلاع المعالج. يجب تعيين البت 0 من البايت عند الإزاحة +0x102:

لكتابة الصورة إلى SPI flash، نوصي بشدة باستخدام مبرمج SPI.
تأكد من عمل نسخة احتياطية من البرنامج الثابت الأصلي حتى تتمكن من الاستعادة منه إذا حدث خطأ ما!
ستحتاج إلى كبل تصحيح USB 3.0 للاتصال بالمنصة. يمكنك إما شراء واحدًا مصنوعًا خصيصًا لهذا الغرض أو صنع كبل خاص بك من كبل USB 3.0 AM–AM عن طريق عزل جهات الاتصال D+ وD- وVcc.

تقوم إنتل بتطوير وتوفير حزمتي برمجيات للمستخدمين يمكن استخدامهما لتصحيح JTAG للمنصات والمعالج الرئيسي: DAL (طبقة تجريد DFx) وOpenIPC. كل من DAL وOpenIPC جزء من Intel System Studio. بعد تثبيت Intel System Studio 2018، يظهر OpenIPC في الدليل التالي:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
إعداد OpenIPC مشفّر ولا يدعم نواة TXE. لذا قم بفك تشفير الإعداد وأضف وصفًا لـ TXE إليه.
لفك تشفير ملفات الإعداد، استخرج المفتاح من مكتبة StructuredData (في Linux: libStructuredData_x64.so، في Windows: StructuredData_x64.dll) في OpenIPC/Bin باستخدام سكربت IDA Pro openipc_key_extract.py. مرّر المفتاح (في حالتنا، 4504fb02be0a9c4c84df2a89cf508bc3) إلى السكربت config_decryptor.py مع مسار دليل OpenIPC.
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
لا يحتوي إصدار OpenIPC المرفق على المعلومات اللازمة حول نواة TXE. لذا نحتاج إلى تطبيق الترقيع (patch.diff) على ملفات إعداد OpenIPC المفكوك تشفيرها. وإليك كيفية القيام بذلك:
patch -p2 < patch.diff
بعد فك التشفير والترقيع، اضبط متغير البيئة IPC_PATH على دليل OpenIPC الجديد بحيث يستخدم ipccli إصدار OpenIPC المعدل. على سبيل المثال:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
يقوم المفعّل (activator) بحظر التحميل اللاحق عن طريق إبقاء عملية BUP في حلقة بعد تفعيل JTAG. بعد الإقلاع، لن تُظهر المنصة أي علامات حياة (لن تعمل الشاشة، ولن تضيء مؤشرات لوحة المفاتيح، ولن يُصدر BIOS صوت POST). لذا ستحتاج إلى التحقق عبر تصحيح DCI من أن المنصة "عالقة" في وحدة BUP.
مثل DAL، تتضمن مكتبة OpenIPC واجهة سطر أوامر (CLI)، مكتوبة بلغة Python ومقدمة كمكتبة لـ Python كجزء من Intel System Studio، ويمكن تثبيتها على النظام بمساعدة pip. حزمة تثبيت ipccli موجودة في المسار التالي: Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl
لتثبيت ipccli، نفّذ أمر وحدة التحكم التالي:
pip install ipccli-1.1740.544.100-py2.py3-none-any.whl
بمجرد التثبيت، يصبح ipccli متاحًا ضمن بيئة تشغيل إصدار Python المقابل (الإصدار الذي تم استدعاء pip منه). لبدء استخدام OpenIPC، نفّذ الأوامر التالية في وحدة تحكم Python:
import ipccli
ipc = ipccli.baseaccess()
تنطلق آلية الاتصال بالمنصة الهدف عبر DCI، مما يؤدي إلى إخراج وحدة التحكم التالي:

عند عدم إنشاء اتصال — على سبيل المثال، إذا كانت المنصة غير مزوّدة بالطاقة أو غير متصلة فعليًا عبر DCI — فستكون الرسائل مشابهة لما يلي:

إذا كان اتصال DCI ناجحًا، فتأكد من أن سجل PERSONALITY لجهاز DFX_AGGRAGATOR يساوي 3. يمتلك سجل PERSONALITY رمز IR (Instruction Register) بقيمة 0x54. لقراءته، نفّذ الأوامر التالية:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
وإليك كيف يجب أن تبدو نتيجة هذا الأمر:

تأتي أداة ipccli مع توثيق HTML مفصّل إلى حد ما، ويمكن العثور عليه في مجلد من حزمة Python الخاصة بـ ipccli:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
إذا تم تنفيذ الخطوات السابقة بشكل صحيح، فعند إنشاء اتصال بالمنصة عبر ipccli، تكون نواة TXE قابلة للوصول عبر CSE Tap ويسمح ipccli بالوصول إليها من خلال تطبيق مسار ipccli التالي:
ipc.devs.cse_c0.threads[0]
ولكن نظرًا لأن إثبات المفهوم يمنع تحميل المنصة حتى تتم تهيئة المعالج الرئيسي، فإن أنويته لا يمكن الوصول إليها عبر JTAG ويمكن الوصول إلى نواة ME عبر الأمر التالي:
ipc.threads[0]
لإيقاف تعليمات معالج ME، نفّذ الأمر التالي:
me = ipc.devs.cse_c0.threads[0]
me.halt()
لإيقاف تعليمات معالج CPU، نفّذ الأمر التالي:
core = ipc.threads[0]
core.halt()

تعرض وحدة التحكم العنوان المنطقي للتعليمة التي تم الإيقاف عندها.
يسمح OpenIPC بقراءة الذاكرة بعد الإيقاف، على سبيل المثال:
ipc.threads[0].mem("0xf0080004P", 4)
يمكنك تحديد عنوان منطقي (sel:offset)، أو عنوان خطي (مُعدِّل L)، أو عنوان فيزيائي (مُعدِّل P).
يسمح وكيل نظام ME (MISA) بالحصول على العنوان الفيزيائي الأولي لمنطقة ROM، والتي تتضمن متجه إعادة تعيين ME. يمكنك الحصول على عنوان ROM عبر سجل Hunit ROM Memory Base (HROMMB) عند الإزاحة 0xe20 في MISA MMIO (0xf0000000P):

ROM يتواجد دائمًا من ROMBASE إلى 0xffffffff لنسخ ROM إلى ملف، نفّذ الأمر التالي:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
من المهم تحديد الحجم كـ 0x20001، وليس 0x20000 (وإلا سيواجه OpenIPC مشكلات بسبب صعوبات في الوصول 64 بت، وهو غير ممكن لنواة ME ذات 32 بت). يمكن التخلص من آخر بايت في الملف، لأنه ليس جزءًا من ROM.
توفر المنصة فرصًا أكثر للتصحيح دون الحاجة إلى محول خاص Intel CCA-SVT وتسمح بتصحيح المراحل الأولى من نواة TXE عبر كبل تصحيح USB عادي.
Intel ME: The Way of the Static Analysis
Intel ME: Flash File System Explained
How to Hack a Turned-Off Computer or Running Unsigned Code in Intel Management Engine
Inside Intel Management Engine
Disabling Intel ME 11 via undocumented mode
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
حقوق الطبع والنشر (c) 2018 Mark Ermolov, Maxim Goryachy في Positive Technologies
يُمنح الإذن بموجب هذا، مجانًا، لأي شخص يحصل على نسخة من هذا البرنامج وملفات التوثيق المرافقة ("البرنامج")، للتعامل مع البرنامج دون قيود، بما في ذلك دون حصر حقوق الاستخدام والنسخ والتعديل والدمج والنشر والتوزيع والترخيص الفرعي و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين يُقدَّم لهم البرنامج بالقيام بذلك، شريطة الشروط التالية: يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع نسخ أو أجزاء جوهرية من البرنامج.
يُقدَّم البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا كان أم ضمنيًا، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال لا يكون المؤلفون أو أصحاب حقوق الطبع والنشر مسؤولين عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في دعوى تعاقدية أو تقصيرية أو غير ذلك، تنشأ عن أو بسبب أو فيما يتعلق بالبرنامج أو استخدامه أو تعاملات أخرى في البرنامج.