- क्या आप **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी कंपनी को **HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आप **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड** करना चाहते हैं? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFT संग्रह**](https://opensea.io/collection/the-peass-family)
- **शामिल हों** [**💬**](https://emojipedia.org/speech-balloon/) [**डिस्कॉर्ड समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में या मुझे **ट्विटर** पर **फ़ॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **अपने हैकिंग ट्रिक्स को [hacktricks रेपो](https://github.com/carlospolop/hacktricks) और [hacktricks-cloud रेपो](https://github.com/carlospolop/hacktricks-cloud) में पीआर जमा करके साझा करें।**
उदाहरण के लिए, यदि दो प्रक्रियाएं एक ही उपयोगकर्ता (मोबाइल) के रूप में चलती हैं, तो उन्हें **एक दूसरे के डेटा तक पहुंच या उसे संशोधित करने की अनुमति नहीं होती**।
प्रत्येक एप्लिकेशन को **`private/var/mobile/Applications/{random ID}`** के तहत स्थापित किया जाता है।\
स्थापित होने के बाद, एप्लिकेशनों को कुछ सिस्टम क्षेत्रों और कार्यों (SMS, फोन कॉल...) के लिए सीमित पठन उपयोग्यता होती है। यदि कोई एप्लिकेशन **संरक्षित क्षेत्र** तक पहुंचना चाहता है, तो **अनुमति का अनुरोध करने वाला पॉप-अप** प्रदर्शित होता है।
ऐप डेवलपर iOS _डेटा संरक्षण_ API का उपयोग करके फ्लैश मेमोरी में संग्रहीत उपयोगकर्ता डेटा के लिए **फाइन-ग्रेन्ड एक्सेस नियंत्रण** को लागू कर सकते हैं। ये API **सुरक्षित एन्क्लेव प्रोसेसर** (SEP) पर आधारित हैं। SEP एक कोप्रोसेसर है जो **डेटा संरक्षण और कुंजी प्रबंधन** के लिए **क्रिप्टोग्राफिक संचालन** प्रदान करता है। एक डिवाइस-विशिष्ट हार्डवेयर कुंजी-**डिवाइस UID** (यूनिक आईडी) **सुरक्षित एन्क्लेव** में **एम्बेड की जाती है**, जिससे डेटा संरक्षण की अखंडता सुनिश्चित होती है, यहां तक कि ऑपरेटिंग सिस्टम कर्नल को क्षति पहुंचाई जाती है।
जब एक **फ़ाइल डिस्क पर बनाई जाती है**, तो एक नया **256-बिट AES कुंजी उत्पन्न** की जाती है सुरक्षित एन्क्लेव के हार्डवेयर आधारित यादृच्छ
* **`kSecAttrAccessibleAlways`**: Keychain आइटम में डेटा हमेशा एक्सेस किया जा सकता है, चाहे डिवाइस लॉक हो या न हो।
* **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Keychain आइटम में डेटा हमेशा एक्सेस किया जा सकता है, चाहे डिवाइस लॉक हो या न हो। इस डेटा को iCloud या स्थानीय बैकअप में शामिल नहीं किया जाएगा।
* **`kSecAttrAccessibleAfterFirstUnlock`**: डिवाइस को एक बार उनलॉक करने के बाद ही डेटा को Keychain आइटम में एक्सेस नहीं किया जा सकता है।
* **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: डिवाइस को एक बार उनलॉक करने के बाद ही डेटा को Keychain आइटम में एक्सेस नहीं किया जा सकता है। इस एट्रिब्यूट वाले आइटम नए डिवाइस में माइग्रेट नहीं होते हैं। इसलिए, एक अलग डिवाइस के बैकअप से बहाल करने के बाद, ये आइटम मौजूद नहीं होंगे।
* **`kSecAttrAccessibleWhenUnlocked`**: डेटा को Keychain आइटम में उनलॉक किए जाने के दौरान ही एक्सेस किया जा सकता है।
* **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: डेटा को Keychain आइटम में उनलॉक किए जाने के दौरान ही एक्सेस किया जा सकता है। इस डेटा को iCloud या स्थानीय बैकअप में शामिल नहीं किया जाएगा।
* **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: डेटा को Keychain में उनलॉक किए जाने पर ही एक्सेस किया जा सकता है। यह सुरक्षा वर्ग केवल तभी उपलब्ध होता है जब डिवाइस पर पासकोड सेट होता है। इस डेटा को iCloud या स्थानीय बैकअप में शामिल नहीं किया जाएगा।
**`AccessControlFlags`** कुंजी को प्रमाणित करने के लिए उपयोगकर्ताओं के द्वारा प्रमाणित करने के तरीके को परिभाषित करते हैं (`SecAccessControlCreateFlags`):
* **`kSecAccessControlDevicePasscode`**: पासकोड के माध्यम से आइटम तक पहुंचें।
* **`kSecAccessControlBiometryAny`**: Touch ID में पंजीकृत उंगलियों में से किसी एक के माध्यम से आइटम तक पहुंचें। उंगली जोड़ने या हटाने से आइटम अमान्य नहीं होगा।
* **`kSecAccessControlBiometryCurrentSet`**: Touch ID में पंजीकृत उंगलियों में से किसी एक के माध्यम से आइटम तक पहुंचें। उंगली जोड़ने या हटाने से आइटम अमान्य होगा।
* **`kSecAccessControlUserPresence`**: पंजीकृत उंगलियों में से किसी एक (Touch ID का उपयोग करके) या पासकोड का उपयोग करके आइटम तक पहुंचें।
कृपया ध्यान दें कि Touch ID द्वारा सुरक्षित की गई कुंजी (के माध्यम से `kSecAccessControlBiometryAny` या `kSecAccessControlBiometryCurrentSet`) सुरक्षित एन्क्लेव में स्थित होती है: Keychain में केवल एक टोकन होता है, वास्तविक कुंजी नहीं। कुंजी सुरक्षित एन्क्लेव में स्थित होती है।
iOS आईडेंटिफायर प्रिफिक्स (टीम आईडी) और बंडल आईडेंटिफायर (डेवलपर द्वारा प्रदान किया गया) का उपयोग करके Keychain आइटम्स पर पहुंच नियंत्रण लागू करता है। इसके बाद, एक ही टीम **2 ऐप्स को कॉन्फ़िगर कर सकती हैं ताकि वे Keychain आइटम्स को साझा कर सकें**।
iOS पर, जब एक एप्लिकेशन को अनइंस्टॉल किया जाता है, एप्लिकेशन द्वारा उपयोग किए जाने वाले Keychain डेटा को डिवाइस द्वारा रखा जाता है, जबकि एप्लिकेशन सैंडबॉक्स द्वारा संग्रहित डेटा हटा दिया जाता है। यदि एक उपयोगकर्ता बिना फैक्टरी रीसेट किए अपनी डिवाइस को बेचता है, तो पिछले उपयोगकर्ता द्वारा उपयोग किए जाने वाले एप्लिकेशन खातों और डेटा तक पहुंच प्राप्त करने के लिए खरीदार उपयोगकर्ता को उसी एप्लिकेशन को पुनः स्थापित करने की संभावना हो सकती है। इसके लिए कोई तकनीकी क्षमता की आवश्यकता नहीं होती है।
एक एप्लिकेशन को अनइंस्टॉल करते समय डेटा को वाइप करने के लिए डेवलपर्स द्वारा उपयोग किए जाने वाले कोई iOS API नहीं है। इसके बजाय, डेवलपर्स को निम्नलिखित कदम उठाने चाहिए ताकि Keychain डेटा एप्लिकेशन स्थापना के बीच स्थायित्व बनाए रखने से रोका जा सके:
* एक iOS एप्लिकेशन के लिए लॉगआउट कार्यक्षमता विकसित करते समय, सुनिश्चित करें कि खाता लॉगआउट का हिस्सा के रूप में Keychain डेटा साफ हो जाता है। इससे उपयोगकर्ताओं को एप्लिकेशन को अनइंस्टॉल करने से पहले अपने खातों को साफ करने की अनुमति मिलेगी।
**प्रत्येक ऐप का एक अद्वितीय होम निर्देशिका होता है और यह सैंडबॉक्स होता है**, ताकि वे सुरक्षित सिस्टम संसाधनों या सिस्टम द्वारा संचित फ़ाइलों या अन्य ऐप्स द्वारा संचित फ़ाइलों तक पहुंच नहीं पा सकें। ये प्रतिबंध सैंडबॉक्स नीतियों (जिन्हें _प्रोफ़ाइल_ भी कहा जाता है) के माध्यम से लागू किए जाते हैं, जिन्हें [विश्वसनीय बीएसडी (MAC) अनिवार्य पहुंच नियंत्रण फ्रेमवर्क](http://www.trustedbsd.org/mac.html) द्वारा एक कर्नल एक्सटेंशन के माध्यम से प्रवर्तित किया जाता है।
कुछ [**क्षमताएं/अनुमतियाँ**](https://help.apple.com/developer-account/#/dev21218dfd6) ऐप के डेवलपर्स द्वारा कॉन्फ़िगर की जा सकती हैं (जैसे डेटा संरक्षण या Keychain साझा करना) और इंस्टॉलेशन के बाद सीधे प्रभावित होंगी। हालांकि, दूसरों के लिए, **उपयोगकर्ता से सीधे पूछा जाएगा जब ऐप पहली बार संरक्षित संसाधन तक पहुंच करने का प्रयास करेगा**।
[_उद्देश्य स्ट्रिंग_](https://developer.apple.com/documentation/uikit/core\_app/protecting\_the\_user\_s\_privacy/accessing\_protected\_resources?language=objc#3037322) या _उपयोग विवरण स्ट्रिंग_ वे अनुकूलित पाठ हैं जो उपयोगकर्ताओं को प्रोटेक्टेड डेटा या संसाधन तक पहुंच की अनुमति के लिए सिस्टम की अनुमति अनुरोध अलर्ट में प्रदान किए जाते हैं।
आप दायां क्लिक करके रॉ वैल्यूज दिखाने के लिए दृश्य को स्विच कर सकते हैं (इस तरह, उदाहरण के लिए `"Privacy - Location When In Use Usage Description"` को `NSLocationWhenInUseUsageDescription` में बदल देगा)।
*`Info.plist``Payload/<appname>.app/Info.plist` में स्थित होता है।
* यदि आवश्यक हो तो इसे कनवर्ट करें (उदाहरण के लिए `plutil -convert xml1 Info.plist`) जैसा कि "iOS Basic Security Testing" अध्याय, अनुभाग "The Info.plist File" में समझाया गया है।
* सभी _उद्देश्य स्ट्रिंग Info.plist कुंजीयों_ की जांच करें, जो आमतौर पर `UsageDescription` से समाप्त होती हैं:
उपकरण क्षमताएं ऐप स्टोर द्वारा यह सुनिश्चित करने के लिए उपयोग की जाती हैं कि केवल संगत उपकरणों को सूचीबद्ध किया जाए और इसलिए ऐप को डाउनलोड करने की अनुमति हो। वे ऐप की `Info.plist` फ़ाइल में [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/plist/info/UIRequiredDeviceCapabilities) कुंजी के तहत निर्दिष्ट की जाती हैं।
> आमतौर पर आपको `armv7` क्षमता मिलेगी, जिसका अर्थ है कि ऐप केवल armv7 इंस्ट्रक्शन सेट के लिए कंपाइल किया गया है, या यदि यह 32/64-बिट यूनिवर्सल ऐप है तो।
उदाहरण के लिए, एक ऐप NFC पर पूरी तरह से निर्भर हो सकता है (जैसे कि एक ["NFC टैग रीडर"](https://itunes.apple.com/us/app/nfc-taginfo-by-nxp/id1246143596) ऐप)। [आर्काइव आईओएस डिवाइस संगतता संदर्भ](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html) के अनुसार, NFC केवल iPhone 7 (और iOS 11) से उपलब्ध है। एक डेवलपर `nfc` डिवाइस क्षमता सेट करके सभी असंगत डिवाइसों को छोड़ना चाह सकता है।
> अधिकार कुंजी मान-मान पैरों को हैं जो ऐप में साइन किए जाते हैं और रनटाइम कारकों के पार प्रमाणीकरण की अनुमति देते हैं, जैसे कि UNIX उपयोगकर्ता आईडी। क्योंकि अधिकार डिजिटली साइन किए जाते हैं, इन्हें बदला नहीं जा सकता है। अधिकार सिस्टम ऐप्स और डेमन्स द्वारा व्यापक रूप से उपयोग किए जाते हैं ताकि **वे विशेष विशेषाधिकारित आपरेशन कर सकें जो अन्यथा प्रक्रिया को रूट के रूप में चलाने की आवश्यकता होती**। इससे संकटग्रस्त सिस्टम ऐप या डेमन द्वारा प्रिविलेज उन्नयन की संभावना काफी कम हो जाती है।
उदाहरण के लिए, यदि आप "डिफ़ॉल्ट डेटा संरक्षण" क्षमता सेट करना चाहते हैं, तो आपको Xcode में **क्षमताएं** टैब पर जाना होगा और **डेटा संरक्षण** को सक्षम करना होगा। यह Xcode द्वारा `<appname>.entitlements` फ़ाइल में `com.apple.developer.default-data-protection` अधिकार के रूप में `NSFileProtectionComplete` डिफ़ॉल्ट मान के साथ सीधे लिखा जाता है। IPA में हम इसे `embedded.mobileprovision` में भी पाएंगे:
अन्य क्षमताओं के लिए जैसे HealthKit, उपयोगकर्ता को अनुमति के लिए पूछा जाना चाहिए, इसलिए इंटाइटलमेंट्स को जोड़ना पर्याप्त नहीं है, ऐप के `Info.plist` फ़ाइल में विशेष कुंजी और स्ट्रिंग जोड़ने की आवश्यकता होती है।
**Objective-C** में **डायनेमिक रनटाइम** होता है, इसलिए जब एक Objective-C प्रोग्राम iOS में निष्पादित होता है, तो यह उन पुस्तकालयों को कॉल करता है जिनका **पता समय के साथ निर्धारित होता है**, संदेश में भेजे गए फ़ंक्शन के नाम को सभी उपलब्ध फ़ंक्शनों की सूची के साथ तुलना करके।
शुरुआत में, केवल Apple द्वारा बनाए गए ऐप्स iPhones पर चलते थे, इसलिए उन्हें विश्वास के रूप में सब कुछ का उपयोग करने की अनुमति थी। हालांकि, जब Apple ने **तीसरे पक्ष के ऐप्लिकेशनों की अनुमति दी**, Apple ने शक्तिशाली फ़ंक्शनों के हैडर फ़ाइलों को निकाल दिया था ताकि उन्हें डेवलपर्स से "छिपा" सकें। हालांकि, डेवलपर्स ने देखा कि "सुरक्षित" फ़ंक्शनों को कुछ इन अनदस्तावेजित फ़ंक्शनों की आवश्यकता थी और इन गुप्त शक्तिशाली फ़ंक्शनों को बुलाने के लिए एक **कस्टम हैडर फ़ाइल बनाने के साथ, यह संभव था।** वास्तव में, Apple, एक ऐप को प्रकाशित होने की अनुमति देने से पहले, यह जांचता है कि क्या ऐप किसी भी ऐसे प्रतिबंधित फ़ंक्शन को कॉल करता है।
फिर, Swift आया। क्योंकि **Swift स्थिर बाउंड** है (यह Objective-C की तरह रनटाइम में फ़ंक्शनों के पते को निर्धारित नहीं करता), इसलिए स्थिर कोड विश्लेषण के माध्यम से आसानी से जांचा जा सकता है कि एक Swift प्रोग्राम द्वारा किए जाने वाले कॉल क्या होंगे।
iOS संस्करण 6 से, उपकरण प्रबंधन क्षमता के लिए **अंतर्निहित समर्थन** है जिसमें एक संगठन को कॉर्पोरेट Apple उपकरणों को नियंत्रित करने की अनुमति होती है।\
पंजीकरण को उपयोगकर्ता द्वारा **एजेंट स्थापित करके** आरंभ किया जा सकता है ताकि कॉर्पोरेट ऐप्स तक पहुँच हो सके। इस मामले में उपकरण आमतौर पर उपयोगकर्ता के पास होता है।\
या कंपनी **खरीदे गए उपकरणों के सीरियल नंबर** या खरीद आदेश आईडी दर्ज कर सकती है और उन उपकरणों पर स्थापित करने के लिए MDM प्रोफ़ाइल निर्दिष्ट कर सकती है। ध्यान दें कि Apple **एक विशेष उपकरण को इस तरीके से दोहराने की अनुमति नहीं देता** है। पहली प्रोफ़ाइल हटाने के बाद उपयोगकर्ता को एक और स्थापित करने के लिए सहमति देनी होगी।
ये MDM नीतियाँ अन्य ऐप्लिकेशनों की जांच और सीमित करने के लिए हैं, इसलिए वे **अधिक विशेषाधिकारों के साथ चल रही हैं**।\
एक MDM नीति उपयोगकर्ताओं को एक **पासकोड** सेट करने के लिए **न्यूनतम** पासवर्ड **कठिनाई** के साथ **मजबूर** कर सकती है।\
प्रोफ़ाइल उपकरणID से बंधे होते हैं, MDM सर्वर द्वारा **साइन** और **एन्क्रिप्ट** किए जाते हैं और **तख्तबंद** होते हैं। इन्हें **हटाया नहीं जा सकता** है बिना सभी कॉर्पोरेट डेटा को **खोने** के।\
MDM प्रोफ़ाइल अगर X **विफल** पासवर्ड **प्रयास** हों तो सभी **डेटा** को **मिटा** सकते हैं। इसके अलावा, **व्यवस्थापक** MDM इंटरफ़ेस के माध्यम से कभी भी iPhone को **दूरस्थ****मिटा** सकता है।