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 (초기 이름: Seatbelt) 는 샌드박스 내에서 실행되는 애플리케이션의 허용된 작업을 샌드박스 프로필에 지정된 대로 제한합니다. 이는 애플리케이션이 예상된 리소스만 접근하도록 보장하는 데 도움이 됩니다.

com.apple.security.app-sandbox 권한을 가진 모든 앱은 샌드박스 내에서 실행됩니다. Apple 바이너리는 일반적으로 샌드박스 내에서 실행되며, App Store에 배포하기 위해서는 이 권한이 필수적입니다. 따라서 대부분의 애플리케이션은 샌드박스 내에서 실행됩니다.

프로세스가 할 수 있는 것과 할 수 없는 것을 제어하기 위해 샌드박스는 커널 전역의 모든 syscalls에 후크를 가지고 있습니다. 앱의 권한에 따라 샌드박스는 특정 작업을 허용합니다.

샌드박스의 몇 가지 중요한 구성 요소는 다음과 같습니다:

  • 커널 확장 /System/Library/Extensions/Sandbox.kext

  • 프라이빗 프레임워크 /System/Library/PrivateFrameworks/AppSandbox.framework

  • 사용자 공간에서 실행되는 데몬 /usr/libexec/sandboxd

  • 컨테이너 ~/Library/Containers

컨테이너 폴더 내에는 샌드박스에서 실행되는 각 앱에 대한 폴더가 번들 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
[...]

각 번들 ID 폴더 안에는 앱의 plist데이터 디렉토리를 찾을 수 있습니다:

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

주의: 심볼릭 링크가 Sandbox에서 "탈출"하여 다른 폴더에 접근하기 위해 존재하더라도, 앱은 여전히 접근할 수 있는 권한이 필요합니다. 이러한 권한은 .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/>
[...]

Sandboxed 애플리케이션에 의해 생성/수정된 모든 항목은 격리 속성을 갖게 됩니다. 이는 샌드박스 앱이 **open**으로 무언가를 실행하려고 할 때 Gatekeeper를 트리거하여 샌드박스 공간을 방지합니다.

샌드박스 프로필

샌드박스 프로필은 해당 샌드박스에서 허용/금지될 항목을 나타내는 구성 파일입니다. 이는 Scheme 프로그래밍 언어를 사용하는 **샌드박스 프로필 언어(SBPL)**를 사용합니다.

여기 예시를 찾을 수 있습니다:

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

연구 를 확인하여 허용되거나 거부될 수 있는 추가 작업을 확인하세요.

중요한 시스템 서비스mdnsresponder 서비스와 같은 자체 맞춤 샌드박스 내에서 실행됩니다. 이러한 맞춤 샌드박스 프로필은 다음 위치에서 확인할 수 있습니다:

App Store 앱은 프로필 **/System/Library/Sandbox/Profiles/application.sb**를 사용합니다. 이 프로필에서 **com.apple.security.network.server**와 같은 권한이 프로세스가 네트워크를 사용할 수 있도록 허용하는 방법을 확인할 수 있습니다.

SIP는 /System/Library/Sandbox/rootless.conf에 있는 platform_profile이라는 샌드박스 프로필입니다.

샌드박스 프로필 예시

특정 샌드박스 프로필로 애플리케이션을 시작하려면 다음을 사용할 수 있습니다:

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

Apple이 작성한 소프트웨어Windows에서 추가적인 보안 조치가 없으며, 애플리케이션 샌드박싱과 같은 기능이 없습니다.

우회 예시:

MacOS 샌드박스 프로파일

macOS는 시스템 샌드박스 프로파일을 두 위치에 저장합니다: /usr/share/sandbox//System/Library/Sandbox/Profiles.

그리고 서드파티 애플리케이션이 com.apple.security.app-sandbox 권한을 가지고 있다면, 시스템은 해당 프로세스에 /System/Library/Sandbox/Profiles/application.sb 프로파일을 적용합니다.

iOS 샌드박스 프로파일

기본 프로파일은 container라고 하며, SBPL 텍스트 표현이 없습니다. 메모리에서 이 샌드박스는 샌드박스의 각 권한에 대해 허용/거부 이진 트리로 표현됩니다.

디버그 및 샌드박스 우회

macOS에서는 iOS와 달리 프로세스가 커널에 의해 처음부터 샌드박스에 격리되지 않으며, 프로세스가 스스로 샌드박스에 참여해야 합니다. 이는 macOS에서 프로세스가 적극적으로 샌드박스에 들어가기로 결정할 때까지 샌드박스에 의해 제한되지 않음을 의미합니다.

프로세스는 com.apple.security.app-sandbox 권한이 있을 경우 사용자 공간에서 시작할 때 자동으로 샌드박스화됩니다. 이 프로세스에 대한 자세한 설명은 다음을 확인하십시오:

macOS Sandbox Debug & Bypass

PID 권한 확인

이것에 따르면, sandbox_check (이는 __mac_syscall입니다)는 특정 PID에 대해 작업이 허용되는지 여부를 확인할 수 있습니다.

도구 sbtool은 PID가 특정 작업을 수행할 수 있는지 확인할 수 있습니다:

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 in App Store apps

회사가 사용자 정의 샌드박스 프로필로 앱을 실행할 수 있을 가능성이 있습니다 (기본 프로필 대신). 그들은 Apple에 의해 승인되어야 하는 권한 **com.apple.security.temporary-exception.sbpl**을 사용해야 합니다.

이 권한의 정의는 **/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)))))

이 권한 이후의 문자열은 Sandbox 프로필로 eval됩니다.

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기

Last updated