macOS Sandbox
Basic Information
MacOS Sandbox (शुरुआत में Seatbelt कहा जाता था) सैंडबॉक्स के अंदर चलने वाले अनुप्रयोगों को सैंडबॉक्स प्रोफ़ाइल में निर्दिष्ट अनुमत क्रियाओं तक सीमित करता है जिसके साथ ऐप चल रहा है। यह सुनिश्चित करने में मदद करता है कि अनुप्रयोग केवल अपेक्षित संसाधनों तक पहुँच रहा होगा।
कोई भी ऐप जिसमें अधिकार com.apple.security.app-sandbox
है, सैंडबॉक्स के अंदर निष्पादित किया जाएगा। एप्पल बाइनरी आमतौर पर सैंडबॉक्स के अंदर निष्पादित होती हैं, और ऐप स्टोर से सभी अनुप्रयोगों में वह अधिकार होता है। इसलिए कई अनुप्रयोग सैंडबॉक्स के अंदर निष्पादित होंगे।
यह नियंत्रित करने के लिए कि एक प्रक्रिया क्या कर सकती है या नहीं कर सकती है, सैंडबॉक्स में लगभग किसी भी ऑपरेशन में हुक होते हैं जो एक प्रक्रिया कोशिश कर सकती है (अधिकांश syscalls सहित) MACF का उपयोग करते हुए। हालाँकि, ऐप के अधिकारों के आधार पर सैंडबॉक्स प्रक्रिया के साथ अधिक उदार हो सकता है।
सैंडबॉक्स के कुछ महत्वपूर्ण घटक हैं:
कर्नेल एक्सटेंशन
/System/Library/Extensions/Sandbox.kext
निजी ढांचा
/System/Library/PrivateFrameworks/AppSandbox.framework
एक डेमन जो उपयोगकर्ता भूमि में चल रहा है
/usr/libexec/sandboxd
कंटेनर
~/Library/Containers
Containers
हर सैंडबॉक्स किए गए अनुप्रयोग का अपना कंटेनर होगा ~/Library/Containers/{CFBundleIdentifier}
:
प्रत्येक बंडल आईडी फ़ोल्डर के अंदर आप plist और ऐप का Data directory पा सकते हैं, जिसकी संरचना होम फ़ोल्डर की नकल करती है:
ध्यान दें कि भले ही symlinks "Sandbox" से "escape" करने और अन्य फ़ोल्डरों तक पहुँचने के लिए वहाँ हैं, ऐप को अभी भी उन तक पहुँचने के लिए अनुमतियाँ होनी चाहिए। ये अनुमतियाँ .plist
में RedirectablePaths
के अंदर हैं।
SandboxProfileData
संकलित सैंडबॉक्स प्रोफ़ाइल CFData है जिसे B64 में एस्केप किया गया है।
एक Sandboxed एप्लिकेशन द्वारा बनाई गई/संशोधित हर चीज़ को quarantine attribute मिलेगा। यह sandbox स्पेस को Gatekeeper को ट्रिगर करके रोक देगा यदि sandbox ऐप कुछ open
के साथ निष्पादित करने की कोशिश करता है।
Sandbox Profiles
Sandbox प्रोफाइल कॉन्फ़िगरेशन फ़ाइलें हैं जो यह संकेत करती हैं कि उस Sandbox में क्या अनुमति/प्रतिबंधित होगा। यह Sandbox Profile Language (SBPL) का उपयोग करता है, जो Scheme प्रोग्रामिंग भाषा का उपयोग करता है।
यहाँ आप एक उदाहरण पा सकते हैं:
इस शोध को और अधिक क्रियाओं की जांच करने के लिए देखें जो अनुमति या अस्वीकृत की जा सकती हैं।
ध्यान दें कि एक प्रोफ़ाइल के संकलित संस्करण में संचालन के नाम को एक ऐरे में उनके प्रविष्टियों द्वारा प्रतिस्थापित किया जाता है जिसे dylib और kext द्वारा जाना जाता है, जिससे संकलित संस्करण छोटा और पढ़ने में अधिक कठिन हो जाता है।
महत्वपूर्ण सिस्टम सेवाएँ अपने स्वयं के कस्टम सैंडबॉक्स के अंदर चलती हैं जैसे कि mdnsresponder
सेवा। आप इन कस्टम सैंडबॉक्स प्रोफाइल को देख सकते हैं:
/usr/share/sandbox
/System/Library/Sandbox/Profiles
अन्य सैंडबॉक्स प्रोफाइल की जांच https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles पर की जा सकती है।
ऐप स्टोर ऐप्स प्रोफ़ाइल /System/Library/Sandbox/Profiles/application.sb
का उपयोग करते हैं। आप इस प्रोफ़ाइल में देख सकते हैं कि कैसे अधिकार जैसे com.apple.security.network.server
एक प्रक्रिया को नेटवर्क का उपयोग करने की अनुमति देते हैं।
SIP एक सैंडबॉक्स प्रोफ़ाइल है जिसे /System/Library/Sandbox/rootless.conf में platform_profile कहा जाता है।
सैंडबॉक्स प्रोफ़ाइल उदाहरण
एक विशिष्ट सैंडबॉक्स प्रोफ़ाइल के साथ एक एप्लिकेशन शुरू करने के लिए आप उपयोग कर सकते हैं:
ध्यान दें कि Apple द्वारा लिखित सॉफ़्टवेयर जो Windows पर चलता है, उसमें अतिरिक्त सुरक्षा उपाय नहीं हैं, जैसे कि एप्लिकेशन सैंडबॉक्सिंग।
Bypasses examples:
https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c (वे
~$
से शुरू होने वाले नाम के साथ सैंडबॉक्स के बाहर फ़ाइलें लिखने में सक्षम हैं)।
Sandbox Tracing
Via profile
यह संभव है कि हर बार जब एक क्रिया की जांच की जाती है, तो सैंडबॉक्स द्वारा किए गए सभी चेक को ट्रेस किया जा सके। इसके लिए बस निम्नलिखित प्रोफ़ाइल बनाएं:
फिर बस उस प्रोफ़ाइल का उपयोग करके कुछ निष्पादित करें:
In /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 सिस्टम सैंडबॉक्स प्रोफाइल को दो स्थानों पर संग्रहीत करता है: /usr/share/sandbox/ और /System/Library/Sandbox/Profiles।
और यदि कोई तृतीय-पक्ष एप्लिकेशन com.apple.security.app-sandbox अधिकार लेता है, तो सिस्टम उस प्रक्रिया पर /System/Library/Sandbox/Profiles/application.sb प्रोफाइल लागू करता है।
iOS में, डिफ़ॉल्ट प्रोफाइल को container कहा जाता है और हमारे पास SBPL पाठ प्रतिनिधित्व नहीं है। मेमोरी में, इस सैंडबॉक्स को सैंडबॉक्स से प्रत्येक अनुमति के लिए Allow/Deny बाइनरी ट्री के रूप में दर्शाया गया है।
ऐप स्टोर ऐप्स में कस्टम SBPL
कंपनियों के लिए अपने ऐप्स को कस्टम सैंडबॉक्स प्रोफाइल के साथ चलाना संभव हो सकता है (डिफ़ॉल्ट के बजाय)। उन्हें अधिकार com.apple.security.temporary-exception.sbpl
का उपयोग करने की आवश्यकता है जिसे Apple द्वारा अधिकृत किया जाना चाहिए।
इस अधिकार की परिभाषा की जांच करना संभव है /System/Library/Sandbox/Profiles/application.sb:
यह इस अधिकार के बाद के स्ट्रिंग को एक Sandbox प्रोफ़ाइल के रूप में eval करेगा।
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 के विपरीत जहां प्रक्रियाएँ शुरू से ही कर्नेल द्वारा Sandbox की गई होती हैं, प्रक्रियाओं को स्वयं Sandbox में शामिल होना चाहिए। इसका मतलब है कि macOS पर, एक प्रक्रिया Sandbox द्वारा प्रतिबंधित नहीं होती जब तक कि वह सक्रिय रूप से इसमें प्रवेश करने का निर्णय नहीं लेती, हालांकि App Store ऐप्स हमेशा Sandbox में होते हैं।
यदि प्रक्रियाओं के पास अधिकार है: com.apple.security.app-sandbox
, तो वे उपयोगकर्ता भूमि से स्वचालित रूप से Sandbox में होती हैं जब वे शुरू होती हैं। इस प्रक्रिया के विस्तृत विवरण के लिए देखें:
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
एक्सटेंशन दूसरे MACF लेबल स्लॉट में संग्रहीत होते हैं जो प्रक्रिया क्रेडेंशियल से सुलभ होते हैं। निम्नलिखित sbtool
इस जानकारी तक पहुँच सकता है।
ध्यान दें कि एक्सटेंशन आमतौर पर अनुमत प्रक्रियाओं द्वारा दिए जाते हैं, उदाहरण के लिए, tccd
उस प्रक्रिया को com.apple.tcc.kTCCServicePhotos
का एक्सटेंशन टोकन देगा जब एक प्रक्रिया ने फ़ोटो तक पहुँचने की कोशिश की और एक XPC संदेश में अनुमति दी गई। फिर, प्रक्रिया को एक्सटेंशन टोकन का उपभोग करने की आवश्यकता होगी ताकि इसे जोड़ा जा सके।
ध्यान दें कि एक्सटेंशन टोकन लंबे हेक्साडेसिमल होते हैं जो दिए गए अनुमतियों को एन्कोड करते हैं। हालाँकि, इनमें अनुमत PID हार्डकोडेड नहीं होते हैं जिसका अर्थ है कि किसी भी प्रक्रिया को जो टोकन तक पहुँच रखती है, उसे कई प्रक्रियाओं द्वारा उपभोग किया जा सकता है।
ध्यान दें कि एक्सटेंशन अधिकारों से भी बहुत संबंधित होते हैं, इसलिए कुछ अधिकार होने से स्वचालित रूप से कुछ एक्सटेंशन मिल सकते हैं।
PID विशेषाधिकार की जाँच करें
इसके अनुसार, sandbox_check
कार्य (यह एक __mac_syscall
है), यह जाँच कर सकते हैं क्या एक ऑपरेशन को एक निश्चित PID, ऑडिट टोकन या अद्वितीय ID द्वारा Sandbox द्वारा अनुमति दी गई है या नहीं।
उपकरण sbtool (इसे यहाँ संकलित किया गया है) यह जाँच कर सकता है कि क्या एक PID कुछ कार्य कर सकता है:
[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) पहले तर्क के रूप में एक स्ट्रिंग की अपेक्षा करता है जो चलाने के लिए मॉड्यूल को इंगित करेगा, और फिर दूसरे तर्क में एक कोड जो चलाने के लिए फ़ंक्शन को इंगित करेगा। फिर तीसरा तर्क उस फ़ंक्शन पर निर्भर करेगा जो निष्पादित किया गया है।
फ़ंक्शन ___sandbox_ms
कॉल mac_syscall
को लपेटता है जो पहले तर्क में "Sandbox"
को इंगित करता है ठीक वैसे ही जैसे ___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 केवल) एक ऐप समूह या साइनिंग आईडी के लिए एक कंटेनर पथ सेट करें।
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
: इसेmac_syscall
द्वारा "Sandbox" के पहले तर्क के रूप में और दूसरे में ऑपरेशन को इंगित करने वाले कोड के साथ कॉल किया जाता है। एक स्विच का उपयोग अनुरोधित कोड के अनुसार चलाने के लिए कोड खोजने के लिए किया जाता है।
MACF Hooks
Sandbox.kext
MACF के माध्यम से एक सौ से अधिक हुक का उपयोग करता है। अधिकांश हुक कुछ तुच्छ मामलों की जांच करेंगे जो कार्रवाई करने की अनुमति देते हैं, यदि नहीं, तो वे cred_sb_evalutate
को MACF से क्रेडेंशियल्स और एक संख्या के साथ कॉल करेंगे जो ऑपरेशन को करने के लिए है और एक बफर आउटपुट के लिए है।
इसका एक अच्छा उदाहरण फ़ंक्शन _mpo_file_check_mmap
है जो mmap
को हुक करता है और यह जांचना शुरू करेगा कि क्या नई मेमोरी लिखने योग्य होने जा रही है (और यदि नहीं तो निष्पादन की अनुमति नहीं देगा), फिर यह जांचेगा कि क्या इसका उपयोग dyld साझा कैश के लिए किया जा रहा है और यदि हां तो निष्पादन की अनुमति देगा, और अंततः यह sb_evaluate_internal
(या इसके किसी लपेटन) को आगे की अनुमति जांच करने के लिए कॉल करेगा।
इसके अलावा, सैंडबॉक्स द्वारा उपयोग किए जाने वाले सौ(ओं) हुक में से, 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 के मुख्य घटकों में से एक है।
Sandboxd
सैंडबॉक्स में एक उपयोगकर्ता डेमन भी चल रहा है जो XPC Mach सेवा com.apple.sandboxd
को उजागर करता है और विशेष पोर्ट 14 (HOST_SEATBELT_PORT
) को बाइंड करता है जिसका उपयोग कर्नेल एक्सटेंशन इसके साथ संवाद करने के लिए करता है। यह MIG का उपयोग करके कुछ फ़ंक्शंस को उजागर करता है।
References
Last updated