macOS XPC
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)
XPC, जिसका मतलब XNU (macOS द्वारा उपयोग किया जाने वाला कर्नेल) इंटर-प्रोसेस संचार है, macOS और iOS पर प्रक्रियाओं के बीच संचार के लिए एक ढांचा है। XPC सुरक्षित, असिंक्रोनस विधि कॉल करने का एक तंत्र प्रदान करता है जो सिस्टम पर विभिन्न प्रक्रियाओं के बीच होता है। यह एप्पल के सुरक्षा सिद्धांत का एक हिस्सा है, जो विशेषाधिकार-सेपरेटेड एप्लिकेशन के निर्माण की अनुमति देता है जहाँ प्रत्येक घटक केवल उन्हीं अनुमतियों के साथ चलता है जिनकी उसे अपने कार्य को करने के लिए आवश्यकता होती है, इस प्रकार एक समझौता की गई प्रक्रिया से संभावित नुकसान को सीमित करता है।
XPC एक प्रकार के इंटर-प्रोसेस संचार (IPC) का उपयोग करता है, जो एक सेट है जो एक ही सिस्टम पर चल रहे विभिन्न कार्यक्रमों को डेटा भेजने और प्राप्त करने की अनुमति देता है।
XPC के प्राथमिक लाभों में शामिल हैं:
सुरक्षा: विभिन्न प्रक्रियाओं में कार्यों को अलग करके, प्रत्येक प्रक्रिया को केवल वही अनुमतियाँ दी जा सकती हैं जिनकी उसे आवश्यकता होती है। इसका मतलब है कि यदि कोई प्रक्रिया समझौता कर ली जाती है, तो उसके पास नुकसान करने की सीमित क्षमता होती है।
स्थिरता: XPC क्रैश को उस घटक तक सीमित करने में मदद करता है जहाँ वे होते हैं। यदि कोई प्रक्रिया क्रैश होती है, तो इसे बिना बाकी सिस्टम को प्रभावित किए पुनः प्रारंभ किया जा सकता है।
प्रदर्शन: XPC आसान समवर्तीता की अनुमति देता है, क्योंकि विभिन्न कार्यों को विभिन्न प्रक्रियाओं में एक साथ चलाया जा सकता है।
एकमात्र नुकसान यह है कि एक एप्लिकेशन को कई प्रक्रियाओं में विभाजित करना और उन्हें XPC के माध्यम से संचारित करना कम प्रभावी है। लेकिन आज के सिस्टम में यह लगभग ध्यान देने योग्य नहीं है और लाभ बेहतर हैं।
एक एप्लिकेशन के XPC घटक स्वयं एप्लिकेशन के अंदर होते हैं। उदाहरण के लिए, Safari में आप उन्हें /Applications/Safari.app/Contents/XPCServices
में पा सकते हैं। इनके पास .xpc
एक्सटेंशन होता है (जैसे com.apple.Safari.SandboxBroker.xpc
) और ये मुख्य बाइनरी के साथ बंडल होते हैं: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker
और एक Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
जैसा कि आप सोच रहे होंगे, एक XPC घटक के पास अन्य XPC घटकों या मुख्य ऐप बाइनरी की तुलना में विभिन्न अधिकार और विशेषताएँ होंगी। सिवाय इसके कि यदि एक XPC सेवा को JoinExistingSession इसके Info.plist फ़ाइल में “True” पर सेट किया गया है। इस मामले में, XPC सेवा उस सुरक्षा सत्र में चलेगी जो उसे कॉल करने वाले एप्लिकेशन के समान है।
XPC सेवाएँ launchd द्वारा आवश्यकतानुसार शुरू की जाती हैं और सभी कार्यों के पूर्ण होने पर सिस्टम संसाधनों को मुक्त करने के लिए बंद कर दी जाती हैं। एप्लिकेशन-विशिष्ट XPC घटक केवल एप्लिकेशन द्वारा उपयोग किए जा सकते हैं, इस प्रकार संभावित कमजोरियों से संबंधित जोखिम को कम करते हैं।
सिस्टम-व्यापी XPC सेवाएँ सभी उपयोगकर्ताओं के लिए सुलभ हैं। ये सेवाएँ, चाहे launchd हों या Mach-प्रकार की, plist फ़ाइलों में परिभाषित की जानी चाहिए जो निर्दिष्ट निर्देशिकाओं में स्थित होती हैं जैसे /System/Library/LaunchDaemons
, /Library/LaunchDaemons
, /System/Library/LaunchAgents
, या /Library/LaunchAgents
।
इन plist फ़ाइलों में एक कुंजी होगी जिसे MachServices
कहा जाता है जिसमें सेवा का नाम होगा, और एक कुंजी होगी जिसे Program
कहा जाता है जिसमें बाइनरी का पथ होगा:
The ones in LaunchDameons
are run by root. So if an unprivileged process can talk with one of these it could be able to escalate privileges.
xpc_object_t
हर XPC संदेश एक शब्दकोश वस्तु है जो अनुक्रमण और अनुक्रमण को सरल बनाता है। इसके अलावा, libxpc.dylib
अधिकांश डेटा प्रकारों की घोषणा करता है ताकि यह सुनिश्चित किया जा सके कि प्राप्त डेटा अपेक्षित प्रकार का है। C API में हर वस्तु एक xpc_object_t
है (और इसका प्रकार xpc_get_type(object)
का उपयोग करके जांचा जा सकता है)।
इसके अलावा, फ़ंक्शन xpc_copy_description(object)
का उपयोग वस्तु का स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए किया जा सकता है जो डिबगिंग उद्देश्यों के लिए उपयोगी हो सकता है।
इन वस्तुओं में कुछ विधियाँ भी होती हैं जिन्हें कॉल किया जा सकता है जैसे xpc_<object>_copy
, xpc_<object>_equal
, xpc_<object>_hash
, xpc_<object>_serialize
, xpc_<object>_deserialize
...
xpc_object_t
को xpc_<objetType>_create
फ़ंक्शन को कॉल करके बनाया जाता है, जो आंतरिक रूप से _xpc_base_create(Class, Size)
को कॉल करता है जहाँ वस्तु की कक्षा का प्रकार (एक XPC_TYPE_*
में से) और इसका आकार (मेटाडेटा के लिए कुछ अतिरिक्त 40B आकार में जोड़ा जाएगा) निर्दिष्ट किया जाता है। जिसका अर्थ है कि वस्तु का डेटा 40B के ऑफसेट से शुरू होगा।
इसलिए, xpc_<objectType>_t
एक प्रकार का उपवर्ग है xpc_object_t
का जो os_object_t*
का उपवर्ग होगा।
ध्यान दें कि यह डेवलपर होना चाहिए जो xpc_dictionary_[get/set]_<objectType>
का उपयोग करके एक कुंजी के प्रकार और वास्तविक मान को प्राप्त या सेट करता है।
xpc_pipe
एक xpc_pipe
एक FIFO पाइप है जिसका उपयोग प्रक्रियाएँ संवाद करने के लिए कर सकती हैं (संवाद में Mach संदेशों का उपयोग होता है)।
एक XPC सर्वर बनाने के लिए xpc_pipe_create()
या xpc_pipe_create_from_port()
को कॉल करके इसे एक विशिष्ट Mach पोर्ट का उपयोग करके बनाया जा सकता है। फिर, संदेश प्राप्त करने के लिए xpc_pipe_receive
और xpc_pipe_try_receive
को कॉल किया जा सकता है।
ध्यान दें कि xpc_pipe
वस्तु एक xpc_object_t
है जिसमें इसके संरचना में उपयोग किए गए दो Mach पोर्ट और नाम (यदि कोई हो) के बारे में जानकारी होती है। नाम, उदाहरण के लिए, डेमन secinitd
अपने plist /System/Library/LaunchDaemons/com.apple.secinitd.plist
में पाइप को com.apple.secinitd
के रूप में कॉन्फ़िगर करता है।
एक xpc_pipe
का उदाहरण bootstrap pipe है जो launchd
द्वारा बनाया गया है जिससे Mach पोर्ट साझा करना संभव हो जाता है।
NSXPC*
ये Objective-C उच्च स्तर की वस्तुएँ हैं जो XPC कनेक्शनों का अमूर्तकरण करने की अनुमति देती हैं। इसके अलावा, इन वस्तुओं को DTrace के साथ पिछले लोगों की तुलना में डिबग करना आसान है।
GCD Queues
XPC संदेशों को पास करने के लिए GCD का उपयोग करता है, इसके अलावा यह कुछ डिस्पैच कतारें उत्पन्न करता है जैसे xpc.transactionq
, xpc.io
, xpc-events.add-listenerq
, xpc.service-instance
...
ये .xpc
एक्सटेंशन वाले बंडल हैं जो अन्य परियोजनाओं के XPCServices
फ़ोल्डर के अंदर स्थित हैं और Info.plist
में उनके पास CFBundlePackageType
XPC!
पर सेट होता है।
इस फ़ाइल में अन्य कॉन्फ़िगरेशन कुंजी होती हैं जैसे ServiceType
जो Application, User, System या _SandboxProfile
हो सकती है जो एक सैंडबॉक्स को परिभाषित कर सकती है या _AllowedClients
जो संपर्क करने के लिए आवश्यक अधिकार या ID को इंगित कर सकती है। ये और अन्य कॉन्फ़िगरेशन विकल्प सेवा को लॉन्च करते समय कॉन्फ़िगर करने के लिए उपयोगी होंगे।
ऐप xpc_connection_create_mach_service
का उपयोग करके XPC सेवा से जोड़ने का प्रयास करता है, फिर launchd डेमन को ढूंढता है और xpcproxy
शुरू करता है। xpcproxy
कॉन्फ़िगर की गई प्रतिबंधों को लागू करता है और प्रदान किए गए FDs और Mach पोर्ट के साथ सेवा को उत्पन्न करता है।
XPC सेवा की खोज की गति में सुधार करने के लिए, एक कैश का उपयोग किया जाता है।
xpcproxy
की क्रियाओं को ट्रेस करना संभव है:
The XPC लाइब्रेरी kdebug
का उपयोग करती है ताकि क्रियाओं को लॉग किया जा सके जो xpc_ktrace_pid0
और xpc_ktrace_pid1
को कॉल करती हैं। जो कोड इसका उपयोग करते हैं वे प्रलेखित नहीं हैं इसलिए इन्हें /usr/share/misc/trace.codes
में जोड़ना आवश्यक है। इनके पास 0x29
उपसर्ग है और उदाहरण के लिए एक है 0x29000004
: XPC_serializer_pack
।
उपकरण xpcproxy
उपसर्ग 0x22
का उपयोग करता है, उदाहरण के लिए: 0x2200001c: xpcproxy:will_do_preexec
।
ऐप्लिकेशन विभिन्न इवेंट संदेशों के लिए सदस्यता ले सकते हैं, जिससे उन्हें ऐसे इवेंट होने पर डिमांड पर शुरू किया जा सके। इन सेवाओं के लिए सेटअप launchd plist फाइलों
में किया जाता है, जो पिछले वाले निर्देशिकाओं में स्थित होती हैं और एक अतिरिक्त LaunchEvent
कुंजी होती है।
जब एक प्रक्रिया XPC कनेक्शन के माध्यम से एक विधि को कॉल करने की कोशिश करती है, तो XPC सेवा को यह जांचना चाहिए कि क्या उस प्रक्रिया को कनेक्ट करने की अनुमति है। यहाँ इसे जांचने के सामान्य तरीके और सामान्य pitfalls हैं:
Apple ऐप्स को कुछ अधिकारों को कॉन्फ़िगर करने और उन्हें प्राप्त करने का तरीका निर्धारित करने की अनुमति भी देता है, इसलिए यदि कॉल करने वाली प्रक्रिया के पास ये हैं तो इसे XPC सेवा से एक विधि को कॉल करने की अनुमति होगी:
XPC संदेशों को स्निफ़ करने के लिए आप xpcspy का उपयोग कर सकते हैं जो Frida का उपयोग करता है।
एक और संभावित उपकरण जिसका उपयोग किया जा सकता है वह है XPoCe2.
यह कार्यक्षमता RemoteXPC.framework
(जो libxpc
से है) विभिन्न होस्टों के माध्यम से XPC के माध्यम से संवाद करने की अनुमति देती है।
जो सेवाएँ दूरस्थ XPC का समर्थन करती हैं, उनके plist में UsesRemoteXPC कुंजी होगी जैसे कि /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist
के मामले में है। हालाँकि, सेवा launchd
के साथ पंजीकृत होगी, यह UserEventAgent
है जिसमें प्लगइन्स com.apple.remoted.plugin
और com.apple.remoteservicediscovery.events.plugin
कार्यक्षमता प्रदान करते हैं।
इसके अलावा, RemoteServiceDiscovery.framework
com.apple.remoted.plugin
से जानकारी प्राप्त करने की अनुमति देता है जो get_device
, get_unique_device
, connect
जैसी कार्यक्षमताएँ उजागर करता है...
एक बार जब कनेक्ट का उपयोग किया जाता है और सेवा का सॉकेट fd
एकत्र किया जाता है, तो remote_xpc_connection_*
वर्ग का उपयोग करना संभव है।
यह संभव है कि CLI टूल /usr/libexec/remotectl
का उपयोग करके दूरस्थ सेवाओं के बारे में जानकारी प्राप्त की जाए, जैसे कि:
BridgeOS और होस्ट के बीच संचार एक समर्पित IPv6 इंटरफेस के माध्यम से होता है। MultiverseSupport.framework
सॉकेट स्थापित करने की अनुमति देता है जिनका fd
संचार के लिए उपयोग किया जाएगा।
इन संचारों को netstat
, nettop
या ओपन-सोर्स विकल्प netbottom
का उपयोग करके पाया जा सकता है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)