14 KiB
macOS Sandbox
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub HackTricks e HackTricks Cloud.
Informações Básicas
O macOS Sandbox (inicialmente chamado de Seatbelt) limita aplicações executadas dentro do sandbox às ações permitidas especificadas no perfil do Sandbox com o qual o app está rodando. Isso ajuda a garantir que a aplicação acessará apenas os recursos esperados.
Qualquer app com o entitlement com.apple.security.app-sandbox
será executado dentro do sandbox. Binários da Apple geralmente são executados dentro de um Sandbox e para publicar dentro da App Store, este entitlement é obrigatório. Assim, a maioria das aplicações será executada dentro do sandbox.
Para controlar o que um processo pode ou não fazer, o Sandbox possui ganchos em todos os syscalls através do kernel. Dependendo dos entitlements do app, o Sandbox permitirá certas ações.
Alguns componentes importantes do Sandbox são:
- A extensão do kernel
/System/Library/Extensions/Sandbox.kext
- O framework privado
/System/Library/PrivateFrameworks/AppSandbox.framework
- Um daemon executando em userland
/usr/libexec/sandboxd
- Os containers
~/Library/Containers
Dentro da pasta containers, você pode encontrar uma pasta para cada app executado em modo sandbox com o nome do bundle id:
ls -l ~/Library/Containers
total 0
drwx------@ 4 username staff 128 May 23 20:20 com.apple.AMPArtworkAgent
drwx------@ 4 username staff 128 May 23 20:13 com.apple.AMPDeviceDiscoveryAgent
drwx------@ 4 username staff 128 Mar 24 18:03 com.apple.AVConference.Diagnostic
drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings.extension
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
[...]
Dentro de cada pasta de id de pacote, você pode encontrar o plist e o Diretório de Dados do App:
cd /Users/username/Library/Containers/com.apple.Safari
ls -la
total 104
drwx------@ 4 username staff 128 Mar 24 18:08 .
drwx------ 348 username staff 11136 May 23 20:57 ..
-rw-r--r-- 1 username staff 50214 Mar 24 18:08 .com.apple.containermanagerd.metadata.plist
drwx------ 13 username staff 416 Mar 24 18:05 Data
ls -l Data
total 0
drwxr-xr-x@ 8 username staff 256 Mar 24 18:08 CloudKit
lrwxr-xr-x 1 username staff 19 Mar 24 18:02 Desktop -> ../../../../Desktop
drwx------ 2 username staff 64 Mar 24 18:02 Documents
lrwxr-xr-x 1 username staff 21 Mar 24 18:02 Downloads -> ../../../../Downloads
drwx------ 35 username staff 1120 Mar 24 18:08 Library
lrwxr-xr-x 1 username staff 18 Mar 24 18:02 Movies -> ../../../../Movies
lrwxr-xr-x 1 username staff 17 Mar 24 18:02 Music -> ../../../../Music
lrwxr-xr-x 1 username staff 20 Mar 24 18:02 Pictures -> ../../../../Pictures
drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp
{% hint style="danger" %}
Observe que, mesmo que os symlinks estejam lá para "escapar" do Sandbox e acessar outras pastas, o App ainda precisa ter permissões para acessá-los. Essas permissões estão dentro do .plist
.
{% endhint %}
# Get permissions
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -
# Binary sandbox profile
<key>SandboxProfileData</key>
<data>
AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
# In this file you can find the entitlements:
<key>Entitlements</key>
<dict>
<key>com.apple.MobileAsset.PhishingImageClassifier2</key>
<true/>
<key>com.apple.accounts.appleaccount.fullaccess</key>
<true/>
<key>com.apple.appattest.spi</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>6N38VWS5BX.ru.keepcoder.Telegram</string>
<string>6N38VWS5BX.ru.keepcoder.TelegramShare</string>
</array>
[...]
# Some parameters
<key>Parameters</key>
<dict>
<key>_HOME</key>
<string>/Users/username</string>
<key>_UID</key>
<string>501</string>
<key>_USER</key>
<string>username</string>
[...]
# The paths it can access
<key>RedirectablePaths</key>
<array>
<string>/Users/username/Downloads</string>
<string>/Users/username/Documents</string>
<string>/Users/username/Library/Calendars</string>
<string>/Users/username/Desktop</string>
<key>RedirectedPaths</key>
<array/>
[...]
{% hint style="warning" %}
Tudo que for criado/modificado por uma aplicação em Sandbox receberá o atributo de quarentena. Isso impedirá um espaço de Sandbox de acionar o Gatekeeper se o app em Sandbox tentar executar algo com open
.
{% endhint %}
Perfis de Sandbox
Os perfis de Sandbox são arquivos de configuração que indicam o que será permitido/proibido naquele Sandbox. Utiliza a Linguagem de Perfil de Sandbox (SBPL), que usa a linguagem de programação Scheme.
Aqui você pode encontrar um exemplo:
(version 1) ; First you get the version
(deny default) ; Then you shuold indicate the default action when no rule applies
(allow network*) ; You can use wildcards and allow everything
(allow file-read* ; You can specify where to apply the rule
(subpath "/Users/username/")
(literal "/tmp/afile")
(regex #"^/private/etc/.*")
)
(allow mach-lookup
(global-name "com.apple.analyticsd")
)
{% hint style="success" %} Confira esta pesquisa para verificar mais ações que podem ser permitidas ou negadas. {% endhint %}
Serviços importantes do sistema também funcionam dentro de seu próprio sandbox personalizado, como o serviço mdnsresponder
. Você pode visualizar esses perfis de sandbox personalizados dentro de:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
- Outros perfis de sandbox podem ser verificados em https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles.
Aplicativos da App Store usam o perfil /System/Library/Sandbox/Profiles/application.sb
. Você pode verificar neste perfil como direitos como com.apple.security.network.server
permitem que um processo use a rede.
SIP é um perfil de Sandbox chamado platform_profile em /System/Library/Sandbox/rootless.conf
Exemplos de Perfis de Sandbox
Para iniciar um aplicativo com um perfil de sandbox específico, você pode usar:
sandbox-exec -f example.sb /Path/To/The/Application
{% tabs %} {% tab title="touch" %} {% code title="touch.sb" %}
(version 1)
(deny default)
(allow file* (literal "/tmp/hacktricks.txt"))
Since there is no English text provided other than the markdown endcode tag, there is nothing to translate. If you provide the English text that needs to be translated, I can assist with the translation to Portuguese.
# This will fail because default is denied, so it cannot execute touch
sandbox-exec -f touch.sb touch /tmp/hacktricks.txt
# Check logs
log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last 30s
[...]
2023-05-26 13:42:44.136082+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) process-exec* /usr/bin/touch
2023-05-26 13:42:44.136100+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /usr/bin/touch
2023-05-26 13:42:44.136321+0200 localhost kernel[0]: (Sandbox) Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
2023-05-26 13:42:52.701382+0200 localhost kernel[0]: (Sandbox) 5 duplicate reports for Sandbox: sandbox-exec(41398) deny(1) file-read-metadata /var
[...]
Since you've provided a specific instruction but no actual text to translate, I can't proceed with a translation. If you provide the English text that needs to be translated into Portuguese, I'll be able to assist you. Please provide the content for translation while keeping the markdown and HTML syntax intact as per your instructions.
(version 1)
(deny default)
(allow file* (literal "/tmp/hacktricks.txt"))
(allow process* (literal "/usr/bin/touch"))
; This will also fail because:
; 2023-05-26 13:44:59.840002+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/bin/touch
; 2023-05-26 13:44:59.840016+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin/touch
; 2023-05-26 13:44:59.840028+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /usr/bin
; 2023-05-26 13:44:59.840034+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-metadata /usr/lib/dyld
; 2023-05-26 13:44:59.840050+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) sysctl-read kern.bootargs
; 2023-05-26 13:44:59.840061+0200 localhost kernel[0]: (Sandbox) Sandbox: touch(41575) deny(1) file-read-data /
{% endcode %}
{% code title="touch3.sb" %}
(version 1)
(deny default)
(allow file* (literal "/private/tmp/hacktricks.txt"))
(allow process* (literal "/usr/bin/touch"))
(allow file-read-data (literal "/"))
; This one will work
{% endcode %} {% endtab %} {% endtabs %}
{% hint style="info" %} Observe que o software autorizado pela Apple que roda no Windows não possui precauções de segurança adicionais, como o isolamento de aplicativos em sandbox. {% endhint %}
Exemplos de bypass:
- https://lapcatsoftware.com/articles/sandbox-escape.html
- https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (eles conseguem escrever arquivos fora da sandbox cujo nome começa com
~$
).
Perfis de Sandbox do MacOS
O macOS armazena perfis de sandbox do sistema em dois locais: /usr/share/sandbox/ e /System/Library/Sandbox/Profiles.
E se uma aplicação de terceiros possuir o direito com.apple.security.app-sandbox, o sistema aplica o perfil /System/Library/Sandbox/Profiles/application.sb a esse processo.
Perfil de Sandbox do iOS
O perfil padrão é chamado container e não temos a representação em texto SBPL. Na memória, essa sandbox é representada como uma árvore binária de permissões de Permitir/Negar para cada permissão da sandbox.
Debug & Bypass de Sandbox
Processos não nascem isolados em sandbox no macOS: ao contrário do iOS, onde a sandbox é aplicada pelo kernel antes da primeira instrução de um programa ser executada, no macOS um processo deve optar por se colocar na sandbox.
Processos são automaticamente colocados em Sandbox do userland quando iniciam se possuírem o direito: com.apple.security.app-sandbox
. Para uma explicação detalhada desse processo, confira:
{% content-ref url="macos-sandbox-debug-and-bypass/" %} macos-sandbox-debug-and-bypass {% endcontent-ref %}
Verificar Privilégios do PID
De acordo com isto, o sandbox_check
(é um __mac_syscall
), pode verificar se uma operação é permitida ou não pela sandbox em um determinado PID.
A ferramenta sbtool pode verificar se um PID pode realizar uma determinada ação:
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
sbtool <pid> file /tmp #Check file access
sbtool <pid> inspect #Gives you an explaination of the sandbox profile
sbtool <pid> all
SBPL personalizado em apps da App Store
Pode ser possível para empresas fazerem seus apps rodarem com perfis de Sandbox personalizados (em vez de com o padrão). Eles precisam usar a autorização com.apple.security.temporary-exception.sbpl
que precisa ser autorizada pela Apple.
É possível verificar a definição desta autorização em /System/Library/Sandbox/Profiles/application.sb:
(sandbox-array-entitlement
"com.apple.security.temporary-exception.sbpl"
(lambda (string)
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
Isso irá avaliar a string após este entitlement como um perfil de Sandbox.
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do HackTricks e HackTricks Cloud.