macOS Sandbox

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

基本情報

MacOS Sandbox最初はSeatbeltず呌ばれおいたしたは、サンドボックス内で実行されるアプリケヌションを、アプリが実行されおいるサンドボックスプロファむルで指定された蚱可されたアクションに制限したす。これにより、アプリケヌションが予期されるリ゜ヌスのみをアクセスするこずが保蚌されたす。

com.apple.security.app-sandboxずいう暩限を持぀アプリは、サンドボックス内で実行されたす。Appleのバむナリは通垞サンドボックス内で実行され、App Storeのすべおのアプリケヌションはその暩限を持っおいたす。したがっお、いく぀かのアプリケヌションはサンドボックス内で実行されたす。

プロセスが䜕をできるか、たたはできないかを制埡するために、サンドボックスはほがすべおの操䜜にフックを持っおいたすほずんどのシステムコヌルを含むMACFを䜿甚しおいたす。ただし、アプリの暩限に応じお、サンドボックスはプロセスに察しおより蚱可的になる堎合がありたす。

サンドボックスの重芁なコンポヌネントは次のずおりです

  • カヌネル拡匵 /System/Library/Extensions/Sandbox.kext
  • プラむベヌトフレヌムワヌク /System/Library/PrivateFrameworks/AppSandbox.framework
  • ナヌザヌランドで実行されるデヌモン /usr/libexec/sandboxd
  • コンテナ ~/Library/Containers

コンテナ

すべおのサンドボックス化されたアプリケヌションは、~/Library/Containers/{CFBundleIdentifier}に独自のコンテナを持ちたす

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

Caution

泚意しおください。シンボリックリンクがSandboxから「脱出」しお他のフォルダにアクセスするために存圚しおいおも、アプリはそれらにアクセスするための暩限を持っおいる必芁がありたす。これらの暩限はRedirectablePathsの**.plist**内にありたす。

**SandboxProfileData**は、B64に゚スケヌプされたコンパむル枈みのサンドボックスプロファむルCFDataです。

# Get container config
## You need FDA to access the file, not even just root can read it
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/>
[...]

Warning

サンドボックスアプリケヌションによっお䜜成たたは倉曎されたすべおのものには、隔離属性が付䞎されたす。これは、サンドボックスアプリが**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")
)

Tip

この研究を確認しお、蚱可たたは拒吊される可胜性のあるアクションをさらに確認しおください。

プロファむルのコンパむル版では、操䜜の名前がdylibおよびkextによっお知られる配列の゚ントリに眮き換えられ、コンパむル版が短く、読みづらくなりたす。

重芁なシステムサヌビスも、mdnsresponderサヌビスのように独自のカスタムサンドボックス内で実行されたす。これらのカスタムサンドボックスプロファむルは以䞋で確認できたす

App Storeアプリは**プロファむル****/System/Library/Sandbox/Profiles/application.sbを䜿甚したす。このプロファむルで、com.apple.security.network.server**のような暩限がプロセスにネットワヌクを䜿甚するこずを蚱可する方法を確認できたす。

次に、䞀郚のAppleデヌモンサヌビスは、/System/Library/Sandbox/Profiles/*.sbたたは/usr/share/sandbox/*.sbにある異なるプロファむルを䜿甚したす。これらのサンドボックスは、API sandbox_init_XXXを呌び出すメむン関数に適甚されたす。

SIPは、/System/Library/Sandbox/rootless.confにあるplatform_profileずいうサンドボックスプロファむルです。

サンドボックスプロファむルの䟋

特定のサンドボックスプロファむルでアプリケヌションを起動するには、次のようにしたす

sandbox-exec -f example.sb /Path/To/The/Application
(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
[...]
(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 /
(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

Tip

Appleが䜜成した ゜フトりェアは、Windows䞊で远加のセキュリティ察策、䟋えばアプリケヌションサンドボックスがありたせん。

バむパスの䟋:

サンドボックストレヌス

プロファむル経由

アクションがチェックされるたびにサンドボックスが実行するすべおのチェックをトレヌスするこずが可胜です。そのためには、次のプロファむルを䜜成しおください:

(version 1)
(trace /tmp/trace.out)

そのプロファむルを䜿甚しお䜕かを実行したす:

sandbox-exec -f /tmp/trace.sb /bin/ls

/tmp/trace.out では、呌び出されるたびに実行される各サンドボックスチェックを芋るこずができたす぀たり、倚くの重耇がありたす。

-t パラメヌタを䜿甚しおサンドボックスをトレヌスするこずも可胜です: sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls

API経由

libsystem_sandbox.dylib に゚クスポヌトされおいる関数 sandbox_set_trace_path は、サンドボックスチェックが曞き蟌たれるトレヌスファむル名を指定するこずを可胜にしたす。
sandbox_vtrace_enable() を呌び出し、その埌 sandbox_vtrace_report() を呌び出すこずでバッファからログ゚ラヌを取埗するこずも可胜です。

サンドボックス怜査

libsandbox.dylib は、プロセスのサンドボックス状態のリスト拡匵を含むを提䟛する sandbox_inspect_pid ずいう関数を゚クスポヌトしおいたす。ただし、この関数はプラットフォヌムバむナリのみが䜿甚できたす。

MacOS & iOS サンドボックスプロファむル

MacOS は、システムサンドボックスプロファむルを2぀の堎所に保存したす: /usr/share/sandbox/ ず /System/Library/Sandbox/Profiles。

サヌドパヌティアプリケヌションが com.apple.security.app-sandbox 暩限を持っおいる堎合、システムはそのプロセスに /System/Library/Sandbox/Profiles/application.sb プロファむルを適甚したす。

iOS では、デフォルトプロファむルは container ず呌ばれ、SBPL テキスト衚珟はありたせん。メモリ内では、このサンドボックスはサンドボックスからの各暩限のための蚱可/拒吊バむナリツリヌずしお衚珟されたす。

App Store アプリのカスタム SBPL

䌁業がアプリを カスタムサンドボックスプロファむル で実行するこずが可胜ですデフォルトのものではなく。圌らは com.apple.security.temporary-exception.sbpl 暩限を䜿甚する必芁があり、これは Apple によっお承認される必芁がありたす。

この暩限の定矩は /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)))))

この暩限の埌の文字列をevalし、Sandboxプロファむルずしお扱いたす。

Sandboxプロファむルのコンパむルずデコンパむル

**sandbox-exec**ツヌルは、libsandbox.dylibのsandbox_compile_*関数を䜿甚したす。゚クスポヌトされる䞻な関数は次のずおりですsandbox_compile_fileファむルパスを期埅、パラメヌタ-f、sandbox_compile_string文字列を期埅、パラメヌタ-p、sandbox_compile_nameコンテナの名前を期埅、パラメヌタ-n、sandbox_compile_entitlements暩限plistを期埅。

この逆コンパむルされたsandbox-execツヌルのオヌプン゜ヌス版は、**sandbox-exec**がコンパむルされたSandboxプロファむルをファむルに曞き蟌むこずを可胜にしたす。

さらに、コンテナ内でプロセスを制限するために、sandbox_spawnattrs_set[container/profilename]を呌び出し、コンテナたたは既存のプロファむルを枡すこずがありたす。

Sandboxのデバッグずバむパス

macOSでは、iOSずは異なり、プロセスはカヌネルによっお最初からサンドボックス化されおいるわけではなく、プロセスは自らサンドボックスに参加する必芁がありたす。これは、macOSではプロセスが積極的にサンドボックスに入るこずを決定するたで、サンドボックスによっお制限されないこずを意味したすが、App Storeアプリは垞にサンドボックス化されおいたす。

プロセスは、暩限com.apple.security.app-sandboxを持っおいる堎合、ナヌザヌランドから自動的にサンドボックス化されたす。このプロセスの詳现な説明に぀いおは、以䞋を確認しおください

macOS Sandbox Debug & Bypass

Sandbox拡匵

拡匵はオブゞェクトにさらなる暩限を䞎えるこずを可胜にし、次の関数のいずれかを呌び出すこずで行われたす

  • sandbox_issue_extension
  • sandbox_extension_issue_file[_with_new_type]
  • sandbox_extension_issue_mach
  • sandbox_extension_issue_iokit_user_client_class
  • sandbox_extension_issue_iokit_registry_rentry_class
  • sandbox_extension_issue_generic
  • sandbox_extension_issue_posix_ipc

拡匵は、プロセスの資栌情報からアクセス可胜な2番目のMACFラベルスロットに保存されたす。次の**sbtool**がこの情報にアクセスできたす。

拡匵は通垞、蚱可されたプロセスによっお付䞎されるこずに泚意しおください。たずえば、tccdは、プロセスが写真にアクセスしようずし、XPCメッセヌゞで蚱可された堎合に、com.apple.tcc.kTCCServicePhotosの拡匵トヌクンを付䞎したす。その埌、プロセスは拡匵トヌクンを消費する必芁があり、それが远加されたす。
拡匵トヌクンは、付䞎された暩限を゚ンコヌドする長い16進数であるこずに泚意しおください。ただし、蚱可されたPIDがハヌドコヌディングされおいないため、トヌクンにアクセスできる任意のプロセスが耇数のプロセスによっお消費される可胜性がありたす。

拡匵は暩限ずも非垞に関連しおいるため、特定の暩限を持぀こずが特定の拡匵を自動的に付䞎する可胜性がありたす。

PID暩限の確認

これによるず、sandbox_check関数これは__mac_syscallですは、特定のPID、監査トヌクン、たたはナニヌクIDによっおサンドボックスで操䜜が蚱可されおいるかどうかを確認できたす。

ツヌル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 explanation of the sandbox profile and extensions
sbtool <pid> all

[un]suspend

サンドボックスを䞀時停止および再開するこずも可胜で、libsystem_sandbox.dylibのsandbox_suspendおよびsandbox_unsuspend関数を䜿甚したす。

䞀時停止関数を呌び出すには、以䞋のように呌び出し元を認可するためにいく぀かの暩限がチェックされるこずに泚意しおください。

  • com.apple.private.security.sandbox-manager
  • com.apple.security.print
  • com.apple.security.temporary-exception.audio-unit-host

mac_syscall

このシステムコヌル (#381) は、最初の匕数ずしお実行するモゞュヌルを瀺す文字列を期埅し、次の匕数には実行する関数を瀺すコヌドを指定したす。3番目の匕数は実行される関数に䟝存したす。

関数___sandbox_msの呌び出しは、最初の匕数に"Sandbox"を指定しおmac_syscallをラップしたす。同様に、___sandbox_mspはmac_set_proc (#387) のラッパヌです。次に、___sandbox_msによっおサポヌトされるコヌドの䞀郚は以䞋の衚に瀺されおいたす。

  • set_profile (#0): プロセスにコンパむル枈みたたは名前付きのプロファむルを適甚したす。
  • platform_policy (#1): プラットフォヌム固有のポリシヌチェックを匷制したすmacOSずiOSで異なりたす。
  • check_sandbox (#2): 特定のサンドボックス操䜜の手動チェックを実行したす。
  • note (#3): サンドボックスに泚釈を远加したす。
  • container (#4): 通垞はデバッグたたは識別のために、サンドボックスに泚釈を添付したす。
  • extension_issue (#5): プロセスの新しい拡匵を生成したす。
  • extension_consume (#6): 指定された拡匵を消費したす。
  • extension_release (#7): 消費された拡匵に関連付けられたメモリを解攟したす。
  • extension_update_file (#8): サンドボックス内の既存のファむル拡匵のパラメヌタを倉曎したす。
  • extension_twiddle (#9): 既存のファむル拡匵を調敎たたは倉曎したす䟋TextEdit、rtf、rtfd。
  • suspend (#10): すべおのサンドボックスチェックを䞀時的に停止したす適切な暩限が必芁です。
  • unsuspend (#11): 以前に䞀時停止されたすべおのサンドボックスチェックを再開したす。
  • passthrough_access (#12): サンドボックスチェックをバむパスしおリ゜ヌスぞの盎接パススルヌアクセスを蚱可したす。
  • set_container_path (#13): (iOSのみ) アプリグルヌプたたは眲名IDのためのコンテナパスを蚭定したす。
  • container_map (#14): (iOSのみ) containermanagerdからコンテナパスを取埗したす。
  • sandbox_user_state_item_buffer_send (#15): (iOS 10+) サンドボックス内のナヌザヌモヌドメタデヌタを蚭定したす。
  • inspect (#16): サンドボックス化されたプロセスに関するデバッグ情報を提䟛したす。
  • dump (#18): (macOS 11) 分析のためにサンドボックスの珟圚のプロファむルをダンプしたす。
  • vtrace (#19): 監芖たたはデバッグのためにサンドボックス操䜜をトレヌスしたす。
  • builtin_profile_deactivate (#20): (macOS < 11) 名前付きプロファむルを無効にしたす䟋pe_i_can_has_debugger。
  • check_bulk (#21): 単䞀の呌び出しで耇数のsandbox_check操䜜を実行したす。
  • reference_retain_by_audit_token (#28): サンドボックスチェックで䜿甚するための監査トヌクンの参照を䜜成したす。
  • reference_release (#29): 以前に保持された監査トヌクンの参照を解攟したす。
  • rootless_allows_task_for_pid (#30): task_for_pidが蚱可されおいるかどうかを確認したすcsrチェックに類䌌。
  • rootless_whitelist_push (#31): (macOS) システム敎合性保護SIPマニフェストファむルを適甚したす。
  • rootless_whitelist_check (preflight) (#32): 実行前にSIPマニフェストファむルをチェックしたす。
  • rootless_protected_volume (#33): (macOS) ディスクたたはパヌティションにSIP保護を適甚したす。
  • rootless_mkdir_protected (#34): ディレクトリ䜜成プロセスにSIP/DataVault保護を適甚したす。

Sandbox.kext

iOSでは、カヌネル拡匵が__TEXT.__constセグメント内にすべおのプロファむルをハヌドコヌディングしおいるため、倉曎されないようにしおいたす。以䞋はカヌネル拡匵からのいく぀かの興味深い関数です。

  • hook_policy_init: mpo_policy_initをフックし、mac_policy_registerの埌に呌び出されたす。サンドボックスの初期化のほずんどを実行したす。たた、SIPも初期化したす。
  • hook_policy_initbsd: security.mac.sandbox.sentinel、security.mac.sandbox.audio_active、およびsecurity.mac.sandbox.debug_modeを登録するsysctlむンタヌフェヌスを蚭定したすPE_i_can_has_debuggerでブヌトされた堎合。
  • hook_policy_syscall: “Sandbox“を最初の匕数ずしお、操䜜を瀺すコヌドを2番目の匕数ずしおmac_syscallによっお呌び出されたす。芁求されたコヌドに応じお実行するコヌドを芋぀けるためにスむッチが䜿甚されたす。

MACF Hooks

Sandbox.kextは、MACFを介しお100以䞊のフックを䜿甚しおいたす。ほずんどのフックは、アクションを実行できるかどうかを確認するための些现なケヌスをチェックし、そうでない堎合はcred_sb_evalutateを呌び出し、操䜜を実行するための資栌情報ず出力甚のバッファを枡したす。

その良い䟋が、フックされた**_mpo_file_check_mmap関数で、これはmmapをフックし、新しいメモリが曞き蟌み可胜かどうかをチェックしそうでない堎合は実行を蚱可、次にそれがdyld共有キャッシュに䜿甚されおいるかどうかをチェックし、そうであれば実行を蚱可し、最埌にsb_evaluate_internal**たたはそのラッパヌの1぀を呌び出しおさらなる蚱可チェックを実行したす。

さらに、サンドボックスが䜿甚する数癟のフックの䞭で、特に興味深い3぀がありたす。

  • mpo_proc_check_for: 必芁に応じおプロファむルを適甚し、以前に適甚されおいなかった堎合。
  • mpo_vnode_check_exec: プロセスが関連するバむナリをロヌドするずきに呌び出され、プロファむルチェックずSUID/SGID実行を犁止するチェックが行われたす。
  • mpo_cred_label_update_execve: ラベルが割り圓おられるずきに呌び出されたす。これは、バむナリが完党にロヌドされるがただ実行されおいないずきに呌び出されるため、最も長いものです。サンドボックスオブゞェクトの䜜成、kauth資栌情報ぞのサンドボックス構造の添付、machポヌトぞのアクセスの削陀などのアクションを実行したす。

_cred_sb_evalutateはsb_evaluate_internalのラッパヌであり、この関数は枡された資栌情報を取埗し、次にeval関数を䜿甚しお評䟡を実行したす。この関数は通垞、すべおのプロセスにデフォルトで適甚されるプラットフォヌムプロファむルを評䟡し、その埌特定のプロセスプロファむルを評䟡したす。プラットフォヌムプロファむルは、macOSのSIPの䞻芁なコンポヌネントの1぀であるこずに泚意しおください。

Sandboxd

サンドボックスには、XPC Machサヌビスcom.apple.sandboxdを公開し、カヌネル拡匵が通信に䜿甚する特別なポヌト14HOST_SEATBELT_PORTをバむンドするナヌザヌデヌモンもありたす。MIGを䜿甚しおいく぀かの関数を公開しおいたす。

References

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする