mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
9086c136f3
commit
5c29a58657
@ -6,11 +6,22 @@
|
||||
|
||||
Le estensioni del kernel (Kexts) sono **pacchetti** con un'estensione **`.kext`** che vengono **caricati direttamente nello spazio del kernel di macOS**, fornendo funzionalità aggiuntive al sistema operativo principale.
|
||||
|
||||
### Stato di deprecazione & DriverKit / Estensioni di sistema
|
||||
A partire da **macOS Catalina (10.15)**, Apple ha contrassegnato la maggior parte delle KPI legacy come *deprecate* e ha introdotto i framework **System Extensions & DriverKit** che funzionano in **user-space**. Da **macOS Big Sur (11)**, il sistema operativo *rifiuterà di caricare* kext di terze parti che si basano su KPI deprecate a meno che la macchina non venga avviata in modalità **Reduced Security**. Su Apple Silicon, abilitare i kext richiede inoltre che l'utente:
|
||||
|
||||
1. Riavvii in **Recovery** → *Startup Security Utility*.
|
||||
2. Selezioni **Reduced Security** e spunti **“Allow user management of kernel extensions from identified developers”**.
|
||||
3. Riavvii e approvi il kext da **System Settings → Privacy & Security**.
|
||||
|
||||
I driver user-land scritti con DriverKit/System Extensions riducono drasticamente la **superficie di attacco** perché i crash o la corruzione della memoria sono confinati a un processo sandboxato piuttosto che allo spazio del kernel.
|
||||
|
||||
> 📝 Da macOS Sequoia (15), Apple ha rimosso completamente diverse KPI legacy di networking e USB – l'unica soluzione compatibile per i fornitori è migrare a System Extensions.
|
||||
|
||||
### Requisiti
|
||||
|
||||
Ovviamente, è così potente che è **complicato caricare un'estensione del kernel**. Questi sono i **requisiti** che un'estensione del kernel deve soddisfare per essere caricata:
|
||||
Ovviamente, questo è così potente che è **complicato caricare un'estensione del kernel**. Questi sono i **requisiti** che un'estensione del kernel deve soddisfare per essere caricata:
|
||||
|
||||
- Quando si **entra in modalità di recupero**, le **estensioni del kernel devono essere autorizzate** a essere caricate:
|
||||
- Quando **si entra in modalità di recupero**, le **estensioni del kernel devono essere autorizzate** a essere caricate:
|
||||
|
||||
<figure><img src="../../../images/image (327).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -34,20 +45,41 @@ In Catalina era così: È interessante notare che il processo di **verifica** av
|
||||
|
||||
Se **`kextd`** non è disponibile, **`kextutil`** può eseguire gli stessi controlli.
|
||||
|
||||
### Enumerazione (kexts caricati)
|
||||
### Enumerazione & gestione (kext caricati)
|
||||
|
||||
`kextstat` era lo strumento storico ma è **deprecato** nelle recenti versioni di macOS. L'interfaccia moderna è **`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
|
||||
```
|
||||
La sintassi più vecchia è ancora disponibile per riferimento:
|
||||
```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` può anche essere utilizzato per **estrarre il contenuto di una Kernel Collection (KC)** o verificare che un kext risolva tutte le dipendenze dei simboli:
|
||||
```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]
|
||||
> Anche se ci si aspetta che le estensioni del kernel siano in `/System/Library/Extensions/`, se si va in questa cartella **non si troverà alcun binario**. Questo è dovuto al **kernelcache** e per invertire un `.kext` è necessario trovare un modo per ottenerlo.
|
||||
> Anche se ci si aspetta che le estensioni del kernel siano in `/System/Library/Extensions/`, se vai in questa cartella **non troverai alcun binario**. Questo è dovuto al **kernelcache** e per fare il reverse di un `.kext` devi trovare un modo per ottenerlo.
|
||||
|
||||
Il **kernelcache** è una **versione pre-compilata e pre-collegata del kernel XNU**, insieme a **driver** e **estensioni del kernel** essenziali. È memorizzato in un formato **compresso** e viene decompresso in memoria durante il processo di avvio. Il kernelcache facilita un **tempo di avvio più veloce** avendo una versione pronta all'uso del kernel e dei driver cruciali disponibili, riducendo il tempo e le risorse che altrimenti verrebbero spesi per caricare e collegare dinamicamente questi componenti all'avvio.
|
||||
Il **kernelcache** è una **versione pre-compilata e pre-collegata del kernel XNU**, insieme a **driver** e **estensioni del kernel** essenziali. È memorizzato in un formato **compresso** e viene decompresso in memoria durante il processo di avvio. Il kernelcache facilita un **tempo di avvio più veloce** avendo una versione pronta all'uso del kernel e dei driver cruciali disponibili, riducendo il tempo e le risorse che altrimenti verrebbero spese per caricare e collegare dinamicamente questi componenti all'avvio.
|
||||
|
||||
### Local Kerlnelcache
|
||||
|
||||
@ -58,7 +90,7 @@ Nel mio caso in macOS l'ho trovato in:
|
||||
|
||||
#### IMG4
|
||||
|
||||
Il formato di file IMG4 è un formato contenitore utilizzato da Apple nei suoi dispositivi iOS e macOS per **memorizzare e verificare in modo sicuro** i componenti del firmware (come il **kernelcache**). Il formato IMG4 include un'intestazione e diversi tag che racchiudono diversi pezzi di dati, inclusi il payload effettivo (come un kernel o un bootloader), una firma e un insieme di proprietà del manifesto. Il formato supporta la verifica crittografica, consentendo al dispositivo di confermare l'autenticità e l'integrità del componente firmware prima di eseguirlo.
|
||||
Il formato di file IMG4 è un formato contenitore utilizzato da Apple nei suoi dispositivi iOS e macOS per **memorizzare e verificare in modo sicuro** i componenti del firmware (come il **kernelcache**). Il formato IMG4 include un'intestazione e diversi tag che racchiudono diversi pezzi di dati, inclusi il payload effettivo (come un kernel o bootloader), una firma e un insieme di proprietà del manifesto. Il formato supporta la verifica crittografica, consentendo al dispositivo di confermare l'autenticità e l'integrità del componente del firmware prima di eseguirlo.
|
||||
|
||||
È solitamente composto dai seguenti componenti:
|
||||
|
||||
@ -71,11 +103,11 @@ Il formato di file IMG4 è un formato contenitore utilizzato da Apple nei suoi d
|
||||
- **Restore Info (IM4R)**:
|
||||
- Conosciuto anche come APNonce
|
||||
- Previene la ripetizione di alcuni aggiornamenti
|
||||
- OPZIONALE: Di solito non si trova
|
||||
- OPZIONALE: Di solito questo non viene trovato
|
||||
|
||||
Decomprimere il 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)
|
||||
@ -93,7 +125,7 @@ nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
|
||||
```
|
||||
- [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
|
||||
|
||||
A volte Apple rilascia **kernelcache** con **simboli**. Puoi scaricare alcuni firmware con simboli seguendo i link su quelle pagine. I firmware conterranno il **kernelcache** tra gli altri file.
|
||||
A volte Apple rilascia **kernelcache** con **simboli**. Puoi scaricare alcuni firmware con simboli seguendo i link su queste pagine. I firmware conterranno il **kernelcache** tra gli altri file.
|
||||
|
||||
Per **estrarre** i file inizia cambiando l'estensione da `.ipsw` a `.zip` e **decomprimi**.
|
||||
|
||||
@ -126,11 +158,60 @@ kextex_all kernelcache.release.iphone14.e
|
||||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
## Debugging
|
||||
## Vulnerabilità recenti e tecniche di sfruttamento
|
||||
|
||||
| Anno | CVE | Riepilogo |
|
||||
|------|-----|---------|
|
||||
| 2024 | **CVE-2024-44243** | Un difetto logico in **`storagekitd`** ha permesso a un attaccante *root* di registrare un bundle di file system malevolo che alla fine ha caricato un **kext non firmato**, **bypassando la Protezione dell'Integrità di Sistema (SIP)** e abilitando rootkit persistenti. Corretto in macOS 14.2 / 15.2. |
|
||||
| 2021 | **CVE-2021-30892** (*Shrootless*) | Il demone di installazione con il diritto `com.apple.rootless.install` poteva essere abusato per eseguire script post-installazione arbitrari, disabilitare SIP e caricare kext arbitrari. |
|
||||
|
||||
**Punti chiave per i red-teamers**
|
||||
|
||||
1. **Cercare demoni autorizzati (`codesign -dvv /path/bin | grep entitlements`) che interagiscono con Disk Arbitration, Installer o Kext Management.**
|
||||
2. **L'abuso dei bypass SIP quasi sempre concede la possibilità di caricare un kext → esecuzione di codice nel kernel**.
|
||||
|
||||
**Consigli difensivi**
|
||||
|
||||
*Tenere SIP abilitato*, monitorare le invocazioni di `kmutil load`/`kmutil create -n aux` provenienti da binari non Apple e allertare su qualsiasi scrittura in `/Library/Extensions`. Gli eventi di Sicurezza degli Endpoint `ES_EVENT_TYPE_NOTIFY_KEXTLOAD` forniscono visibilità quasi in tempo reale.
|
||||
|
||||
## Debugging del kernel macOS e kext
|
||||
|
||||
Il flusso di lavoro raccomandato da Apple è costruire un **Kernel Debug Kit (KDK)** che corrisponda alla build in esecuzione e poi collegare **LLDB** tramite una sessione di rete **KDP (Kernel Debugging Protocol)**.
|
||||
|
||||
### Debug locale one-shot di un panic
|
||||
```bash
|
||||
# Create a symbolication bundle for the latest panic
|
||||
sudo kdpwrit dump latest.kcdata
|
||||
kmutil analyze-panic latest.kcdata -o ~/panic_report.txt
|
||||
```
|
||||
### Debugging remoto live da un altro Mac
|
||||
|
||||
1. Scarica + installa la versione esatta di **KDK** per la macchina target.
|
||||
2. Collega il Mac target e il Mac host con un **cavo USB-C o Thunderbolt**.
|
||||
3. Sul **target**:
|
||||
```bash
|
||||
sudo nvram boot-args="debug=0x100 kdp_match_name=macbook-target"
|
||||
reboot
|
||||
```
|
||||
4. Sul **host**:
|
||||
```bash
|
||||
lldb
|
||||
(lldb) kdp-remote "udp://macbook-target"
|
||||
(lldb) bt # get backtrace in kernel context
|
||||
```
|
||||
### Attaching LLDB a un kext caricato specifico
|
||||
```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 espone solo un'interfaccia **sola lettura**. Per l'istrumentazione dinamica sarà necessario patchare il binario su disco, sfruttare il **kernel function hooking** (ad es. `mach_override`) o migrare il driver a un **hypervisor** per pieno accesso in lettura/scrittura.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [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 Platform Security Guide
|
||||
- Microsoft Security Blog – *Analizzando il bypass SIP CVE-2024-44243*
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user