macOS - AMFI - AppleMobileFileIntegrity
Reading time: 8 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
AppleMobileFileIntegrity.kext और amfid
यह सिस्टम पर चल रहे कोड की अखंडता को लागू करने पर केंद्रित है, जो XNU के कोड सिग्नेचर सत्यापन के पीछे की तर्क प्रदान करता है। यह अधिकारों की जांच करने और अन्य संवेदनशील कार्यों को संभालने में भी सक्षम है, जैसे कि डिबगिंग की अनुमति देना या कार्य पोर्ट प्राप्त करना।
इसके अलावा, कुछ संचालन के लिए, kext उपयोगकर्ता स्थान पर चल रहे डेमन /usr/libexec/amfid
से संपर्क करना पसंद करता है। इस विश्वास संबंध का कई जेलब्रेक में दुरुपयोग किया गया है।
AMFI MACF नीतियों का उपयोग करता है और यह शुरू होते ही अपने हुक पंजीकृत करता है। इसके लोडिंग या अनलोडिंग को रोकने से कर्नेल पैनिक हो सकता है। हालाँकि, कुछ बूट तर्क हैं जो AMFI को कमजोर करने की अनुमति देते हैं:
amfi_unrestricted_task_for_pid
: आवश्यक अधिकारों के बिना task_for_pid की अनुमति देंamfi_allow_any_signature
: किसी भी कोड सिग्नेचर की अनुमति देंcs_enforcement_disable
: कोड साइनिंग प्रवर्तन को निष्क्रिय करने के लिए सिस्टम-व्यापी तर्कamfi_prevent_old_entitled_platform_binaries
: अधिकारों के साथ प्लेटफ़ॉर्म बाइनरी को अमान्य करेंamfi_get_out_of_my_way
: amfi को पूरी तरह से निष्क्रिय करता है
यहाँ कुछ MACF नीतियाँ हैं जो यह पंजीकृत करता है:
cred_check_label_update_execve:
लेबल अपडेट किया जाएगा और 1 लौटाएगाcred_label_associate
: AMFI के मैक लेबल स्लॉट को लेबल के साथ अपडेट करेंcred_label_destroy
: AMFI का मैक लेबल स्लॉट हटा देंcred_label_init
: AMFI के मैक लेबल स्लॉट में 0 डालेंcred_label_update_execve
: यह प्रक्रिया के अधिकारों की जांच करता है कि क्या इसे लेबल को संशोधित करने की अनुमति दी जानी चाहिए।file_check_mmap
: यह जांचता है कि क्या mmap मेमोरी प्राप्त कर रहा है और इसे निष्पादन योग्य के रूप में सेट कर रहा है। इस मामले में यह जांचता है कि क्या पुस्तकालय सत्यापन की आवश्यकता है और यदि हाँ, तो यह पुस्तकालय सत्यापन फ़ंक्शन को कॉल करता है।file_check_library_validation
: पुस्तकालय सत्यापन फ़ंक्शन को कॉल करता है जो अन्य चीजों के बीच यह जांचता है कि क्या एक प्लेटफ़ॉर्म बाइनरी दूसरी प्लेटफ़ॉर्म बाइनरी को लोड कर रही है या यदि प्रक्रिया और नया लोड किया गया फ़ाइल का एक ही TeamID है। कुछ अधिकार किसी भी पुस्तकालय को लोड करने की अनुमति भी देंगे।policy_initbsd
: विश्वसनीय NVRAM कुंजी सेट करता हैpolicy_syscall
: यह DYLD नीतियों की जांच करता है जैसे कि क्या बाइनरी के पास अनियंत्रित खंड हैं, क्या इसे env vars की अनुमति देनी चाहिए... यह तब भी कॉल किया जाता है जब एक प्रक्रियाamfi_check_dyld_policy_self()
के माध्यम से शुरू होती है।proc_check_inherit_ipc_ports
: यह जांचता है कि जब एक प्रक्रिया एक नया बाइनरी निष्पादित करती है तो क्या अन्य प्रक्रियाएँ प्रक्रिया के कार्य पोर्ट पर SEND अधिकारों के साथ उन्हें बनाए रखनी चाहिए या नहीं। प्लेटफ़ॉर्म बाइनरी की अनुमति है,get-task-allow
अधिकार इसे अनुमति देता है,task_for_pid-allow
अधिकार की अनुमति है और एक ही TeamID के साथ बाइनरी।proc_check_expose_task
: अधिकारों को लागू करेंamfi_exc_action_check_exception_send
: डिबगर को एक अपवाद संदेश भेजा जाता हैamfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update
: अपवाद हैंडलिंग (डिबगिंग) के दौरान लेबल जीवनचक्रproc_check_get_task
: अधिकारों की जांच करता है जैसेget-task-allow
जो अन्य प्रक्रियाओं को कार्य पोर्ट प्राप्त करने की अनुमति देता है औरtask_for_pid-allow
, जो प्रक्रिया को अन्य प्रक्रियाओं के कार्य पोर्ट प्राप्त करने की अनुमति देता है। यदि इनमें से कोई भी नहीं है, तो यहamfid permitunrestricteddebugging
को कॉल करता है यह जांचने के लिए कि क्या इसकी अनुमति है।proc_check_mprotect
: यदिmprotect
कोVM_PROT_TRUSTED
ध्वज के साथ कॉल किया जाता है तो अस्वीकार करें, जो इंगित करता है कि क्षेत्र को इस तरह से माना जाना चाहिए जैसे कि इसका एक मान्य कोड सिग्नेचर है।vnode_check_exec
: जब निष्पादन योग्य फ़ाइलें मेमोरी में लोड होती हैं तो इसे कॉल किया जाता है औरcs_hard | cs_kill
सेट करता है जो प्रक्रिया को मार देगा यदि कोई भी पृष्ठ अमान्य हो जाता हैvnode_check_getextattr
: MacOS:com.apple.root.installed
औरisVnodeQuarantined()
की जांच करेंvnode_check_setextattr
: जैसे प्राप्त + com.apple.private.allow-bless और आंतरिक-इंस्टॉलर-समान अधिकारvnode_check_signature
: कोड जो XNU को अधिकारों, ट्रस्ट कैश औरamfid
का उपयोग करके कोड सिग्नेचर की जांच करने के लिए कॉल करता हैproc_check_run_cs_invalid
: यहptrace()
कॉल्स (PT_ATTACH
औरPT_TRACE_ME
) को इंटरसेप्ट करता है। यह किसी भी अधिकारों की जांच करता हैget-task-allow
,run-invalid-allow
औरrun-unsigned-code
और यदि कोई नहीं है, तो यह जांचता है कि क्या डिबगिंग की अनुमति है।proc_check_map_anon
: यदि mmap कोMAP_JIT
ध्वज के साथ कॉल किया जाता है, तो AMFIdynamic-codesigning
अधिकार की जांच करेगा।
AMFI.kext
अन्य कर्नेल एक्सटेंशन के लिए एक API भी उजागर करता है, और इसके निर्भरताओं को खोजने के लिए यह संभव है:
kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
8 com.apple.kec.corecrypto
19 com.apple.driver.AppleMobileFileIntegrity
22 com.apple.security.sandbox
24 com.apple.AppleSystemPolicy
67 com.apple.iokit.IOUSBHostFamily
70 com.apple.driver.AppleUSBTDM
71 com.apple.driver.AppleSEPKeyStore
74 com.apple.iokit.EndpointSecurity
81 com.apple.iokit.IOUserEthernet
101 com.apple.iokit.IO80211Family
102 com.apple.driver.AppleBCMWLANCore
118 com.apple.driver.AppleEmbeddedUSBHost
134 com.apple.iokit.IOGPUFamily
135 com.apple.AGXG13X
137 com.apple.iokit.IOMobileGraphicsFamily
138 com.apple.iokit.IOMobileGraphicsFamily-DCP
162 com.apple.iokit.IONVMeFamily
amfid
यह उपयोगकर्ता मोड चलाने वाला डेमन है जो AMFI.kext
को उपयोगकर्ता मोड में कोड हस्ताक्षरों की जांच करने के लिए उपयोग करेगा।
AMFI.kext
डेमन के साथ संवाद करने के लिए HOST_AMFID_PORT
पोर्ट पर मच संदेशों का उपयोग करता है, जो विशेष पोर्ट 18
है।
ध्यान दें कि macOS में अब रूट प्रक्रियाओं के लिए विशेष पोर्ट को हाईजैक करना संभव नहीं है क्योंकि उन्हें SIP
द्वारा सुरक्षित किया गया है और केवल launchd उन्हें प्राप्त कर सकता है। iOS में यह जांचा जाता है कि प्रतिक्रिया वापस भेजने वाली प्रक्रिया में amfid
का CDHash हार्डकोडेड है।
जब amfid
को एक बाइनरी की जांच करने के लिए अनुरोध किया जाता है और इसका उत्तर प्राप्त होता है, तो इसे डिबग करके और mach_msg
में एक ब्रेकपॉइंट सेट करके देखा जा सकता है।
एक बार जब विशेष पोर्ट के माध्यम से एक संदेश प्राप्त होता है, तो MIG का उपयोग प्रत्येक फ़ंक्शन को उस फ़ंक्शन को भेजने के लिए किया जाता है जिसे यह कॉल कर रहा है। मुख्य फ़ंक्शंस को उलटकर और पुस्तक के अंदर समझाया गया है।
Provisioning Profiles
एक प्रोविजनिंग प्रोफ़ाइल कोड पर हस्ताक्षर करने के लिए उपयोग की जा सकती है। Developer प्रोफाइल हैं जो कोड पर हस्ताक्षर करने और इसे परीक्षण करने के लिए उपयोग की जा सकती हैं, और Enterprise प्रोफाइल हैं जो सभी उपकरणों में उपयोग की जा सकती हैं।
एक ऐप को Apple Store में सबमिट करने के बाद, यदि स्वीकृत हो जाता है, तो इसे Apple द्वारा हस्ताक्षरित किया जाता है और प्रोविजनिंग प्रोफ़ाइल की अब आवश्यकता नहीं होती है।
एक प्रोफ़ाइल आमतौर पर .mobileprovision
या .provisionprofile
एक्सटेंशन का उपयोग करती है और इसे डंप किया जा सकता है:
openssl asn1parse -inform der -in /path/to/profile
# Or
security cms -D -i /path/to/profile
हालाँकि कभी-कभी इन्हें प्रमाणित कहा जाता है, ये प्रोविजनिंग प्रोफाइल एक प्रमाणपत्र से अधिक होते हैं:
- AppIDName: एप्लिकेशन पहचानकर्ता
- AppleInternalProfile: इसे एक Apple आंतरिक प्रोफाइल के रूप में निर्दिष्ट करता है
- ApplicationIdentifierPrefix: AppIDName के आगे जोड़ा गया (TeamIdentifier के समान)
- CreationDate:
YYYY-MM-DDTHH:mm:ssZ
प्रारूप में तिथि - DeveloperCertificates: (आमतौर पर एक) प्रमाणपत्रों का एक ऐरे, जो Base64 डेटा के रूप में एन्कोडेड होता है
- Entitlements: इस प्रोफाइल के लिए अनुमत अधिकार
- ExpirationDate:
YYYY-MM-DDTHH:mm:ssZ
प्रारूप में समाप्ति तिथि - Name: एप्लिकेशन का नाम, जो AppIDName के समान है
- ProvisionedDevices: UDIDs का एक ऐरे (डेवलपर प्रमाणपत्रों के लिए) जिसके लिए यह प्रोफाइल मान्य है
- ProvisionsAllDevices: एक बूलियन (एंटरप्राइज प्रमाणपत्रों के लिए सत्य)
- TeamIdentifier: (आमतौर पर एक) अल्फ़ान्यूमेरिक स्ट्रिंग(s) का एक ऐरे जिसका उपयोग डेवलपर की पहचान के लिए किया जाता है
- TeamName: डेवलपर की पहचान के लिए उपयोग किया जाने वाला मानव-पठनीय नाम
- TimeToLive: प्रमाणपत्र की वैधता (दिनों में)
- UUID: इस प्रोफाइल के लिए एक यूनिवर्सली यूनिक आइडेंटिफायर
- Version: वर्तमान में 1 पर सेट
ध्यान दें कि अधिकार प्रविष्टि में अधिकारों का एक सीमित सेट होगा और प्रोविजनिंग प्रोफाइल केवल उन विशिष्ट अधिकारों को देने में सक्षम होगा ताकि Apple के निजी अधिकार न दिए जा सकें।
ध्यान दें कि प्रोफाइल आमतौर पर /var/MobileDeviceProvisioningProfiles
में स्थित होते हैं और इन्हें security cms -D -i /path/to/profile
के साथ चेक करना संभव है।
libmis.dyld
यह बाहरी पुस्तकालय है जिसे amfid
यह पूछने के लिए कॉल करता है कि क्या इसे कुछ अनुमति देनी चाहिए या नहीं। इसका ऐतिहासिक रूप से जेलब्रेकिंग में दुरुपयोग किया गया है, जिसमें इसका एक बैकडोर संस्करण चलाया गया था जो सब कुछ अनुमति देता था।
macOS में यह MobileDevice.framework
के अंदर है।
AMFI Trust Caches
iOS AMFI ज्ञात हैश का एक सूची बनाए रखता है जो कि ऐड-हॉक पर हस्ताक्षरित होते हैं, जिसे Trust Cache कहा जाता है और kext के __TEXT.__const
अनुभाग में पाया जाता है। ध्यान दें कि बहुत विशिष्ट और संवेदनशील संचालन में, इस Trust Cache को एक बाहरी फ़ाइल के साथ बढ़ाना संभव है।
References
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।