macOS Sandbox

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

MacOS Sandbox (inicialmente llamado Seatbelt) limita las aplicaciones que se ejecutan dentro del sandbox a las acciones permitidas especificadas en el perfil de Sandbox con el que se está ejecutando la aplicación. Esto ayuda a garantizar que la aplicación solo accederá a los recursos esperados.

Cualquier aplicación con la entitlement com.apple.security.app-sandbox se ejecutará dentro del sandbox. Los binarios de Apple generalmente se ejecutan dentro de un Sandbox y para publicar en la App Store, esta entitlement es obligatoria. Por lo tanto, la mayoría de las aplicaciones se ejecutarán dentro del sandbox.

Para controlar lo que un proceso puede o no hacer, el Sandbox tiene hooks en todas las syscalls a través del kernel. Dependiendo de las entitlements de la aplicación, el Sandbox permitirá ciertas acciones.

Algunos componentes importantes del Sandbox son:

  • La extensión del kernel /System/Library/Extensions/Sandbox.kext

  • El framework privado /System/Library/PrivateFrameworks/AppSandbox.framework

  • Un daemon que se ejecuta en userland /usr/libexec/sandboxd

  • Los contenedores ~/Library/Containers

Dentro de la carpeta de contenedores, puedes encontrar una carpeta para cada aplicación ejecutada en sandbox con el nombre del id del bundle:

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 carpeta de id de paquete, puedes encontrar el plist y el directorio de datos de la aplicación:

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

Tenga en cuenta que incluso si los symlinks están ahí para "escapar" del Sandbox y acceder a otras carpetas, la App aún necesita tener permisos para acceder a ellas. Estos permisos están dentro del .plist.

# 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/>
[...]

Todo lo creado/modificado por una aplicación en Sandbox recibirá el atributo de cuarentena. Esto evitará un espacio de sandbox al activar Gatekeeper si la aplicación en sandbox intenta ejecutar algo con open.

Perfiles de Sandbox

Los perfiles de Sandbox son archivos de configuración que indican lo que se va a permitir/prohibir en ese Sandbox. Utiliza el Lenguaje de Perfil de Sandbox (SBPL), que utiliza el Scheme lenguaje de programación.

Aquí puedes encontrar un ejemplo:

(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")
)

Consulta esta investigación para verificar más acciones que podrían ser permitidas o denegadas.

Los servicios del sistema importantes también se ejecutan dentro de su propio sandbox personalizado, como el servicio mdnsresponder. Puedes ver estos perfiles de sandbox personalizados en:

Las aplicaciones de la App Store utilizan el perfil /System/Library/Sandbox/Profiles/application.sb. Puedes verificar en este perfil cómo los derechos como com.apple.security.network.server permiten que un proceso use la red.

SIP es un perfil de Sandbox llamado platform_profile en /System/Library/Sandbox/rootless.conf

Ejemplos de Perfiles de Sandbox

Para iniciar una aplicación con un perfil de sandbox específico puedes usar:

sandbox-exec -f example.sb /Path/To/The/Application
touch.sb
(version 1)
(deny default)
(allow file* (literal "/tmp/hacktricks.txt"))
# 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
[...]
touch2.sb
(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 /
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

Tenga en cuenta que el software autorizado por Apple que se ejecuta en Windows no tiene precauciones de seguridad adicionales, como el sandboxing de aplicaciones.

Ejemplos de bypass:

Perfiles de Sandbox de MacOS

macOS almacena perfiles de sandbox del sistema en dos ubicaciones: /usr/share/sandbox/ y /System/Library/Sandbox/Profiles.

Y si una aplicación de terceros tiene el derecho com.apple.security.app-sandbox, el sistema aplica el perfil /System/Library/Sandbox/Profiles/application.sb a ese proceso.

Perfil de Sandbox de iOS

El perfil predeterminado se llama container y no tenemos la representación de texto SBPL. En memoria, este sandbox se representa como un árbol binario de Permitir/Denegar para cada permiso del sandbox.

Depurar y Bypass Sandbox

En macOS, a diferencia de iOS donde los procesos están en sandbox desde el principio por el kernel, los procesos deben optar por el sandbox ellos mismos. Esto significa que en macOS, un proceso no está restringido por el sandbox hasta que decide activamente entrar en él.

Los procesos se en sandbox automáticamente desde el userland cuando comienzan si tienen el derecho: com.apple.security.app-sandbox. Para una explicación detallada de este proceso, consulte:

macOS Sandbox Debug & Bypass

Verificar Privilegios de PID

Según esto, el sandbox_check (es un __mac_syscall), puede verificar si una operación está permitida o no por el sandbox en un cierto PID.

La herramienta sbtool puede verificar si un PID puede realizar una cierta acción:

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

Custom SBPL en aplicaciones de la App Store

Podría ser posible que las empresas hicieran que sus aplicaciones funcionaran con perfiles de Sandbox personalizados (en lugar de con el predeterminado). Necesitan usar la autorización com.apple.security.temporary-exception.sbpl que debe ser autorizada por Apple.

Es posible verificar la definición de esta autorización en /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)))))

Esto evaluará la cadena después de este derecho como un perfil de Sandbox.

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Last updated