iOS Basics

Support HackTricks

विशेषाधिकार विभाजन और सैंडबॉक्स

iOS में, उपयोगकर्ता-सुलभ अनुप्रयोगों और प्रणाली के मुख्य प्रक्रियाओं के बीच विशेषाधिकार में एक भेद है। अनुप्रयोग mobile उपयोगकर्ता पहचान के तहत चलते हैं, जबकि महत्वपूर्ण प्रणाली प्रक्रियाएँ root के रूप में कार्य करती हैं। यह विभाजन एक सैंडबॉक्स तंत्र द्वारा बढ़ाया गया है, जो अनुप्रयोगों द्वारा किए जा सकने वाले कार्यों पर कड़े प्रतिबंध लगाता है। उदाहरण के लिए, भले ही अनुप्रयोग एक ही उपयोगकर्ता पहचान साझा करते हों, उन्हें एक-दूसरे के डेटा तक पहुँचने या उसे संशोधित करने की अनुमति नहीं है।

अनुप्रयोग एक विशिष्ट निर्देशिका (private/var/mobile/Applications/{random ID}) में स्थापित होते हैं और कुछ प्रणाली क्षेत्रों और कार्यक्षमताओं, जैसे SMS और फोन कॉल, तक सीमित पढ़ने की पहुँच होती है। संरक्षित क्षेत्रों तक पहुँचने पर उपयोगकर्ता अनुमति के लिए एक पॉप-अप अनुरोध उत्पन्न होता है।

डेटा सुरक्षा

iOS डेवलपर्स को डेटा सुरक्षा एपीआई प्रदान करता है, जो सुरक्षित एन्क्लेव प्रोसेसर (SEP) के ऊपर निर्मित हैं — क्रिप्टोग्राफिक संचालन और कुंजी प्रबंधन के लिए एक समर्पित सह-प्रोसेसर। SEP डेटा सुरक्षा अखंडता को एक अद्वितीय उपकरण-विशिष्ट कुंजी, उपकरण UID, के माध्यम से सुनिश्चित करता है, जो इसके भीतर एम्बेडेड होता है।

फाइल निर्माण के समय, एक अद्वितीय 256-बिट AES एन्क्रिप्शन कुंजी उत्पन्न होती है, जो फाइल की सामग्री को एन्क्रिप्ट करती है। यह एन्क्रिप्शन कुंजी, एक वर्ग ID के साथ, फिर एक वर्ग कुंजी का उपयोग करके एन्क्रिप्ट की जाती है और फाइल के मेटाडेटा में संग्रहीत की जाती है। एक फाइल को डिक्रिप्ट करने में प्रणाली की कुंजी का उपयोग करके मेटाडेटा तक पहुँच प्राप्त करना, वर्ग ID के साथ वर्ग कुंजी को पुनः प्राप्त करना, और फिर फाइल की अद्वितीय एन्क्रिप्शन कुंजी को डिक्रिप्ट करना शामिल है।

iOS डेटा सुरक्षा के लिए चार सुरक्षा वर्ग परिभाषित करता है, जो यह निर्धारित करते हैं कि डेटा कब और कैसे पहुँचा जा सकता है:

  • पूर्ण सुरक्षा (NSFileProtectionComplete): डेटा तब तक अनुपलब्ध है जब तक उपकरण को उपयोगकर्ता के पासकोड का उपयोग करके अनलॉक नहीं किया जाता।

  • खुला होने पर सुरक्षित (NSFileProtectionCompleteUnlessOpen): उपकरण बंद होने के बाद भी फाइल तक पहुँच की अनुमति देता है, बशर्ते फाइल को उपकरण के अनलॉक होने पर खोला गया हो।

  • पहली उपयोगकर्ता प्रमाणीकरण तक सुरक्षित (NSFileProtectionCompleteUntilFirstUserAuthentication): डेटा पहले उपयोगकर्ता के बूट के बाद अनलॉक होने के बाद सुलभ है, भले ही उपकरण फिर से बंद हो जाए।

  • कोई सुरक्षा नहीं (NSFileProtectionNone): डेटा केवल उपकरण UID द्वारा सुरक्षित है, जिससे त्वरित दूरस्थ डेटा मिटाने की सुविधा मिलती है।

सभी वर्गों का एन्क्रिप्शन, NSFileProtectionNone को छोड़कर, एक कुंजी से किया जाता है जो उपकरण UID और उपयोगकर्ता के पासकोड दोनों से प्राप्त होती है, यह सुनिश्चित करते हुए कि डिक्रिप्शन केवल सही पासकोड वाले उपकरण पर संभव है। iOS 7 से, डिफ़ॉल्ट सुरक्षा वर्ग "पहली उपयोगकर्ता प्रमाणीकरण तक सुरक्षित" है।

डेवलपर्स FileDP का उपयोग कर सकते हैं, जो iPhone पर फाइलों के डेटा सुरक्षा वर्ग का निरीक्षण करने के लिए एक उपकरण है।

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

The Keychain

iOS में, एक Keychain एक सुरक्षित एन्क्रिप्टेड कंटेनर के रूप में कार्य करता है जो संवेदनशील जानकारी को संग्रहीत करने के लिए है, जिसे केवल वही एप्लिकेशन एक्सेस कर सकता है जिसने इसे संग्रहीत किया या जिन्हें स्पष्ट रूप से अधिकृत किया गया है। यह एन्क्रिप्शन एक अद्वितीय पासवर्ड द्वारा मजबूत किया गया है जो iOS द्वारा उत्पन्न होता है, जो स्वयं AES के साथ एन्क्रिप्टेड है। यह एन्क्रिप्शन प्रक्रिया एक PBKDF2 फ़ंक्शन का उपयोग करती है, जो उपयोगकर्ता के पासकोड को एक नमक के साथ जोड़ती है जो डिवाइस के UID से प्राप्त होता है, एक घटक जिसे केवल सुरक्षित एन्क्लेव चिपसेट एक्सेस कर सकता है। परिणामस्वरूप, भले ही उपयोगकर्ता का पासकोड ज्ञात हो, Keychain की सामग्री किसी अन्य डिवाइस पर अनुपलब्ध रहती है सिवाय उस डिवाइस के जहां उन्हें मूल रूप से एन्क्रिप्ट किया गया था।

Keychain डेटा का प्रबंधन और एक्सेस securityd डेमन द्वारा किया जाता है, जो विशिष्ट ऐप अधिकारों जैसे Keychain-access-groups और application-identifier पर आधारित है।

Keychain API Operations

Keychain API, जिसका विवरण Apple के Keychain Services दस्तावेज़ में दिया गया है, सुरक्षित संग्रह प्रबंधन के लिए आवश्यक कार्य प्रदान करता है:

  • SecItemAdd: Keychain में एक नया आइटम जोड़ता है।

  • SecItemUpdate: Keychain में एक मौजूदा आइटम को अपडेट करता है।

  • SecItemCopyMatching: Keychain से एक आइटम प्राप्त करता है।

  • SecItemDelete: Keychain से एक आइटम हटाता है।

Keychain पासवर्ड को ब्रूट-फोर्स करना एन्क्रिप्टेड कुंजी पर सीधे हमला करने या डिवाइस पर पासकोड का अनुमान लगाने का प्रयास करने में शामिल है, जिसे असफल प्रयासों के बीच सुरक्षित एन्क्लेव द्वारा लागू की गई देरी से काफी हद तक बाधित किया जाता है।

Configuring Keychain Item Data Protection

Keychain आइटम के लिए डेटा सुरक्षा स्तरों को आइटम निर्माण या अपडेट के दौरान kSecAttrAccessible विशेषता का उपयोग करके सेट किया जाता है। ये स्तर, Apple द्वारा निर्दिष्ट, यह निर्धारित करते हैं कि Keychain आइटम कब और कैसे उपलब्ध हैं:

  • kSecAttrAccessibleAlways: किसी भी समय उपलब्ध, डिवाइस लॉक स्थिति की परवाह किए बिना।

  • kSecAttrAccessibleAlwaysThisDeviceOnly: हमेशा उपलब्ध, लेकिन बैकअप में शामिल नहीं।

  • kSecAttrAccessibleAfterFirstUnlock: पहले अनलॉक के बाद उपलब्ध।

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: ऊपर जैसा ही, लेकिन नए डिवाइस पर स्थानांतरित नहीं किया जा सकता।

  • kSecAttrAccessibleWhenUnlocked: केवल तब उपलब्ध जब डिवाइस अनलॉक हो।

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: अनलॉक होने पर उपलब्ध, बैकअप में शामिल नहीं।

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: डिवाइस पासकोड की आवश्यकता, बैकअप में शामिल नहीं।

AccessControlFlags एक्सेस विधियों को और परिष्कृत करते हैं, बायोमेट्रिक प्रमाणीकरण या पासकोड उपयोग की अनुमति देते हैं।

Jailbroken Devices Warning

जेलब्रोकन डिवाइसों पर, Keychain की सुरक्षा से समझौता किया गया है, जो एक महत्वपूर्ण सुरक्षा जोखिम प्रस्तुत करता है।

Persistence of Keychain Data

ऐप-विशिष्ट डेटा के विपरीत जो ऐप अनइंस्टॉल होने पर हटा दिया जाता है, Keychain डेटा डिवाइस पर बना रहता है। यह विशेषता एक सेकंड-हैंड डिवाइस के नए मालिकों को पिछले मालिक के एप्लिकेशन डेटा तक पहुंचने में सक्षम बना सकती है, बस ऐप्स को फिर से इंस्टॉल करके। डेवलपर्स को इस जोखिम को कम करने के लिए ऐप इंस्टॉलेशन या लॉगआउट के दौरान Keychain डेटा को सक्रिय रूप से साफ करने की सलाह दी जाती है। यहाँ एक Swift कोड उदाहरण है जो पहले ऐप लॉन्च पर Keychain डेटा को साफ करने का प्रदर्शन करता है:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

ऐप क्षमताएँ

ऐप विकास के क्षेत्र में, sandboxing सुरक्षा बढ़ाने में एक महत्वपूर्ण भूमिका निभाता है। यह प्रक्रिया सुनिश्चित करती है कि प्रत्येक ऐप अपने अद्वितीय होम डायरेक्टरी के भीतर काम करता है, इस प्रकार इसे सिस्टम फ़ाइलों या अन्य ऐप्स के डेटा तक पहुँचने से रोकता है। इन प्रतिबंधों को लागू करने का कार्य Trusted BSD (MAC) Mandatory Access Control Framework के तहत किया जाता है।

डेवलपर्स अपने ऐप्स के लिए कुछ क्षमताएँ या अनुमतियाँ कॉन्फ़िगर करने में सक्षम होते हैं, जैसे Data Protection या Keychain Sharing। ये अनुमतियाँ ऐप के इंस्टॉल होते ही लागू हो जाती हैं। फिर भी, कुछ संरक्षित संसाधनों तक पहुँचने के लिए, ऐप को पहले प्रयास के समय उपयोगकर्ता से स्पष्ट सहमति प्राप्त करनी होती है। यह purpose strings या usage description strings के उपयोग के माध्यम से किया जाता है, जो उपयोगकर्ताओं को अनुमति अनुरोध अलर्ट में प्रस्तुत किए जाते हैं।

जिनके पास स्रोत कोड तक पहुँच है, वे Info.plist फ़ाइल में शामिल अनुमतियों की पुष्टि कर सकते हैं:

  1. Xcode में प्रोजेक्ट खोलें।

  2. Info.plist फ़ाइल को खोजें और खोलें।

  3. स्पष्टता के लिए "Privacy -" से प्रारंभ होने वाले कुंजियों की खोज करें, कच्चे कुंजी/मान देखने का विकल्प के साथ।

IPA फ़ाइल के साथ काम करते समय, निम्नलिखित चरणों का पालन किया जा सकता है:

  1. IPA को अनज़िप करें।

  2. Payload/<appname>.app/ के भीतर Info.plist फ़ाइल को खोजें।

  3. यदि आवश्यक हो, तो फ़ाइल को XML प्रारूप में परिवर्तित करें, ताकि निरीक्षण करना आसान हो सके।

उदाहरण के लिए, Info.plist फ़ाइल में purpose strings इस प्रकार दिख सकते हैं:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

Device Capabilities

The Info.plist फ़ाइल एक ऐप की डिवाइस क्षमताएँ निर्दिष्ट करती है जो ऐप स्टोर को डिवाइस संगतता के लिए ऐप्स को फ़िल्टर करने में मदद करती हैं। ये UIRequiredDeviceCapabilities कुंजी के तहत परिभाषित की गई हैं। उदाहरण के लिए:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

यह उदाहरण इंगित करता है कि ऐप armv7 निर्देश सेट के साथ संगत है। डेवलपर्स nfc जैसी क्षमताओं को निर्दिष्ट कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि उनका ऐप केवल उन उपकरणों के लिए उपलब्ध है जो NFC का समर्थन करते हैं।

अधिकार

अधिकार iOS ऐप विकास का एक और महत्वपूर्ण पहलू हैं, जो कुंजी-मूल्य जोड़े के रूप में कार्य करते हैं जो ऐप्स को रनटाइम जांचों से परे कुछ संचालन करने की अनुमति देते हैं। उदाहरण के लिए, एक ऐप में डेटा सुरक्षा सक्षम करने के लिए Xcode प्रोजेक्ट में एक विशिष्ट अधिकार जोड़ना शामिल है, जो फिर ऐप के अधिकार फ़ाइल या IPAs के लिए एम्बेडेड मोबाइल प्रावधान फ़ाइल में परिलक्षित होता है।

संदर्भ

Support HackTricks

Last updated