
AMD navi31 (RX 7900) GPU के लिए PSP exploit जो firmware signature जाँचों को अक्षम कर देता है ताकि कार्ड अहस्ताक्षरित SMU, SDMA, MEC, IMU और RLC firmware लोड कर सके; cold boot के बाद यह स्थायी नहीं रहता।
AMD navi31 कार्ड (RX 7900 श्रृंखला) के लिए एक PSP (Platform Security Processor) एक्सप्लॉइट। संभवतः अन्य निकटवर्ती उत्पाद परिवारों के लिए भी अनुकूलनीय है।
यह PSP के फर्मवेयर हस्ताक्षर जाँच को बंद कर देता है, इसलिए कार्ड अहस्ताक्षरित IP फर्मवेयर (SMU, SDMA, MEC, IMU, RLC) लोड करेगा जिसे वह अन्यथा मना कर देता। कस्टम पावर मैनेजमेंट, क्लॉक सीमाओं, या वेंडर द्वारा हस्ताक्षरित और आपके द्वारा नहीं, ऐसे फर्मवेयर में रहने वाली किसी भी अन्य चीज़ के बारे में सोचें।
कुछ भी फ्लैश नहीं किया जाता। पैच PSP मेमोरी में रहता है और वार्म बूट के दौरान लागू होता है; कोल्ड पावर साइकल इसे मिटा देता है और कार्ड फिर स्टॉक हो जाता है। वह वार्म बूट ही "Wake and Break" है: कार्ड जागता है, हम उसे तुरंत बहुत ऊँचा होने के लिए मना लेते हैं और उसे हस्ताक्षर जाँच को निष्क्रिय करने के लिए मजबूर करते हैं। :-)
RX 7900 XTX पर कार्ड-परीक्षित। देखें Status।
python3 wakebreak.py 25=/path/to/firmware.bin
यह पैच लगाता है, कार्ड को वार्म-बूट करता है, और आपकी इमेज को फर्मवेयर टाइप 25 के रूप में सबमिट करता है। यदि यह accepted प्रिंट करता है, तो PSP ने एक ऐसी इमेज स्वीकार कर ली है जिसे वह सामान्यतः अस्वीकार कर देता।
इसे आज़माने के लिए कुछ चाहिए? ipfw_images.py उस फर्मवेयर की सूची बनाता है जिसे आपका ड्राइवर वास्तव में लोड करता है और एक टेस्ट पेयर लिखता है — एक असली इमेज और एक कॉपी जिसके सिग्नेचर में एक बिट फ़्लिप किया गया है, ताकि फर्मवेयर स्वयं बाइट-दर-बाइट समान रहे:
python3 ipfw_images.py # what does this card load?
python3 ipfw_images.py 25 # -> /tmp/fw_25_{ok,bad}.bin
python3 wakebreak.py 25=/tmp/fw_25_bad.bin
स्टॉक फर्मवेयर fw_25_bad.bin को अस्वीकार करता है। पैच लागू होने पर इसे स्वीकार कर लिया जाता है।
यही पूरा प्रदर्शन है।
python3 -m venv venv
venv/bin/pip install -r requirements.txt
make verify # are the shipped artifacts intact?
make selftest # offline sanity checks, no card touched
आपको एक Linux होस्ट चाहिए जिसमें कार्ड
tinygrad के AMD ड्राइवर (PCIe या उसके USB
ब्रिज) के माध्यम से पहुँच योग्य हो। अपने होस्ट के लिए आवश्यक एक tinygrad पैच के लिए requirements.txt देखें।
navi31 के चार ज्ञात फर्मवेयर बिल्ड हैं, और पैच को उनसे मेल खाना चाहिए।
प्रोफ़ाइल a डिफ़ॉल्ट है और सबसे सामान्य बिल्ड को कवर करती है। यदि आपके पास अपने कार्ड की SPI फ़्लैश का डंप है, तो identify.py आपको बताएगा:
python3 identify.py FLASH.bin
# -> sos-build c: wakebreak.py --sos-build c
अन्यथा बस उन्हें आज़माएँ। गलत अनुमान लगाना हानिरहित है: पैच यह जाँचता है कि वह क्या संशोधित करने वाला है, कोई ऐसी चीज़ पाता है जिसे वह नहीं पहचानता, कुछ भी नहीं लिखता, और कार्ड सामान्य रूप से बूट हो जाता है।
python3 wakebreak.py --sos-build c 25=/tmp/fw_25_bad.bin
परीक्षण किए गए कार्ड (RX 7900 XTX, प्रोफ़ाइल a) पर पुष्टि की गई:
| छेड़छाड़ किया गया फ़र्मवेयर, स्टॉक कार्ड | अस्वीकृत |
| छेड़छाड़ किया गया फ़र्मवेयर, पैच किया गया | स्वीकृत |
| कोल्ड पावर साइकल के बाद | फिर से अस्वीकृत — कार्ड स्टॉक है |
नोट: प्रोफ़ाइल b, c और d बनाए और ऑफ़लाइन जाँचे गए हैं, लेकिन हार्डवेयर पर कभी नहीं चलाए गए हैं। यदि आपके पास प्रोफ़ाइल b, c या d से मेल खाने वाला कार्ड है, तो कृपया बताएँ कि यह काम करता है या नहीं!
पैच स्वयं hook/*.S में ARM असेंबली के कुछ सौ बाइट्स है। निर्मित ब्लॉब्स रेपो के साथ भेजे जाते हैं, इसलिए इसका उपयोग करने के लिए आपको क्रॉस कंपाइलर की आवश्यकता नहीं है। यदि आप फिर भी उन्हें पुनर्निर्माण करना चाहते हैं:
make rebuild # needs arm-none-eabi binutils
make rebuild CROSS=/path/to/arm-none-eabi-
बिल्ड ऐसी किसी भी चीज़ को इंस्टॉल करने से इनकार कर देता है जिसका हैश उन बाइट्स से मेल नहीं खाता जिन्हें किसी कार्ड पर परीक्षण किया गया था, इसलिए कोई भिन्न टूलचेन चुपचाप यह नहीं बदल सकता कि आपके PSP पर क्या लिखा जाता है।
wakebreak.py the exploit
identify.py which --sos-build does this card need?
ipfw_images.py build a signed/tampered firmware pair to test with
selftest.py offline checks
hook/ the patch: ARM sources and built blobs
firmware/ two stock AMD firmware images the exploit needs to get in
firmware/ में असंशोधित, सार्वजनिक रूप से जारी किए गए AMD इमेज हैं। ये पुराने
संस्करण हैं, जिन्हें इसलिए रखा गया है क्योंकि इन्हीं के माध्यम से अंदर जाने का रास्ता बनता है।
यहाँ जानबूझकर शामिल नहीं किया गया: कोड पढ़ें। wakebreak.py लगभग 600 टिप्पणी-युक्त
पंक्तियाँ हैं और टिप्पणियाँ तंत्र, सुरक्षा जाँचों और यह क्यों हर चरण का क्रम इसी तरह है, यह समझाती हैं। TL;DR: दो स्टॉक AMD ट्रस्टेड
एप्लिकेशन लोड किए जाते हैं, उनमें से एक को ऐसी चेन चलाने के लिए मनाया जाता है जो PSP मेमोरी लिख सके, पैच को बूटलोडर की निवासी प्रति में रखा जाता है, और
फिर कार्ड को उसमें वार्म-बूट किया जाता है।
MIT, देखें LICENSE। इसके साथ जो चाहें करें।
इस कार्य को तैयार करने में भारी LLM सहायता का उपयोग किया गया था। इसका मतलब यह नहीं है कि लेखक को इस बात की कोई जानकारी नहीं है कि यहाँ वास्तव में क्या हो रहा है। यहाँ तक पहुँचने के लिए भी बहुत सारे विरोध और मैन्युअल काम शामिल थे। आपको ये स्लॉप्ड पायथन आर्टिफैक्ट्स या जो भी हो पसंद न आएँ, लेकिन आप इस तथ्य से बहस नहीं कर पाएँगे कि आपका Navi31 कार्ड अब अचानक अहस्ताक्षरित फर्मवेयर कंपोनेंट ब्लॉब्स लोड करता है। ध्यान देने के लिए धन्यवाद।