From 952ed053256a323d1b5278109fc124168caf3233 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 10 Aug 2025 16:35:34 +0000 Subject: [PATCH] Translated ['src/macos-hardening/macos-security-and-privilege-escalation --- .../macos-kernel-extensions.md | 125 +++++++++++++++--- 1 file changed, 103 insertions(+), 22 deletions(-) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md index 8ddd176ad..143f644ad 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md @@ -4,50 +4,82 @@ ## Basic Information -Kernel extensions (Kexts) **पैकेज** हैं जिनका **`.kext`** एक्सटेंशन होता है जो **macOS कर्नेल स्पेस में सीधे लोड** किए जाते हैं, मुख्य ऑपरेटिंग सिस्टम को अतिरिक्त कार्यक्षमता प्रदान करते हैं। +Kernel extensions (Kexts) **पैकेज** हैं जिनका **`.kext`** एक्सटेंशन होता है जो **macOS कर्नेल स्पेस में सीधे लोड** होते हैं, मुख्य ऑपरेटिंग सिस्टम को अतिरिक्त कार्यक्षमता प्रदान करते हैं। + +### Deprecation status & DriverKit / System Extensions +**macOS Catalina (10.15)** से शुरू होकर Apple ने अधिकांश पुराने KPI को *deprecated* के रूप में चिह्नित किया और **System Extensions & DriverKit** ढांचे को पेश किया जो **यूजर-स्पेस** में चलते हैं। **macOS Big Sur (11)** से ऑपरेटिंग सिस्टम *तीसरे पक्ष के kexts को लोड करने से इनकार करेगा* जो deprecated KPI पर निर्भर करते हैं जब तक कि मशीन **Reduced Security** मोड में बूट न हो। Apple Silicon पर, kexts को सक्षम करने के लिए उपयोगकर्ता को अतिरिक्त रूप से: + +1. **Recovery** में पुनः बूट करें → *Startup Security Utility*। +2. **Reduced Security** का चयन करें और **“Allow user management of kernel extensions from identified developers”** को टिक करें। +3. पुनः बूट करें और **System Settings → Privacy & Security** से kext को स्वीकृत करें। + +DriverKit/System Extensions के साथ लिखे गए यूजर-लैंड ड्राइवर **हमले की सतह को काफी कम** करते हैं क्योंकि क्रैश या मेमोरी भ्रष्टाचार एक सैंडबॉक्स प्रक्रिया तक सीमित होते हैं न कि कर्नेल स्पेस तक। + +> 📝 macOS Sequoia (15) से Apple ने कई पुराने नेटवर्किंग और USB KPI को पूरी तरह से हटा दिया है - विक्रेताओं के लिए एकमात्र आगे-संगत समाधान System Extensions में माइग्रेट करना है। ### Requirements -स्पष्ट रूप से, यह इतना शक्तिशाली है कि **कर्नेल एक्सटेंशन लोड करना जटिल है**। ये वे **आवश्यकताएँ** हैं जिन्हें एक कर्नेल एक्सटेंशन को लोड करने के लिए पूरा करना चाहिए: +स्पष्ट रूप से, यह इतना शक्तिशाली है कि **कर्नेल एक्सटेंशन लोड करना जटिल है**। ये **आवश्यकताएँ** हैं जो एक कर्नेल एक्सटेंशन को लोड करने के लिए पूरी करनी चाहिए: - जब **रिकवरी मोड में प्रवेश करते हैं**, कर्नेल **एक्सटेंशन को लोड करने की अनुमति होनी चाहिए**:
-- कर्नेल एक्सटेंशन को **कर्नेल कोड साइनिंग सर्टिफिकेट** के साथ **साइन** किया जाना चाहिए, जिसे केवल **Apple** द्वारा **प्रदान** किया जा सकता है। जो कंपनी और इसके आवश्यक होने के कारणों की विस्तार से समीक्षा करेगा। -- कर्नेल एक्सटेंशन को भी **नोटराइज** किया जाना चाहिए, Apple इसे मैलवेयर के लिए जांच सकेगा। -- फिर, **रूट** उपयोगकर्ता ही **कर्नेल एक्सटेंशन को लोड** कर सकता है और पैकेज के अंदर की फ़ाइलें **रूट** की होनी चाहिए। +- कर्नेल एक्सटेंशन को **कर्नेल कोड साइनिंग सर्टिफिकेट** के साथ **साइन** किया जाना चाहिए, जो केवल **Apple द्वारा** दिया जा सकता है। जो कंपनी और इसके आवश्यक होने के कारणों की विस्तार से समीक्षा करेगा। +- कर्नेल एक्सटेंशन को **नोटराइज** भी किया जाना चाहिए, Apple इसे मैलवेयर के लिए जांच सकेगा। +- फिर, **root** उपयोगकर्ता ही **कर्नेल एक्सटेंशन को लोड** कर सकता है और पैकेज के अंदर की फ़ाइलें **root** की होनी चाहिए। - अपलोड प्रक्रिया के दौरान, पैकेज को **संरक्षित नॉन-रूट स्थान** में तैयार किया जाना चाहिए: `/Library/StagedExtensions` (इसके लिए `com.apple.rootless.storage.KernelExtensionManagement` ग्रांट की आवश्यकता होती है)। -- अंत में, जब इसे लोड करने का प्रयास किया जाता है, तो उपयोगकर्ता [**एक पुष्टि अनुरोध प्राप्त करेगा**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) और, यदि स्वीकार किया गया, तो कंप्यूटर को इसे लोड करने के लिए **रीस्टार्ट** करना होगा। +- अंत में, जब इसे लोड करने का प्रयास किया जाता है, तो उपयोगकर्ता [**एक पुष्टि अनुरोध प्राप्त करेगा**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) और, यदि स्वीकार किया गया, तो कंप्यूटर को इसे लोड करने के लिए **पुनः प्रारंभ** करना होगा। ### Loading process -कैटालिना में यह इस प्रकार था: यह ध्यान देने योग्य है कि **सत्यापन** प्रक्रिया **यूजरलैंड** में होती है। हालाँकि, केवल वे एप्लिकेशन जिनके पास **`com.apple.private.security.kext-management`** ग्रांट है, वे **कर्नेल से एक्सटेंशन लोड करने का अनुरोध कर सकते हैं**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` +Catalina में यह इस प्रकार था: यह ध्यान देने योग्य है कि **सत्यापन** प्रक्रिया **यूजरलैंड** में होती है। हालाँकि, केवल **`com.apple.private.security.kext-management`** ग्रांट वाले एप्लिकेशन ही **कर्नेल से एक्सटेंशन लोड करने का अनुरोध कर सकते हैं**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` -1. **`kextutil`** cli **एक्सटेंशन लोड करने के लिए सत्यापन** प्रक्रिया **शुरू करता है** +1. **`kextutil`** cli **एक्सटेंशन लोड करने के लिए सत्यापन** प्रक्रिया शुरू करता है - यह **`kextd`** से **Mach सेवा** का उपयोग करके बात करेगा। 2. **`kextd`** कई चीजों की जांच करेगा, जैसे **हस्ताक्षर** -- यह **`syspolicyd`** से **जांच** करेगा कि क्या एक्सटेंशन को **लोड** किया जा सकता है। -3. **`syspolicyd`** उपयोगकर्ता को **प्रॉम्प्ट** करेगा यदि एक्सटेंशन पहले लोड नहीं किया गया है। +- यह **`syspolicyd`** से बात करेगा ताकि यह **जांच सके** कि क्या एक्सटेंशन को **लोड** किया जा सकता है। +3. **`syspolicyd`** **उपयोगकर्ता** से **प्रॉम्प्ट** करेगा यदि एक्सटेंशन पहले लोड नहीं किया गया है। - **`syspolicyd`** परिणाम को **`kextd`** को रिपोर्ट करेगा 4. अंततः **`kextd`** कर्नेल को एक्सटेंशन को लोड करने के लिए **बताने** में सक्षम होगा यदि **`kextd`** उपलब्ध नहीं है, तो **`kextutil`** वही जांच कर सकता है। -### Enumeration (loaded kexts) +### Enumeration & management (loaded kexts) + +`kextstat` ऐतिहासिक उपकरण था लेकिन यह हाल के macOS रिलीज़ में **deprecated** है। आधुनिक इंटरफ़ेस **`kmutil`** है: ```bash -# Get loaded kernel extensions +# List every extension currently linked in the kernel, sorted by load address +sudo kmutil showloaded --sort + +# Show only third-party / auxiliary collections +sudo kmutil showloaded --collection aux + +# Unload a specific bundle +sudo kmutil unload -b com.example.mykext +``` +पुरानी सिंटैक्स अभी भी संदर्भ के लिए उपलब्ध है: +```bash +# (Deprecated) Get loaded kernel extensions kextstat -# Get dependencies of the kext number 22 +# (Deprecated) Get dependencies of the kext number 22 kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1 ``` +`kmutil inspect` का उपयोग **Kernel Collection (KC)** की सामग्री को **dump** करने या यह सत्यापित करने के लिए भी किया जा सकता है कि एक kext सभी प्रतीक निर्भरताओं को हल करता है: +```bash +# List fileset entries contained in the boot KC +kmutil inspect -B /System/Library/KernelCollections/BootKernelExtensions.kc --show-fileset-entries + +# Check undefined symbols of a 3rd party kext before loading +kmutil libraries -p /Library/Extensions/FancyUSB.kext --undef-symbols +``` ## Kernelcache > [!CAUTION] -> भले ही कर्नेल एक्सटेंशन `/System/Library/Extensions/` में होने की उम्मीद की जाती है, यदि आप इस फ़ोल्डर में जाते हैं तो आप **कोई बाइनरी नहीं पाएंगे**। इसका कारण **कर्नेलकैश** है और एक `.kext` को रिवर्स करने के लिए आपको इसे प्राप्त करने का एक तरीका खोजना होगा। +> हालांकि कर्नेल एक्सटेंशन `/System/Library/Extensions/` में होने की उम्मीद है, यदि आप इस फ़ोल्डर में जाते हैं तो आपको **कोई बाइनरी नहीं मिलेगी**। इसका कारण **कर्नेलकैश** है और एक `.kext` को रिवर्स करने के लिए आपको इसे प्राप्त करने का एक तरीका खोजना होगा। -**कर्नेलकैश** **XNU कर्नेल** का एक **पूर्व-संकलित और पूर्व-लिंक किया गया संस्करण** है, साथ ही आवश्यक डिवाइस **ड्राइवर** और **कर्नेल एक्सटेंशन** भी। इसे एक **संकुचित** प्रारूप में संग्रहीत किया जाता है और बूट-अप प्रक्रिया के दौरान मेमोरी में अनसंकुचित किया जाता है। कर्नेलकैश एक **तेज़ बूट समय** को सुविधाजनक बनाता है क्योंकि इसमें कर्नेल और महत्वपूर्ण ड्राइवरों का एक तैयार-से-चलाने वाला संस्करण उपलब्ध होता है, जिससे बूट समय पर इन घटकों को गतिशील रूप से लोड और लिंक करने में लगने वाले समय और संसाधनों की बचत होती है। +**कर्नेलकैश** **XNU कर्नेल** का एक **पूर्व-संकलित और पूर्व-लिंक किया गया संस्करण** है, साथ ही आवश्यक डिवाइस **ड्राइवर** और **कर्नेल एक्सटेंशन** भी। इसे **संकुचित** प्रारूप में संग्रहीत किया जाता है और बूट-अप प्रक्रिया के दौरान मेमोरी में अनसंकुचित किया जाता है। कर्नेलकैश एक **तेज़ बूट समय** को सुविधाजनक बनाता है क्योंकि इसमें कर्नेल और महत्वपूर्ण ड्राइवरों का एक तैयार-से-चलाने वाला संस्करण उपलब्ध होता है, जिससे बूट समय पर इन घटकों को गतिशील रूप से लोड और लिंक करने में लगने वाले समय और संसाधनों की बचत होती है। ### Local Kerlnelcache @@ -69,13 +101,13 @@ IMG4 फ़ाइल प्रारूप एक कंटेनर प्र - हस्ताक्षर शामिल है - अतिरिक्त कुंजी/मान शब्दकोश - **Restore Info (IM4R)**: -- जिसे APNonce के रूप में भी जाना जाता है +- APNonce के रूप में भी जाना जाता है - कुछ अपडेट के पुनः खेलने से रोकता है - वैकल्पिक: आमतौर पर यह नहीं पाया जाता कर्नेलकैश को अनसंकुचित करें: ```bash -# img4tool (https://github.com/tihmstar/img4tool +# img4tool (https://github.com/tihmstar/img4tool) img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e # pyimg4 (https://github.com/m1stadev/PyIMG4) @@ -95,9 +127,9 @@ nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l कभी-कभी Apple **kernelcache** को **symbols** के साथ जारी करता है। आप उन पृष्ठों पर दिए गए लिंक का पालन करके कुछ firmware को symbols के साथ डाउनलोड कर सकते हैं। firmware में अन्य फ़ाइलों के साथ **kernelcache** शामिल होगा। -फ़ाइलों को **extract** करने के लिए `.ipsw` से `.zip` में एक्सटेंशन बदलकर शुरू करें और **unzip** करें। +फ़ाइलों को **extract** करने के लिए, पहले `.ipsw` से `.zip` में एक्सटेंशन बदलें और फिर **unzip** करें। -Firmware को extract करने के बाद आपको एक फ़ाइल मिलेगी जैसे: **`kernelcache.release.iphone14`**। यह **IMG4** प्रारूप में है, आप इसे निम्नलिखित के साथ दिलचस्प जानकारी निकाल सकते हैं: +Firmware को extract करने के बाद आपको एक फ़ाइल मिलेगी जैसे: **`kernelcache.release.iphone14`**। यह **IMG4** प्रारूप में है, आप इसमें से दिलचस्प जानकारी को निकाल सकते हैं: [**pyimg4**](https://github.com/m1stadev/PyIMG4)**:** ```bash @@ -126,11 +158,60 @@ kextex_all kernelcache.release.iphone14.e # Check the extension for symbols nm -a binaries/com.apple.security.sandbox | wc -l ``` -## डिबगिंग +## हाल की कमजोरियाँ और शोषण तकनीकें + +| वर्ष | CVE | सारांश | +|------|-----|---------| +| 2024 | **CVE-2024-44243** | **`storagekitd`** में लॉजिक दोष ने *root* हमलावर को एक दुर्भावनापूर्ण फ़ाइल-प्रणाली बंडल पंजीकृत करने की अनुमति दी, जिसने अंततः एक **unsigned kext** लोड किया, **System Integrity Protection (SIP)** को बायपास किया और स्थायी रूटकिट सक्षम किया। macOS 14.2 / 15.2 में पैच किया गया। | +| 2021 | **CVE-2021-30892** (*Shrootless*) | `com.apple.rootless.install` अधिकार के साथ स्थापना डेमन का दुरुपयोग किया जा सकता है ताकि मनमाने पोस्ट-इंस्टॉल स्क्रिप्ट को निष्पादित किया जा सके, SIP को निष्क्रिय किया जा सके और मनमाने kexts को लोड किया जा सके। | + +**रेड-टीमर्स के लिए सीखने योग्य बातें** + +1. **Disk Arbitration, Installer या Kext Management के साथ इंटरैक्ट करने वाले अधिकार प्राप्त डेमन्स (`codesign -dvv /path/bin | grep entitlements`) की तलाश करें।** +2. **SIP बायपास का दुरुपयोग लगभग हमेशा एक kext लोड करने की क्षमता प्रदान करता है → कर्नेल कोड निष्पादन**। + +**रक्षा संबंधी सुझाव** + +*SIP को सक्षम रखें*, गैर-Apple बाइनरी से आने वाले `kmutil load`/`kmutil create -n aux` कॉल्स की निगरानी करें और `/Library/Extensions` में किसी भी लेखन पर अलर्ट करें। एंडपॉइंट सुरक्षा घटनाएँ `ES_EVENT_TYPE_NOTIFY_KEXTLOAD` लगभग वास्तविक समय की दृश्यता प्रदान करती हैं। + +## macOS कर्नेल और kexts का डिबगिंग + +Apple की अनुशंसित कार्यप्रणाली एक **Kernel Debug Kit (KDK)** बनाने की है जो चल रहे निर्माण से मेल खाती है और फिर **KDP (Kernel Debugging Protocol)** नेटवर्क सत्र के माध्यम से **LLDB** को संलग्न करती है। + +### एक बार का स्थानीय पैनिक डिबगिंग +```bash +# Create a symbolication bundle for the latest panic +sudo kdpwrit dump latest.kcdata +kmutil analyze-panic latest.kcdata -o ~/panic_report.txt +``` +### Live remote debugging from another Mac + +1. डाउनलोड करें + लक्ष्य मशीन के लिए सही **KDK** संस्करण स्थापित करें। +2. लक्ष्य Mac और होस्ट Mac को **USB-C या Thunderbolt केबल** से कनेक्ट करें। +3. **लक्ष्य** पर: +```bash +sudo nvram boot-args="debug=0x100 kdp_match_name=macbook-target" +reboot +``` +4. **होस्ट** पर: +```bash +lldb +(lldb) kdp-remote "udp://macbook-target" +(lldb) bt # get backtrace in kernel context +``` +### एक विशेष लोड किए गए kext के लिए LLDB को संलग्न करना +```bash +# Identify load address of the kext +ADDR=$(kmutil showloaded --bundle-identifier com.example.driver | awk '{print $4}') + +# Attach +sudo lldb -n kernel_task -o "target modules load --file /Library/Extensions/Example.kext/Contents/MacOS/Example --slide $ADDR" +``` +> ℹ️ KDP केवल एक **पढ़ने-के लिए** इंटरफ़ेस प्रदान करता है। गतिशील इंस्ट्रुमेंटेशन के लिए, आपको बाइनरी को डिस्क पर पैच करना होगा, **कर्नेल फ़ंक्शन हुकिंग** (जैसे `mach_override`) का उपयोग करना होगा या पूर्ण पढ़ने/लिखने के लिए ड्राइवर को **हाइपरवाइज़र** में माइग्रेट करना होगा। ## संदर्भ -- [https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/](https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/) -- [https://www.youtube.com/watch?v=hGKOskSiaQo](https://www.youtube.com/watch?v=hGKOskSiaQo) +- DriverKit सुरक्षा – Apple प्लेटफ़ॉर्म सुरक्षा गाइड +- Microsoft सुरक्षा ब्लॉग – *CVE-2024-44243 SIP बायपास का विश्लेषण* {{#include ../../../banners/hacktricks-training.md}}