
kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.
संक्षिप्त अस्वीकरण: मेरा अन्य उपकरणों और iOS संस्करणों के लिए ऑफ़सेट जोड़ने का कोई इरादा नहीं है।
kfd, जो kernel file descriptor का संक्षिप्त रूप है, Apple उपकरणों पर kernel मेमोरी पढ़ने और लिखने की एक परियोजना है। यह विभिन्न कमजोरियों का लाभ उठाता है जिनका दोहन करके dangling PTE प्राप्त किए जा सकते हैं, जिन्हें PUAF primitive कहा जाएगा, जो "physical use-after-free" का संक्षिप्त रूप है। फिर, यह उन physical pages के अंदर कुछ kernel objects को पुनः आवंटित करता है और KRKW primitive प्राप्त करने के लिए dangling PTEs के माध्यम से उन्हें सीधे user space से manipulate करता है, जो "kernel read/write" का संक्षिप्त रूप है। exploit कोड पूरी तरह से एक लाइब्रेरी, libkfd में समाहित है, लेकिन परियोजना में iOS और macOS के लिए सरल executable wrappers भी शामिल हैं। libkfd का public API काफी छोटा और सहज है:
enum puaf_method {
puaf_physpuppet,
puaf_smith,
puaf_landa,
};
enum kread_method {
kread_kqueue_workloop_ctl,
kread_sem_open,
};
enum kwrite_method {
kwrite_dup,
kwrite_sem_open,
};
u64 kopen(u64 puaf_pages, u64 puaf_method, u64 kread_method, u64 kwrite_method);
void kread(u64 kfd, u64 kaddr, void* uaddr, u64 size);
void kwrite(u64 kfd, void* uaddr, u64 kaddr, u64 size);
void kclose(u64 kfd);
kopen() सैद्धांतिक रूप से एक "kernel file descriptor" खोलता है। यह निम्नलिखित 4 तर्क लेता है:
puaf_pages: dangling PTE वाले physical pages की लक्षित संख्या।puaf_method: PUAF primitive प्राप्त करने के लिए उपयोग की जाने वाली विधि, निम्नलिखित विकल्पों के साथ:
puaf_physpuppet:
puaf_smith:
puaf_landa:
kread_method: प्रारंभिक kread() primitive प्राप्त करने के लिए उपयोग की जाने वाली विधि।kwrite_method: प्रारंभिक kwrite() primitive प्राप्त करने के लिए उपयोग की जाने वाली विधि।यदि exploit सफल होता है, तो kopen() एक 64-bit opaque file descriptor लौटाता है। व्यवहार में, यह libkfd के लिए आवश्यक एक structure की ओर इशारा करने वाला user space pointer मात्र है। हालाँकि, चूँकि उस structure को लाइब्रेरी के बाहर एक्सेस नहीं किया जाना चाहिए, इसे एक opaque integer के रूप में लौटाया जाता है। यदि exploit असफल होता है, तो लाइब्रेरी एक error message print करेगी, 30 सेकंड के लिए sleep करेगी, फिर status code 1 के साथ exit हो जाएगी। यह 30 सेकंड के लिए sleep करती है क्योंकि कुछ PUAF विधियों के लिए kernel exit पर panic हो सकता है जिन्हें KRKW के बाद कुछ cleanup की आवश्यकता होती है (जैसे puaf_smith)।
kread() और kwrite() क्रमशः copyout() और copyin() के user space समकक्ष हैं। कृपया ध्यान दें कि kread_method और kwrite_method के विकल्प एक अलग write-up में वर्णित हैं। इसके अलावा, उन विधियों द्वारा प्रदान किए गए प्रारंभिक primitives का उपयोग बेहतर KRKW primitive को bootstrap करने के लिए किया जा सकता है। अंत में, kclose() केवल kernel file descriptor को बंद करता है। ये सभी अपने पहले तर्क के रूप में kopen() द्वारा लौटाया गया opaque integer लेते हैं।
Xcode में, परियोजना के root folder को खोलें और अपना iOS device कनेक्ट करें।
एक terminal में, परियोजना के root folder पर जाएँ।
वैकल्पिक रूप से, वैश्विक और प्रति-प्रक्रिया file descriptor सीमाएँ बढ़ाने के लिए, जो विशेष रूप से लगातार कई runs पर सफलता दर में सुधार करेंगी, make s कमांड दर्ज करें और sudo पासवर्ड टाइप करें।
make b कमांड दर्ज करें।make r कमांड दर्ज करें।make br कमांड दर्ज करें।इस README ने kfd परियोजना का उच्च-स्तरीय अवलोकन प्रस्तुत किया। एक बार PUAF primitive प्राप्त हो जाने पर, बाकी exploit सामान्य (generic) होता है। इसलिए, मैंने exploits के सामान्य भाग को एक समर्पित write-up में रखा है:
इसके अलावा, मैंने PUAF primitive प्राप्त करने के लिए उपयोग किए जाने वाले exploits के vulnerability-विशिष्ट भाग को अलग-अलग write-ups में विभाजित किया है, जो खोज के कालानुक्रमिक क्रम में नीचे सूचीबद्ध हैं:
हालाँकि, कृपया ध्यान दें कि ये write-ups ऐसे पाठकों के लिए लिखे गए हैं जो पहले से ही XNU virtual memory system से परिचित हैं।