hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md

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:

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:

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:

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: