基本情報
MacOS Sandbox(最初はSeatbeltと呼ばれていました)は、サンドボックス内で実行されるアプリケーション を、アプリが実行されているサンドボックスプロファイルで指定された許可されたアクション に制限します。これにより、アプリケーションが予期されるリソースのみをアクセスすることが保証されます 。
com.apple.security.app-sandbox
という権限 を持つアプリは、サンドボックス内で実行されます。Appleのバイナリ は通常サンドボックス内で実行され、App Store に公開するためには、この権限が必須です 。したがって、ほとんどのアプリケーションはサンドボックス内で実行されます。
プロセスが何をできるか、またはできないかを制御するために、サンドボックスはカーネル全体のすべての syscallにフックを持っています 。アプリの権限 に応じて、サンドボックスは特定のアクションを許可 します。
サンドボックスの重要なコンポーネントは以下の通りです:
カーネル拡張 /System/Library/Extensions/Sandbox.kext
プライベートフレームワーク /System/Library/PrivateFrameworks/AppSandbox.framework
ユーザーランドで実行されるデーモン /usr/libexec/sandboxd
コンテナ ~/Library/Containers
コンテナフォルダ内には、バンドルIDの名前を持つサンドボックスで実行される各アプリのフォルダ を見つけることができます:
Copy 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 とデータディレクトリ を見つけることができます:
Copy 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
**の中にあります。
Copy # 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.PhishingImageClassifier 2< /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 > 5 01< /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)**を使用します。
ここに例があります:
Copy (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
サービスのように独自のカスタムサンドボックス 内で実行されます。これらのカスタムサンドボックスプロファイル は以下で確認できます:
/System/Library/Sandbox/Profiles
App Store アプリは**プロファイル****/System/Library/Sandbox/Profiles/application.sb
を使用します。このプロファイルで、 com.apple.security.network.server
**のような権限がプロセスにネットワークを使用することを許可する方法を確認できます。
SIPは、/System/Library/Sandbox/rootless.conf内のplatform_profileというサンドボックスプロファイルです。
サンドボックスプロファイルの例
特定のサンドボックスプロファイルでアプリケーションを起動するには、次のようにします:
Copy sandbox-exec -f example.sb /Path/To/The/Application
touch
Copy (version 1 )
(deny default)
(allow file* (literal "/tmp/hacktricks.txt" ))
Copy # 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
[...]
Copy (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 /
Copy (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はシステムサンドボックスプロファイルを2つの場所に保存します: /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が実行できるかどうかを確認できます:
Copy sbtool < pi d > mach #Check mac-ports (got from launchd with an api)
sbtool < pi d > file /tmp #Check file access
sbtool < pi d > inspect #Gives you an explaination of the sandbox profile
sbtool < pi d > all
App StoreアプリのカスタムSBPL
企業は、アプリをカスタムサンドボックスプロファイル で実行することが可能です(デフォルトのものではなく)。彼らは、Appleによって承認される必要がある権限**com.apple.security.temporary-exception.sbpl
**を使用する必要があります。
この権限の定義は**/System/Library/Sandbox/Profiles/application.sb:
**で確認できます。
Copy (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 されます。