
Intel Management Engine JTAG अवधारणा का प्रमाण
सभी जानकारी केवल शैक्षिक उद्देश्यों के लिए प्रदान की गई है। इन निर्देशों का पालन अपने जोखिम पर करें। इस पृष्ठ में निहित जानकारी के आधार पर किसी व्यक्ति या संगठन द्वारा कार्य करने या न करने से उत्पन्न किसी भी प्रत्यक्ष या परिणामी क्षति या हानि के लिए न तो लेखक और न ही उनका नियोक्ता जिम्मेदार है।
परिचय
आवश्यक सॉफ़्टवेयर
पेलोड जनरेट करना
अनलॉक टोकन जनरेट करना
SPI फ्लैश इमेज तैयार करना
फ़र्मवेयर इमेज में फ़ाइलें शामिल करना
OEM साइनिंग अक्षम करना
फ़र्मवेयर इमेज बनाना
मुख्य CPU को BringUP करना
SPI फ्लैश में इमेज लिखना
USB डिबग केबल तैयार करना
OpenIPC कॉन्फ़िगरेशन फ़ाइलों को पैच करना
OpenIPC कॉन्फ़िगरेशन फ़ाइलों को डिक्रिप्ट करना
कॉन्फ़िगरेशन में LMT कोर जोड़ना
IPC_PATH पर्यावरण चर सेट करना
JTAG कार्यशीलता की प्रारंभिक जाँच करना
CPU ME थ्रेड दिखाएँ
कोर रोकना
ME डिबगिंग: त्वरित प्रारंभ
किसी भी मेमोरी को पढ़ना
ROM पढ़ना
TXE क्यों?
परीक्षणित प्लेटफ़ॉर्मों की सूची
लेखक
लाइसेंस
भेद्यता INTEL-SA-00086 Intel Management Engine कोर के लिए JTAG सक्रिय करने की अनुमति देती है। हमने अपना JTAG PoC Gigabyte Brix GP-BPCE-3350C प्लेटफ़ॉर्म के लिए विकसित किया है। हालाँकि हम अनुशंसा करते हैं कि इच्छुक शोधकर्ता उसी प्लेटफ़ॉर्म का उपयोग करें, Intel Apollo Lake चिपसेट वाले अन्य निर्माताओं के प्लेटफ़ॉर्म को भी PoC का समर्थन करना चाहिए (TXE संस्करण 3.0.1.1107 के लिए)।
भेद्यता INTEL-SA-00086 में MFS (आंतरिक ME फ़ाइल सिस्टम) पर संग्रहीत फ़ाइल को संसाधित करते समय बफ़र ओवरफ़्लो शामिल है। पूर्ण फ़ाइल पथ /home/bup/ct है। आपको इसे Intel Flash Image Tool (FIT) का उपयोग करके ME फ़र्मवेयर में एकीकृत करना होगा, जो Intel द्वारा Intel PCH चिपसेट पर आधारित हार्डवेयर के OEM को प्रदान किए जाने वाले Intel System Tools में से एक है।
Intel System Tools पैकेज की रूट निर्देशिका की संरचना यहाँ दी गई है:

Intel ME (TXE, SPS) System Tools उपयोगिताएँ अंतिम उपयोगकर्ताओं के लिए अभिप्रेत नहीं हैं—इसलिए आप उन्हें आधिकारिक Intel वेबसाइट पर नहीं पा सकते हैं। हालाँकि, कुछ OEM उन्हें डिवाइस ड्राइवरों के साथ सॉफ़्टवेयर अपडेट के भाग के रूप में प्रकाशित करते हैं। इसलिए, हमारे PoC को एकीकृत करने के लिए आपको Intel TXE System Tools संस्करण 3.x की आवश्यकता है, जो ऑनलाइन पाया जा सकता है।
आपको Intel System Studio स्थापित करने की आवश्यकता है, जिसका परीक्षण संस्करण Intel साइट से डाउनलोड किया जा सकता है। अपने प्रयोगों में, हमने Intel System Studio 2018 का उपयोग किया।
PoC Intel TXE फ़र्मवेयर संस्करण 3.0.1.1107 को लक्षित करता है। Gigabyte GB-BPCE-3350C संस्करण F5 के लिए SPI फ्लैश इमेज में आवश्यक फ़र्मवेयर संस्करण होता है।
हमारी सभी स्क्रिप्ट Python में लिखी गई हैं। हम Python 2.7 का उपयोग करने की अनुशंसा करते हैं। साथ ही स्क्रिप्ट्स को pycrypto पैकेज की आवश्यकता होती है। pycrypto स्थापित करने के लिए, निम्न कमांड चलाएँ:
pip install pycrypto
यह उपयोगिता केवल तभी आवश्यक है जब आपको CPU bring up करने की आवश्यकता हो।
EFI Human Interface Infrastructure (HII) UEFI में उपयोगकर्ता इंटरफ़ेस बनाने के साथ-साथ उपयोगकर्ता इनपुट को संसाधित और प्रबंधित करने के लिए एक विशेष तंत्र है। EFI HII सभी विकल्पों के लिए डिफ़ॉल्ट मानों की पहचान करता है, जिसमें छिपे हुए विकल्प भी शामिल हैं। जैसे ही DCI से संबंधित विकल्प मिलता है, इसे डिफ़ॉल्ट कॉन्फ़िगरेशन के लिए सक्रिय किया जा सकता है, और BIOS फ़ैक्टरी सेटिंग्स को पुनर्स्थापित करके DCI को सक्षम किया जा सकता है। मुख्य CPU को bring up करने के लिए आपको 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 को bring up करने की आवश्यकता नहीं है तो इस चरण को छोड़ दें।
DCI Enable विकल्प को सक्रिय करने के लिए, AMIBCP उपयोगिता चलाएँ और इसका उपयोग अपने प्लेटफ़ॉर्म के साथ प्रदान की गई SPI फ़र्मवेयर इमेज को खोलने के लिए करें। Gigabyte Brix GP-BPCE-3350C के लिए, ऊपर बताए गए Gigabyte लिंक से डाउनलोड की गई फ़ाइल खोलें (संग्रह में इमेज फ़ाइल का पथ: F5/image.bin)।

अब हमें Setup Configuration टैब में HDCIEN विकल्प को सक्षम करने की आवश्यकता है।
ct.bin और utok.bin फ़ाइलों को एकीकृत करने के लिए, FIT उपयोगिता (fit.exe) चलाएँ और इसका उपयोग SPI फ़र्मवेयर इमेज को खोलने के लिए करें।

यदि आप किसी अन्य हार्डवेयर प्लेटफ़ॉर्म का उपयोग कर रहे हैं और आपके पास TXE 3.0.1.1107 तक पहुँच नहीं है, तो आप Gigabyte GB-BPCE-3350C संस्करण F5 के लिए SPI फ्लैश इमेज डाउनलोड कर सकते हैं और FIT के माध्यम से TXE अनुभाग निकाल सकते हैं। इमेज खोले जाने पर FIT समग्र SPI इमेज के विभिन्न अनुभागों (SPI डिस्क्रिप्टर, UEFI/BIOS फ़र्मवेयर, Intel ME फ़र्मवेयर, और अनलॉक टोकन) को निकालता है और उन्हें *"image_name"/Decomp * फ़ोल्डर में सहेजता है।

इसलिए आपको आवश्यक Intel TXE फ़र्मवेयर वाली फ़ाइल /Decomp/TXE Region.bin पर मिलेगी। फिर, FIT में, अपने विशेष प्लेटफ़ॉर्म के लिए SPI इमेज खोलें और Intel TXE फ़र्मवेयर वाली फ़ाइल को GB Brix 3350c इमेज से प्राप्त संस्करण से बदलें ("Intel(R) TXE Binary File" फ्लैश लेआउट टैब पर):

अब हमें FIT में उन फ़ाइलों को इंगित करना होगा जो हमने /home/bup/ct और Unlock Token के लिए उत्पन्न की हैं। FIT के Debug टैब पर, आप फ़र्मवेयर में एकीकृत करने के लिए Trace Hub Binary और Unlock Token निर्दिष्ट कर सकते हैं। ये वे फ़ाइलें होनी चाहिए जो हम पहले ही उत्पन्न कर चुके हैं।

बस FIT से OEM Public Key Hash फ़ील्ड हटा दें:

Build मेनू में Build Image का चयन करके इमेज बनाएँ।

BootGuard सेटिंग्स के बारे में संदेश को अनदेखा करें ("Yes" पर क्लिक करें):

यदि इस बिंदु तक सब कुछ सही ढंग से किया गया है, तो निर्माण प्रक्रिया सफल होनी चाहिए और FIT निम्न कंसोल संदेश जैसा कुछ आउटपुट देगा:

यदि आपको CPU को bring up करने की आवश्यकता नहीं है तो इस चरण को छोड़ दें।
CPU को bring up करने के लिए आपको HAP मोड सक्रिय करना होगा। ऑफ़सेट +0x102 पर बाइट का 0-बिट सेट होना चाहिए:

SPI फ्लैश में इमेज लिखने के लिए, हम SPI प्रोग्रामर का उपयोग करने की अत्यधिक अनुशंसा करते हैं।
कुछ गलत होने पर पुनर्स्थापित करने के लिए मूल फ़र्मवेयर का बैकअप अवश्य लें!
प्लेटफ़ॉर्म से कनेक्ट करने के लिए आपको एक USB 3.0 डिबग केबल की आवश्यकता होगी। या तो उद्देश्य के लिए विशेष रूप से बनाई गई केबल खरीदें या D+, D-, और Vcc संपर्कों को अलग करके USB 3.0 AM–AM केबल से अपनी खुद की केबल बनाएँ।

Intel दो सॉफ़्टवेयर पैकेज विकसित और उपयोगकर्ताओं को प्रदान करता है जिनका उपयोग प्लेटफ़ॉर्म और मुख्य CPU की JTAG डिबगिंग के लिए किया जा सकता है: DAL (DFx Abstraction Layer) और 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 विवरण जोड़ें।
कॉन्फ़िगरेशन फ़ाइलों को डिक्रिप्ट करने के लिए, IDA Pro स्क्रिप्ट openipc_key_extract.py का उपयोग करके OpenIPC/Bin में StructuredData लाइब्रेरी (Linux: libStructuredData_x64.so, Windows: StructuredData_x64.dll) से कुंजी निकालें। कुंजी (हमारे मामले में, 4504fb02be0a9c4c84df2a89cf508bc3) को OpenIPC निर्देशिका के पथ के साथ स्क्रिप्ट config_decryptor.py को दें।
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
OpenIPC के साथ प्रदान किए गए संस्करण में TXE कोर के बारे में आवश्यक जानकारी नहीं है। इसलिए हमें डिक्रिप्ट की गई OpenIPC कॉन्फ़िगरेशन फ़ाइलों में एक पैच (patch.diff) लागू करने की आवश्यकता है। इसे करने का तरीका यहाँ है:
patch -p2 < patch.diff
डिक्रिप्शन और पैचिंग के बाद, IPC_PATH पर्यावरण चर को नई OpenIPC निर्देशिका पर सेट करें ताकि ipccli संशोधित OpenIPC संस्करण का उपयोग करे। उदाहरण के लिए:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
activator JTAG सक्रिय होने के बाद BUP प्रक्रिया को लूप में रखकर आगे की लोडिंग को अवरुद्ध करता है। लॉन्च के बाद, प्लेटफ़ॉर्म जीवन का कोई संकेत नहीं दिखाएगा (मॉनिटर चालू नहीं होता है, कीबोर्ड संकेतक प्रकाशित नहीं होते हैं, और कोई BIOS POST ध्वनि नहीं बजती है)। इसलिए आपको DCI डिबगिंग के माध्यम से जाँच करनी होगी कि प्लेटफ़ॉर्म BUP मॉड्यूल में "फँस" गया है।
DAL की तरह, OpenIPC लाइब्रेरी में एक कमांड-लाइन इंटरफ़ेस (CLI) शामिल है, जो Python में लिखा गया है और Intel System Studio के भाग के रूप में Python के लिए एक लाइब्रेरी के रूप में प्रदान किया गया है, जिसे 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 कनेक्शन सफल होता है, तो सुनिश्चित करें कि DFX_AGGRAGATOR डिवाइस का PERSONALITY रजिस्टर 3 के बराबर है। PERSONALITY रजिस्टर का IR (Instruction Register) कोड 0x54 है। इसे पढ़ने के लिए, निम्न कमांड चलाएँ:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
उस कमांड का परिणाम कैसा दिखना चाहिए, यह यहाँ दिया गया है:

ipccli उपयोगिता काफी विस्तृत HTML दस्तावेज़ के साथ आती है, जो ipccli Python पैकेज के एक फ़ोल्डर में पाई जा सकती है:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
यदि पिछले चरण सही ढंग से किए गए हैं, तो जब ipccli के माध्यम से प्लेटफ़ॉर्म से कनेक्शन बनाया जाता है, TXE कोर CSE Tap के माध्यम से सुलभ होता है और ipccli निम्न ipccli पथ लागू करके उस तक पहुँचने की अनुमति देता है:
ipc.devs.cse_c0.threads[0]
लेकिन चूँकि PoC मुख्य CPU आरंभ होने तक प्लेटफ़ॉर्म की लोडिंग को अवरुद्ध करता है, इसके कोर 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 पता ऑफ़सेट 0xe20 MISA MMIO (0xf0000000P) पर स्थित Hunit ROM Memory Base (HROMMB) रजिस्टर के माध्यम से प्राप्त कर सकते हैं:

ROM हमेशा ROMBASE से 0xffffffff तक रहता है। ROM को किसी फ़ाइल में कॉपी करने के लिए, निम्न कमांड चलाएँ:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
आकार को 0x20000 के बजाय 0x20001 के रूप में निर्दिष्ट करना महत्वपूर्ण है (अन्यथा OpenIPC को 64-बिट एक्सेस की समस्याओं के कारण समस्याएँ आती हैं, जो 32-बिट ME कोर के लिए संभव नहीं है)। फ़ाइल का अंतिम बाइट हटाया जा सकता है, क्योंकि यह ROM का हिस्सा नहीं है।
यह प्लेटफ़ॉर्म एक विशेष Intel CCA-SVT एडाप्टर के बिना डिबगिंग के अधिक अवसर देता है और एक साधारण USB डिबग केबल के माध्यम से TXE कोर के सबसे प्रारंभिक चरणों की डिबगिंग की अनुमति देता है।
Intel ME: स्थैतिक विश्लेषण का मार्ग
Intel ME: फ़्लैश फ़ाइल सिस्टम की व्याख्या
बंद कंप्यूटर को कैसे हैक करें या Intel Management Engine में अहस्ताक्षरित कोड कैसे चलाएँ
Intel Management Engine के अंदर
अप्रलेखित मोड के माध्यम से Intel ME 11 को अक्षम करना
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
इसके द्वारा, इस सॉफ़्टवेयर और संबंधित दस्तावेज़ीकरण फ़ाइलों ("सॉफ़्टवेयर") की एक प्रति प्राप्त करने वाले किसी भी व्यक्ति को, बिना शुल्क के, सॉफ़्टवेयर में बिना किसी प्रतिबंध के कार्य करने की अनुमति दी जाती है, जिसमें बिना किसी सीमा के सॉफ़्टवेयर की प्रतियों का उपयोग, प्रतिलिपि, संशोधन, विलय, प्रकाशन, वितरण, उपलाइसेंस और/या बिक्री करने के अधिकार शामिल हैं, तथा उन व्यक्तियों को, जिन्हें सॉफ़्टवेयर प्रदान किया गया है, ऐसा करने की अनुमति दी जाती है, निम्नलिखित शर्तों के अधीन: उपरोक्त कॉपीराइट सूचना और यह अनुमति सूचना सॉफ़्टवेयर की सभी प्रतियों या पर्याप्त भागों में शामिल की जाएगी।
सॉफ़्टवेयर "जैसा है" ("AS IS") प्रदान किया जाता है, बिना किसी प्रकार की वारंटी के, स्पष्ट या निहित, जिसमें व्यापारिकता, किसी विशेष उद्देश्य के लिए उपयुक्तता और गैर-उल्लंघन की वारंटियाँ शामिल हैं, लेकिन इन्हीं तक सीमित नहीं हैं। किसी भी स्थिति में लेखक या कॉपीराइट धारक किसी भी दावे, क्षति या अन्य दायित्व के लिए उत्तरदायी नहीं होंगे, चाहे वह अनुबंध, टोर्ट या अन्यथा की कार्रवाई में हो, जो सॉफ़्टवेयर से, उसके उपयोग से, या सॉफ़्टवेयर या सॉफ़्टवेयर में अन्य लेन-देन के संबंध में उत्पन्न होता है।