
PS5 के लिए एक वेबकिट-आधारित कर्नेल एक्सप्लॉइट और जेलब्रेक
इस रिपॉजिटरी में एक WebKit ROP एक्सप्लॉइट है जो UMTX रेस use-after-free (CVE-2024-43102) भेद्यता का शोषण करता है, जिसे Synacktiv द्वारा रिपोर्ट किया गया था। यह मूल रूप से fail0verflow और flatz की एक्सप्लॉइट रणनीति का पोर्ट है। यह कर्नेल थ्रेड स्टैक में read/write मैपिंग पाने के लिए UAF का दुरुपयोग करता है, और कर्नेल में (बिल्कुल आदर्श नहीं) मनमाना read/write प्रिमिटिव स्थापित करने के लिए पाइप रीड और राइट का लाभ उठाता है। इस read/write को फिर एक बेहतर प्रिमिटिव तक उन्नत किया जाता है जो स्थिर read/write के लिए एक ipv6 सॉकेट जोड़ी और पाइप जोड़ी का लाभ उठाता है, जिसे पिछले IPV6 PS5 कर्नेल एक्सप्लॉइट के समान तरीके से पेलोड्स को पारित किया जा सकता है।
यह पेज स्वयं idlesauce का PS5 एक्सप्लॉइट होस्ट का एक छोटा और संशोधित संस्करण है, क्योंकि उसमें पहले से ही psfree को मेरी पहले इस्तेमाल की गई कोड शैली से जोड़ने का काम किया गया था। यह होस्ट चीजों को चलाने के लिए मेरी व्यक्तिगत पसंद भी है क्योंकि यह बहुत सहज है और उपयोगी पेलोड्स को एकीकृत करता है, उम्मीद है कि निकट भविष्य में इसे इस एक्सप्लॉइट को सपोर्ट करने के लिए अपडेट किया जाएगा <3।
अंततः एक पेलोड लोडर लॉन्च किया जाएगा जो पोर्ट 9021 पर पेलोड ELF की सुनवाई करेगा। मैं PS5 Payload Dev SDK की अनुशंसा करता हूं, क्योंकि कर्नेल ऑफसेट जोड़े जाने पर इस लोडर के साथ इसकी पूर्ण संगतता होनी चाहिए।
यह भेद्यता 1.00 फर्मवेयर से 7.61 फर्मवेयर को प्रभावित करती है, हालांकि FW >= 3.00 में अतिरिक्त शमन प्रतीत होते हैं जिनके लिए एक्सप्लॉइट को काम करने हेतु बदलाव की आवश्यकता होती है। चूंकि मैं ज्यादातर केवल निचले फर्मवेयर में रुचि रखता हूं, यह एक्सप्लॉइट अभी तक FW >= 3.00 का समर्थन नहीं करता है। इसके अलावा, जिस WebKit भेद्यता को हम चेन करते हैं उसे 6.00 में पैच कर दिया गया था, इसलिए इन प्रणालियों के लिए एक और WebKit एक्सप्लॉइट की आवश्यकता होगी जो यूजरलैंड read/write प्राप्त करता है। फिर से, चूंकि मैं उच्च फर्मवेयर पर केंद्रित नहीं हूं, इसे अभी अधूरा छोड़ दिया गया है।
महत्वपूर्ण नोट्स
निम्नलिखित फर्मवेयर वर्तमान में समर्थित हैं:
manuals.playstation.net को इंगित करने के लिए dns.conf के माध्यम से fakedns कॉन्फ़िगर करेंpython fakedns.py -c dns.confpython host.py0.0.0.0 पर छोड़ दें
ELF लोडर का उपयोग करने के लिए, एक्सप्लॉइट को पूर्णता तक चलाएं। पूरा होने पर यह पोर्ट :9021 पर एक सर्वर चलाएगा। कनेक्ट करें और अपने ELF को TCP के माध्यम से PS5 को भेजें और यह उसे चलाएगा। यह लोडर ब्राउज़र से बाहर निकलने के बाद भी पेलोड्स को स्वीकार और निष्पादित करता रहना चाहिए।
प्रारंभिक डबल फ्री
इस एक्सप्लॉइट की रणनीति काफी हद तक fail0verflow और flatz से आती है। भेद्यता पर अधिक जानकारी के लिए chris@accessvector का राइटअप देखें। एक्सप्लॉइट करने पर, यह अनिवार्य रूप से हमें एक डबल फ्री देता है। हम इसका उपयोग कर्नेल स्टैक के vmobject को mmap मैपिंग के साथ ओवरलैप करने के लिए कर सकते हैं, जिससे कर्नेल थ्रेड के स्टैक में एक खिड़की मिलती है। यह अत्यंत शक्तिशाली क्षमता हमें स्टैक पर मनमाने कर्नेल पॉइंटर्स को read/write करने की अनुमति देती है, जिससे ASLR विफल हो जाता है और प्रिमिटिव बनाने की क्षमता मिलती है। जिस थ्रेड के स्टैक तक हमारी पहुंच है, हम उसे विक्टिम थ्रेड कहेंगे।
मनमाना read/write प्राप्त करना
मुख्य थ्रेड पर एक पाइप बनाकर और पाइप बफर को भरकर, फिर विक्टिम थ्रेड का उपयोग करके उसमें लिखने का प्रयास करके, विक्टिम थ्रेड बफर में जगह खाली होने की प्रतीक्षा में ब्लॉक हो जाएगा। इस दौरान, हम कर्नेल स्टैक में अपनी खिड़की का उपयोग करके iovec पॉइंटर्स को कर्नेल पॉइंटर्स में बदल सकते हैं और फ्लैग सेट कर सकते हैं ताकि उन्हें कर्नेल एड्रेस के रूप में माना जाए। फिर मुख्य थ्रेड पर पाइप पढ़कर, हम कर्नेल मनमाना read प्राप्त कर सकते हैं।
इसी तरह, विक्टिम थ्रेड को पाइप पर पढ़ने के लिए प्रेरित करके, यह आने वाले डेटा की प्रतीक्षा में ब्लॉक हो जाएगा। फिर हम, फिर से, iovec पॉइंटर्स को ओवरराइट करके उन्हें कर्नेल पॉइंटर्स बना सकते हैं, और कर्नेल मनमाना write प्राप्त करने के लिए मुख्य थ्रेड पर डेटा लिख सकते हैं।
मनमाने read/write को उन्नत करना
इस चरण तक, हमारे पास बिना किसी वास्तविक बाधा के एक मनमाना read/write होता है, लेकिन हम इसके काम करने के लिए मल्टीथ्रेडिंग और ब्लॉकिंग का उपयोग करने से बंधे होते हैं, जो आदर्श नहीं है। फिर हम प्रक्रिया की FD तालिका को पुनरावृत्त करने और दो IPV6 सॉकेट्स के pktopts को ओवरलैप करने के लिए R/W का उपयोग करते हैं। फिर हम IPV6_PKTINFO sockopt के माध्यम से एक और मनमाना read/write बना सकते हैं। यह read/write प्रिमिटिव फिर से आदर्श नहीं है, क्योंकि यह अंतर्निहित सॉकेट विकल्प के कारण आकार और सामग्री में सीमित है। हम इस चरण को ज्यादातर IPV6 एक्सप्लॉइट के परिदृश्य का अनुकरण करने के लिए रखते हैं, जिस पर अधिकांश पेलोड और इसी तरह की चीजें बनाई गई थीं।
हम पाइप के माध्यम से बेहतर read/write प्राप्त कर सकते हैं। प्रक्रिया की FD तालिका को फिर से पुनरावृत्त करके और pipemap बफर ऑब्जेक्ट्स को संशोधित करके, हम read/write स्थापित कर सकते हैं। IPV6 सॉकेट जोड़ी का उपयोग pipemap बफर को नियंत्रित करने के लिए एक तंत्र के रूप में किया जाता है।
करप्शन को ठीक करना/टालना
यदि हम चीजों को वैसे ही छोड़ देते हैं और ब्राउज़र को बंद करने का प्रयास करते हैं, तो सिस्टम क्रैश हो जाएगा। ऐसा इसलिए है क्योंकि प्रक्रिया क्लीनअप उस कर्नेल स्टैक को फ्री करने का प्रयास करेगा जो पहले ही फ्री किया जा चुका है। इससे बचने के लिए, हम दो काम करते हैं:
td_kstack को शून्य करें।FW < 3.00 पर, यह एक्सप्लॉइट बहुत स्थिर है। विफलता का एकमात्र महत्वपूर्ण बिंदु vmobjects को ओवरलैप करने में विफल होना है। उच्च फर्मवेयर पर, पेज/हीप आवंटनकर्ता स्तर पर कथित शमन के कारण यह ओवरलैप प्राप्त करना अधिक कठिन है।
PS5 अनुसंधान/विकास में योगदान करने में रुचि रखने वाले यहां मेरे द्वारा सेटअप किए गए डिस्कॉर्ड से जुड़ सकते हैं।