macOS Sandbox
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
MacOS Sandbox (ilk olarak Seatbelt olarak adlandırılmıştır) sandbox içinde çalışan uygulamaları uygulamanın çalıştığı Sandbox profilinde belirtilen izin verilen eylemlerle sınırlar. Bu, uygulamanın yalnızca beklenen kaynaklara erişmesini sağlamaya yardımcı olur.
com.apple.security.app-sandbox
yetkisine sahip herhangi bir uygulama sandbox içinde çalıştırılacaktır. Apple ikili dosyaları genellikle bir Sandbox içinde çalıştırılır ve App Store'daki tüm uygulamalar bu yetkiye sahiptir. Bu nedenle, birçok uygulama sandbox içinde çalıştırılacaktır.
Bir sürecin ne yapabileceğini veya ne yapamayacağını kontrol etmek için Sandbox, bir sürecin denemesi durumunda neredeyse her işlemde MACF kullanarak kancalara sahiptir (çoğu syscalls dahil). Ancak, uygulamanın yetkilerine bağlı olarak Sandbox, süreçle daha hoşgörülü olabilir.
Sandbox'ın bazı önemli bileşenleri şunlardır:
kernel uzantısı /System/Library/Extensions/Sandbox.kext
özel çerçeve /System/Library/PrivateFrameworks/AppSandbox.framework
Kullanıcı alanında çalışan bir daemon /usr/libexec/sandboxd
kapsayıcılar ~/Library/Containers
Her sandboxed uygulamanın ~/Library/Containers/{CFBundleIdentifier}
içinde kendi kapsayıcısı olacaktır:
Her bir bundle id klasörünün içinde, Home klasörünü taklit eden bir yapıya sahip plist ve uygulamanın Data dizini bulunabilir:
Not edin ki, symlinkler Sandbox'tan "kaçmak" ve diğer klasörlere erişmek için orada olsa bile, Uygulamanın yine de onlara erişim için izinlere sahip olması gerekir. Bu izinler, RedirectablePaths
içindeki .plist
dosyasındadır.
SandboxProfileData
derlenmiş sandbox profil CFData'sının B64'e kaçırılmış halidir.
Sandboxed bir uygulama tarafından oluşturulan/değiştirilen her şey karantina niteliği alacaktır. Bu, sandbox uygulaması open
ile bir şey çalıştırmaya çalıştığında Gatekeeper'ı tetikleyerek bir sandbox alanını engelleyecektir.
Sandbox profilleri, o Sandbox içinde neyin izin verileceğini/yasaklanacağını belirten yapılandırma dosyalarıdır. Sandbox Profil Dili (SBPL) kullanır ve bu dil Scheme programlama dilini temel alır.
Burada bir örnek bulabilirsiniz:
Bu araştırmaya daha fazla izin verilebilecek veya reddedilebilecek eylemleri kontrol etmek için bakın.
Bir profilin derlenmiş versiyonunda, işlemlerin adları, derleyici ve kext tarafından bilinen bir dizi içindeki girişleriyle değiştirilir, bu da derlenmiş versiyonu daha kısa ve okunması daha zor hale getirir.
Önemli sistem hizmetleri kendi özel sandbox'larında çalışır, örneğin mdnsresponder
hizmeti. Bu özel sandbox profillerini şu dizinlerde görebilirsiniz:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
Diğer sandbox profilleri https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles adresinde kontrol edilebilir.
App Store uygulamaları /System/Library/Sandbox/Profiles/application.sb
profilini kullanır. Bu profilde com.apple.security.network.server
gibi yetkilendirmelerin bir sürecin ağı kullanmasına nasıl izin verdiğini kontrol edebilirsiniz.
SIP, /System/Library/Sandbox/rootless.conf içinde platform_profile olarak adlandırılan bir Sandbox profilidir.
Belirli bir sandbox profili ile bir uygulamayı başlatmak için şunu kullanabilirsiniz:
Apple tarafından yazılmış yazılımın Windows üzerinde ek güvenlik önlemleri yoktur, örneğin uygulama sandboxing.
Atlatma örnekleri:
https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (sandbox dışında ~$
ile başlayan dosyalar yazabiliyorlar).
Her eylem kontrol edildiğinde sandbox'ın gerçekleştirdiği tüm kontrolleri izlemek mümkündür. Bunun için aşağıdaki profili oluşturun:
Ve sonra o profili kullanarak bir şey çalıştırın:
In /tmp/trace.out
her çağrıldığında gerçekleştirilen her sandbox kontrolünü görebileceksiniz (yani, birçok tekrar).
Ayrıca sandbox'ı -t
parametresi ile izlemek de mümkündür: sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls
libsystem_sandbox.dylib
tarafından dışa aktarılan sandbox_set_trace_path
fonksiyonu, sandbox kontrollerinin yazılacağı bir iz dosyası adı belirtmeye olanak tanır.
Ayrıca sandbox_vtrace_enable()
çağrılarak benzer bir şey yapmak ve ardından sandbox_vtrace_report()
çağrısı ile hata günlüklerini almak da mümkündür.
libsandbox.dylib
, bir sürecin sandbox durumunun (uzantılar dahil) bir listesini veren sandbox_inspect_pid adlı bir fonksiyonu dışa aktarır. Ancak, yalnızca platform ikili dosyaları bu fonksiyonu kullanabilir.
MacOS, sistem sandbox profillerini iki konumda saklar: /usr/share/sandbox/ ve /System/Library/Sandbox/Profiles.
Ve eğer bir üçüncü taraf uygulama com.apple.security.app-sandbox yetkisini taşıyorsa, sistem bu sürece /System/Library/Sandbox/Profiles/application.sb profilini uygular.
iOS'ta, varsayılan profil container olarak adlandırılır ve SBPL metin temsiline sahip değiliz. Bellekte, bu sandbox, sandbox'tan her izin için Allow/Deny ikili ağacı olarak temsil edilir.
Şirketlerin uygulamalarını özel Sandbox profilleri ile çalıştırmaları mümkün olabilir (varsayılan olan yerine). Bunun için com.apple.security.temporary-exception.sbpl
yetkisini kullanmaları gerekir ve bu yetki Apple tarafından yetkilendirilmelidir.
Bu yetkinin tanımını /System/Library/Sandbox/Profiles/application.sb:
dosyasında kontrol etmek mümkündür.
Bu, bu yetki sonrasında dizeyi bir Sandbox profili olarak değerlendirecektir.
sandbox-exec
aracı, libsandbox.dylib
içindeki sandbox_compile_*
fonksiyonlarını kullanır. İhracat yapılan ana fonksiyonlar şunlardır: sandbox_compile_file
(bir dosya yolu bekler, parametre -f
), sandbox_compile_string
(bir dize bekler, parametre -p
), sandbox_compile_name
(bir konteyner adı bekler, parametre -n
), sandbox_compile_entitlements
(yetki plist'ini bekler).
Bu tersine çevrilmiş ve sandbox-exec aracının açık kaynaklı versiyonu, sandbox-exec
aracının derlenmiş sandbox profilini bir dosyaya yazmasına olanak tanır.
Ayrıca, bir süreci bir konteyner içinde sınırlamak için sandbox_spawnattrs_set[container/profilename]
çağrılabilir ve bir konteyner veya önceden var olan bir profil geçilebilir.
macOS'ta, süreçlerin başlangıçta çekirdek tarafından sandbox'lanmadığı iOS'un aksine, süreçlerin kendilerinin sandbox'a katılması gerekir. Bu, macOS'ta bir sürecin, aktif olarak girmeye karar vermediği sürece sandbox tarafından kısıtlanmadığı anlamına gelir, ancak App Store uygulamaları her zaman sandbox'lanmıştır.
Süreçler, com.apple.security.app-sandbox
yetkisine sahip olduklarında kullanıcı alanından otomatik olarak Sandbox'lanır. Bu sürecin ayrıntılı açıklaması için kontrol edin:
Uzantılar, bir nesneye daha fazla ayrıcalık vermeye olanak tanır ve bir fonksiyonu çağırarak verilir:
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
Uzantılar, süreç kimlik bilgileri üzerinden erişilebilen ikinci MACF etiket slotunda saklanır. Aşağıdaki sbtool
bu bilgilere erişebilir.
Uzantıların genellikle izin verilen süreçler tarafından verildiğini unutmayın; örneğin, tccd
, bir süreç fotoğraflara erişmeye çalıştığında ve bir XPC mesajında izin verildiğinde com.apple.tcc.kTCCServicePhotos
uzantı token'ını verecektir. Ardından, süreç uzantı token'ını tüketmesi gerekecektir, böylece ona eklenir.
Uzantı token'larının, verilen izinleri kodlayan uzun onaltılı sayılar olduğunu unutmayın. Ancak, izin verilen PID'nin sabit kodlu olmadığını belirtmek gerekir; bu, token'a erişimi olan herhangi bir sürecin birden fazla süreç tarafından tüketilebileceği anlamına gelir.
Uzantıların, yetkilerle de çok ilgili olduğunu unutmayın; bu nedenle belirli yetkilere sahip olmak, belirli uzantıları otomatik olarak verebilir.
Buna göre, sandbox_check
fonksiyonları (bu bir __mac_syscall
), belirli bir PID, denetim token'ı veya benzersiz ID ile sandbox tarafından bir işlemin izin verilip verilmediğini kontrol edebilir.
sbtool aracı (bunu burada derlenmiş olarak bulabilirsiniz), bir PID'nin belirli eylemleri gerçekleştirip gerçekleştiremeyeceğini kontrol edebilir:
Sandbox'ı libsystem_sandbox.dylib
içindeki sandbox_suspend
ve sandbox_unsuspend
fonksiyonları kullanarak askıya almak ve askıdan kaldırmak da mümkündür.
Suspend fonksiyonunu çağırmak için bazı yetkilendirmelerin kontrol edildiğini unutmayın:
com.apple.private.security.sandbox-manager
com.apple.security.print
com.apple.security.temporary-exception.audio-unit-host
Bu sistem çağrısı (#381), çalıştırılacak modülü belirten bir dize birinci argüman ve çalıştırılacak fonksiyonu belirten bir kod ikinci argüman bekler. Üçüncü argüman ise yürütülen fonksiyona bağlı olacaktır.
___sandbox_ms
çağrısı, birinci argümanda "Sandbox"
belirterek mac_syscall
'ı sarar; tıpkı ___sandbox_msp
'nin mac_set_proc
'un (#387) bir sarmalayıcı olması gibi. Ardından, ___sandbox_ms
tarafından desteklenen bazı kodlar bu tabloda bulunabilir:
set_profile (#0): Bir sürece derlenmiş veya adlandırılmış bir profil uygulayın.
platform_policy (#1): Platforma özgü politika kontrollerini zorlayın (macOS ve iOS arasında değişir).
check_sandbox (#2): Belirli bir sandbox işleminin manuel kontrolünü gerçekleştirin.
note (#3): Bir Sandbox'a not ekler.
container (#4): Genellikle hata ayıklama veya tanımlama için bir sandbox'a bir not ekler.
extension_issue (#5): Bir süreç için yeni bir uzantı oluşturun.
extension_consume (#6): Verilen bir uzantıyı tüketin.
extension_release (#7): Tüketilen bir uzantıya bağlı belleği serbest bırakın.
extension_update_file (#8): Sandbox içindeki mevcut bir dosya uzantısının parametrelerini değiştirin.
extension_twiddle (#9): Mevcut bir dosya uzantısını ayarlayın veya değiştirin (örneğin, TextEdit, rtf, rtfd).
suspend (#10): Tüm sandbox kontrollerini geçici olarak askıya alın (uygun yetkilendirmeler gerektirir).
unsuspend (#11): Daha önce askıya alınan tüm sandbox kontrollerini yeniden başlatın.
passthrough_access (#12): Sandbox kontrollerini atlayarak bir kaynağa doğrudan geçiş erişimi sağlayın.
set_container_path (#13): (sadece iOS) Bir uygulama grubu veya imza kimliği için bir konteyner yolu ayarlayın.
container_map (#14): (sadece iOS) containermanagerd
'en bir konteyner yolu alın.
sandbox_user_state_item_buffer_send (#15): (iOS 10+) Sandbox'ta kullanıcı modu meta verilerini ayarlayın.
inspect (#16): Sandbox'lanmış bir süreç hakkında hata ayıklama bilgisi sağlayın.
dump (#18): (macOS 11) Analiz için bir sandbox'ın mevcut profilini dökün.
vtrace (#19): İzleme veya hata ayıklama için sandbox işlemlerini izleyin.
builtin_profile_deactivate (#20): (macOS < 11) Adlandırılmış profilleri devre dışı bırakın (örneğin, pe_i_can_has_debugger
).
check_bulk (#21): Tek bir çağrıda birden fazla sandbox_check
işlemi gerçekleştirin.
reference_retain_by_audit_token (#28): Sandbox kontrollerinde kullanılmak üzere bir denetim belirteci için bir referans oluşturun.
reference_release (#29): Daha önce tutulan bir denetim belirteci referansını serbest bırakın.
rootless_allows_task_for_pid (#30): task_for_pid
'in izinli olup olmadığını doğrulayın (benzer şekilde csr
kontrolleri).
rootless_whitelist_push (#31): (macOS) Bir Sistem Bütünlüğü Koruma (SIP) manifest dosyası uygulayın.
rootless_whitelist_check (preflight) (#32): Yürütmeden önce SIP manifest dosyasını kontrol edin.
rootless_protected_volume (#33): (macOS) Bir disk veya bölüme SIP korumaları uygulayın.
rootless_mkdir_protected (#34): Bir dizin oluşturma işlemi için SIP/DataVault koruması uygulayın.
iOS'ta çekirdek uzantısının tüm profilleri hardcoded olarak __TEXT.__const
segmentinde içerdiğini unutmayın, böylece bunların değiştirilmesi önlenir. Çekirdek uzantısından bazı ilginç fonksiyonlar şunlardır:
hook_policy_init
: mpo_policy_init
'i bağlar ve mac_policy_register
'dan sonra çağrılır. Sandbox'ın çoğu başlangıç işlemlerini gerçekleştirir. Ayrıca SIP'yi de başlatır.
hook_policy_initbsd
: security.mac.sandbox.sentinel
, security.mac.sandbox.audio_active
ve security.mac.sandbox.debug_mode
'u kaydederek sysctl arayüzünü ayarlar (eğer PE_i_can_has_debugger
ile boot edilmişse).
hook_policy_syscall
: mac_syscall
tarafından "Sandbox" birinci argüman ve işlemi belirten kod ikinci argüman olarak çağrılır. İstenen koda göre çalıştırılacak kodu bulmak için bir switch kullanılır.
Sandbox.kext
MACF aracılığıyla yüzden fazla hook kullanır. Çoğu hook, eylemi gerçekleştirmeye izin veren bazı önemsiz durumları kontrol eder; aksi takdirde, cred_sb_evalutate
'yi MACF'den alınan kimlik bilgileri ve gerçekleştirilecek işlem ile ilgili bir sayı ve çıkış için bir buffer ile çağırırlar.
Bunun iyi bir örneği, _mpo_file_check_mmap
fonksiyonudur; bu fonksiyon mmap
'i bağlar ve yeni belleğin yazılabilir olup olmadığını kontrol etmeye başlar (ve eğer değilse yürütmeye izin vermez), ardından dyld paylaşılan önbellek için kullanılıp kullanılmadığını kontrol eder ve eğer öyleyse yürütmeye izin verir, ve nihayetinde daha fazla izin kontrolü gerçekleştirmek için sb_evaluate_internal
'i (veya onun sarmalayıcılarından birini) çağırır.
Ayrıca, Sandbox'ın kullandığı yüzlerce hook arasında özellikle ilginç olan 3 tanesi vardır:
mpo_proc_check_for
: Gerekirse profili uygular ve daha önce uygulanmamışsa.
mpo_vnode_check_exec
: Bir süreç ilişkili ikili dosyayı yüklediğinde çağrılır, ardından bir profil kontrolü gerçekleştirilir ve ayrıca SUID/SGID yürütmelerini yasaklayan bir kontrol yapılır.
mpo_cred_label_update_execve
: Etiket atandığında çağrılır. Bu, ikili dosya tamamen yüklendiğinde ancak henüz yürütülmediğinde çağrıldığı için en uzun olanıdır. Sandbox nesnesi oluşturma, kauth kimlik bilgilerine sandbox yapısını ekleme, mach portlarına erişimi kaldırma gibi işlemler gerçekleştirir...
_cred_sb_evalutate
'nin sb_evaluate_internal
üzerinde bir sarmalayıcı olduğunu unutmayın ve bu fonksiyon, geçirilen kimlik bilgilerini alır ve ardından genellikle tüm süreçlere varsayılan olarak uygulanan platform profili ve ardından belirli süreç profili kullanarak değerlendirme yapar. Platform profili, macOS'taki SIP'nin ana bileşenlerinden biridir.
Sandbox ayrıca, XPC Mach servisi com.apple.sandboxd
'yi sergileyen bir kullanıcı daemon'u çalıştırır ve çekirdek uzantısının onunla iletişim kurmak için kullandığı özel port 14 (HOST_SEATBELT_PORT
) ile bağlanır. MIG kullanarak bazı fonksiyonlar sunar.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)