Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-08-10 16:34:43 +00:00
parent 2e571b4dae
commit f7b02e4e43

View File

@ -6,11 +6,22 @@
Οι επεκτάσεις πυρήνα (Kexts) είναι **πακέτα** με κατάληξη **`.kext`** που **φορτώνονται απευθείας στον χώρο του πυρήνα macOS**, παρέχοντας επιπλέον λειτουργικότητα στο κύριο λειτουργικό σύστημα.
### Deprecation status & DriverKit / System Extensions
Αρχής γενομένης από **macOS Catalina (10.15)**, η Apple χαρακτήρισε τις περισσότερες κληρονομημένες KPI ως *παρωχημένες* και εισήγαγε τα **System Extensions & DriverKit** frameworks που εκτελούνται σε **user-space**. Από **macOS Big Sur (11)**, το λειτουργικό σύστημα θα *αρνείται να φορτώσει* τρίτες επεκτάσεις kext που βασίζονται σε παρωχημένες KPI εκτός αν η μηχανή εκκινείται σε **Reduced Security** mode. Σε Apple Silicon, η ενεργοποίηση των kext απαιτεί επιπλέον από τον χρήστη να:
1. Επανεκκινήσει σε **Recovery***Startup Security Utility*.
2. Επιλέξει **Reduced Security** και να τσεκάρει **“Allow user management of kernel extensions from identified developers”**.
3. Επανεκκινήσει και να εγκρίνει την kext από **System Settings → Privacy & Security**.
Οι οδηγοί χρήστη που έχουν γραφτεί με DriverKit/System Extensions μειώνουν δραματικά την **επιφάνεια επίθεσης** επειδή οι κρασάρισμα ή η διαφθορά μνήμης περιορίζονται σε μια διαδικασία sandboxed αντί για τον χώρο του πυρήνα.
> 📝 Από το macOS Sequoia (15), η Apple έχει αφαιρέσει εντελώς πολλές κληρονομημένες KPI δικτύωσης και USB η μόνη συμβατή λύση για τους προμηθευτές είναι να μεταναστεύσουν σε System Extensions.
### Requirements
Προφανώς, αυτό είναι τόσο ισχυρό που είναι **περίπλοκο να φορτωθεί μια επέκταση πυρήνα**. Αυτές είναι οι **απαιτήσεις** που πρέπει να πληροί μια επέκταση πυρήνα για να φορτωθεί:
- Όταν **μπαίνετε σε λειτουργία ανάκτησης**, οι **επικοινωνίες πυρήνα πρέπει να επιτρέπονται** να φορτωθούν:
- Όταν **μπαίνετε σε λειτουργία ανάκτησης**, οι επεκτάσεις πυρήνα **πρέπει να επιτρέπεται** να φορτωθούν:
<figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure>
@ -22,26 +33,47 @@
### Loading process
Στο Catalina ήταν έτσι: Είναι ενδιαφέρον να σημειωθεί ότι η **διαδικασία επαλήθευσης** συμβαίνει σε **userland**. Ωστόσο, μόνο οι εφαρμογές με την **χορήγηση `com.apple.private.security.kext-management`** μπορούν να **ζητήσουν από τον πυρήνα να φορτώσει μια επέκταση**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
Στο Catalina ήταν έτσι: Είναι ενδιαφέρον να σημειωθεί ότι η **διαδικασία επαλήθευσης** συμβαίνει σε **userland**. Ωστόσο, μόνο οι εφαρμογές με την **`com.apple.private.security.kext-management`** χορήγηση μπορούν να **ζητήσουν από τον πυρήνα να φορτώσει μια επέκταση**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
1. **`kextutil`** cli **ξεκινά** τη **διαδικασία επαλήθευσης** για τη φόρτωση μιας επέκτασης
- Θα επικοινωνήσει με **`kextd`** στέλνοντας χρησιμοποιώντας μια **υπηρεσία Mach**.
- Θα επικοινωνήσει με **`kextd`** στέλνοντας χρησιμοποιώντας μια **Mach service**.
2. **`kextd`** θα ελέγξει διάφορα πράγματα, όπως την **υπογραφή**
- Θα επικοινωνήσει με **`syspolicyd`** για να **ελέγξει** αν η επέκταση μπορεί να **φορτωθεί**.
3. **`syspolicyd`** θα **ζητήσει** από τον **χρήστη** αν η επέκταση δεν έχει φορτωθεί προηγουμένως.
- **`syspolicyd`** θα αναφέρει το αποτέλεσμα στο **`kextd`**
4. **`kextd`** θα είναι τελικά σε θέση να **πεί** στον πυρήνα να φορτώσει την επέκταση
4. **`kextd`** θα είναι τελικά σε θέση να **πείσει τον πυρήνα να φορτώσει** την επέκταση
Αν **`kextd`** δεν είναι διαθέσιμο, **`kextutil`** μπορεί να εκτελέσει τους ίδιους ελέγχους.
### Enumeration (loaded kexts)
### Enumeration & management (loaded kexts)
`kextstat` ήταν το ιστορικό εργαλείο αλλά είναι **παρωχημένο** στις πρόσφατες εκδόσεις macOS. Η σύγχρονη διεπαφή είναι **`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` μπορεί επίσης να χρησιμοποιηθεί για **να εξάγει το περιεχόμενο μιας Συλλογής Πυρήνα (KC)** ή να επαληθεύσει ότι ένα 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]
@ -49,7 +81,7 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
Το **kernelcache** είναι μια **προ-συγκεντρωμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με βασικούς **οδηγούς** και **επικεφαλίδες πυρήνα**. Αποθηκεύεται σε **συμπιεσμένη** μορφή και αποσυμπιέζεται στη μνήμη κατά τη διάρκεια της διαδικασίας εκκίνησης. Το kernelcache διευκολύνει έναν **ταχύτερο χρόνο εκκίνησης** έχοντας μια έτοιμη προς εκτέλεση έκδοση του πυρήνα και κρίσιμων οδηγών διαθέσιμων, μειώνοντας τον χρόνο και τους πόρους που θα δαπανώνταν διαφορετικά για τη δυναμική φόρτωση και σύνδεση αυτών των στοιχείων κατά την εκκίνηση.
### Local Kerlnelcache
### Τοπικό Kernelcache
Στο iOS βρίσκεται στο **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** στο macOS μπορείτε να το βρείτε με: **`find / -name "kernelcache" 2>/dev/null`** \
Στην περίπτωσή μου στο macOS το βρήκα στο:
@ -58,7 +90,7 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
#### IMG4
Η μορφή αρχείου IMG4 είναι μια μορφή κοντέινερ που χρησιμοποιείται από την Apple στα iOS και macOS συσκευές για την ασφαλή **αποθήκευση και επαλήθευση των στοιχείων υλικολογισμικού** (όπως το **kernelcache**). Η μορφή IMG4 περιλαμβάνει μια κεφαλίδα και αρκετές ετικέτες που περι encapsulate διάφορα κομμάτια δεδομένων, συμπεριλαμβανομένου του πραγματικού φορτίου (όπως ένας πυρήνας ή bootloader), μια υπογραφή και ένα σύνολο ιδιοτήτων manifest. Η μορφή υποστηρίζει κρυπτογραφική επαλήθευση, επιτρέποντας στη συσκευή να επιβεβαιώσει την αυθεντικότητα και την ακεραιότητα του στοιχείου υλικολογισμικού πριν το εκτελέσει.
Η μορφή αρχείου IMG4 είναι μια μορφή κοντέινερ που χρησιμοποιείται από την Apple στα iOS και macOS συστήματα για την ασφαλή **αποθήκευση και επαλήθευση των στοιχείων firmware** (όπως το **kernelcache**). Η μορφή IMG4 περιλαμβάνει μια κεφαλίδα και αρκετές ετικέτες που περι encapsulate διάφορα κομμάτια δεδομένων, συμπεριλαμβανομένου του πραγματικού payload (όπως ένας πυρήνας ή bootloader), μια υπογραφή και ένα σύνολο ιδιοτήτων manifest. Η μορφή υποστηρίζει κρυπτογραφική επαλήθευση, επιτρέποντας στη συσκευή να επιβεβαιώσει την αυθεντικότητα και την ακεραιότητα του στοιχείου firmware πριν το εκτελέσει.
Συνήθως αποτελείται από τα εξής στοιχεία:
@ -75,7 +107,7 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
Αποσυμπιέστε το Kernelcache:
```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)
@ -85,7 +117,7 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
- [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
Στο [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) είναι δυνατή η εύρεση όλων των εργαλείων αποσφαλμάτωσης πυρήνα. Μπορείτε να το κατεβάσετε, να το τοποθετήσετε, να το ανοίξετε με το εργαλείο [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), να αποκτήσετε πρόσβαση στον φάκελο **`.kext`** και **να το εξαγάγετε**.
Στο [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) είναι δυνατή η εύρεση όλων των εργαλείων αποσφαλμάτωσης πυρήνα. Μπορείτε να το κατεβάσετε, να το τοποθετήσετε, να το ανοίξετε με το εργαλείο [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html), να αποκτήσετε πρόσβαση στον φάκελο **`.kext`** και να **εξαγάγετε** το περιεχόμενο.
Ελέγξτε το για σύμβολα με:
```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* επιτιθέμενο να καταχωρήσει ένα κακόβουλο πακέτο συστήματος αρχείων που τελικά φόρτωσε ένα **μη υπογεγραμμένο kext**, **παρακάμπτοντας την Προστασία Ακεραιότητας Συστήματος (SIP)** και επιτρέποντας μόνιμα rootkits. Διορθώθηκε στο macOS 14.2 / 15.2. |
| 2021 | **CVE-2021-30892** (*Shrootless*) | Ο daemon εγκατάστασης με την εξουσία `com.apple.rootless.install` μπορούσε να καταχραστεί για να εκτελέσει αυθαίρετα σενάρια μετά την εγκατάσταση, να απενεργοποιήσει το SIP και να φορτώσει αυθαίρετα kexts. |
**Σημαντικά σημεία για τους red-teamers**
1. **Αναζητήστε εξουσιοδοτημένους daemons (`codesign -dvv /path/bin | grep entitlements`) που αλληλεπιδρούν με το Disk Arbitration, τον Installer ή τη Διαχείριση Kext.**
2. **Η κατάχρηση του SIP παρακάμπτει σχεδόν πάντα τη δυνατότητα φόρτωσης ενός kext → εκτέλεση κώδικα πυρήνα**.
**Αμυντικές συμβουλές**
*Διατηρήστε το SIP ενεργοποιημένο*, παρακολουθήστε για κλήσεις `kmutil load`/`kmutil create -n aux` που προέρχονται από μη Apple δυαδικά και ειδοποιήστε για οποιαδήποτε εγγραφή στο `/Library/Extensions`. Τα γεγονότα Ασφάλειας Τερματικού `ES_EVENT_TYPE_NOTIFY_KEXTLOAD` παρέχουν σχεδόν άμεση ορατότητα.
## Αποσφαλμάτωση πυρήνα macOS & kexts
Η προτεινόμενη ροή εργασίας της Apple είναι να κατασκευάσει ένα **Kernel Debug Kit (KDK)** που ταιριάζει με την τρέχουσα έκδοση και στη συνέχεια να συνδεθεί με το **LLDB** μέσω μιας συνεδρίας δικτύου **KDP (Kernel Debugging Protocol)**.
### Τοπική αποσφαλμάτωση ενός πανικού με μία εντολή
```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 και τη μηχανή φιλοξενίας με ένα **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
```
### Σύνδεση του LLDB σε ένα συγκεκριμένο φορτωμένο kext
```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 μόνο εκθέτει μια **μόνο για ανάγνωση** διεπαφή. Για δυναμική οργάνωση θα χρειαστεί να διορθώσετε το δυαδικό αρχείο στον δίσκο, να εκμεταλλευτείτε το **hooking συναρτήσεων πυρήνα** (π.χ. `mach_override`) ή να μεταφέρετε τον οδηγό σε έναν **hypervisor** για πλήρη ανάγνωση/γραφή.
## Αναφορές
- [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 Security Οδηγός Ασφαλείας Πλατφόρμας Apple
- Microsoft Security Blog *Ανάλυση CVE-2024-44243 SIP bypass*
{{#include ../../../banners/hacktricks-training.md}}