mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
131 lines
21 KiB
Markdown
131 lines
21 KiB
Markdown
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
# विशेषाधिकार विभाजन और सैंडबॉक्स
|
|
|
|
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**](https://github.com/abjurato/FileDp-Source) का उपयोग कर सकते हैं, जो iPhone पर फाइलों के डेटा सुरक्षा वर्ग की जांच करने के लिए एक उपकरण है।
|
|
```python
|
|
# 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
|
|
```
|
|
## **कीचेन**
|
|
|
|
iOS में, एक **कीचेन** एक सुरक्षित **एन्क्रिप्टेड कंटेनर** के रूप में कार्य करता है जो **संवेदनशील जानकारी** को संग्रहीत करता है, जिसे केवल उस एप्लिकेशन द्वारा या उन लोगों द्वारा एक्सेस किया जा सकता है जिन्हें स्पष्ट रूप से अधिकृत किया गया है। यह एन्क्रिप्शन एक अद्वितीय **पासवर्ड द्वारा मजबूत किया गया है जो iOS द्वारा उत्पन्न होता है**, जो स्वयं **AES** के साथ एन्क्रिप्ट किया गया है। यह एन्क्रिप्शन प्रक्रिया एक **PBKDF2 फ़ंक्शन** का उपयोग करती है, जो उपयोगकर्ता के पासकोड को एक नमक के साथ जोड़ती है जो डिवाइस के **UID** से प्राप्त होता है, एक घटक जिसे केवल **सुरक्षित एन्क्लेव चिपसेट** एक्सेस कर सकता है। परिणामस्वरूप, भले ही उपयोगकर्ता का पासकोड ज्ञात हो, कीचेन की सामग्री किसी अन्य डिवाइस पर अनुपलब्ध रहती है सिवाय उस डिवाइस के जहां उन्हें मूल रूप से एन्क्रिप्ट किया गया था।
|
|
|
|
**कीचेन डेटा का प्रबंधन और एक्सेस** **`securityd` डेमन** द्वारा किया जाता है, जो विशिष्ट ऐप अधिकारों जैसे `Keychain-access-groups` और `application-identifier` पर आधारित है।
|
|
|
|
### **कीचेन एपीआई ऑपरेशंस**
|
|
|
|
कीचेन एपीआई, [Apple के Keychain Services दस्तावेज़](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html) में विस्तृत, सुरक्षित संग्रह प्रबंधन के लिए आवश्यक कार्य प्रदान करता है:
|
|
|
|
- **`SecItemAdd`**: कीचेन में एक नया आइटम जोड़ता है।
|
|
- **`SecItemUpdate`**: कीचेन में एक मौजूदा आइटम को अपडेट करता है।
|
|
- **`SecItemCopyMatching`**: कीचेन से एक आइटम प्राप्त करता है।
|
|
- **`SecItemDelete`**: कीचेन से एक आइटम को हटाता है।
|
|
|
|
कीचेन पासवर्ड को ब्रूट-फोर्स करना एन्क्रिप्टेड कुंजी पर सीधे हमला करने या डिवाइस पर पासकोड का अनुमान लगाने का प्रयास करने में शामिल है, जिसे असफल प्रयासों के बीच सुरक्षित एन्क्लेव द्वारा लागू किए गए विलंब से काफी हद तक बाधित किया जाता है।
|
|
|
|
### **कीचेन आइटम डेटा सुरक्षा कॉन्फ़िगर करना**
|
|
|
|
कीचेन आइटम के लिए डेटा सुरक्षा स्तर आइटम निर्माण या अपडेट के दौरान `kSecAttrAccessible` विशेषता का उपयोग करके सेट किए जाते हैं। ये स्तर, [Apple द्वारा निर्दिष्ट](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), यह निर्धारित करते हैं कि कीचेन आइटम कब और कैसे एक्सेस किए जा सकते हैं:
|
|
|
|
- **`kSecAttrAccessibleAlways`**: किसी भी समय, डिवाइस लॉक स्थिति की परवाह किए बिना एक्सेस किया जा सकता है।
|
|
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: हमेशा एक्सेस किया जा सकता है, लेकिन बैकअप में शामिल नहीं है।
|
|
- **`kSecAttrAccessibleAfterFirstUnlock`**: पहले अनलॉक के बाद एक्सेस किया जा सकता है।
|
|
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: ऊपर जैसा ही, लेकिन नए डिवाइस पर स्थानांतरित नहीं किया जा सकता।
|
|
- **`kSecAttrAccessibleWhenUnlocked`**: केवल तब एक्सेस किया जा सकता है जब डिवाइस अनलॉक हो।
|
|
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: अनलॉक होने पर एक्सेस किया जा सकता है, बैकअप में शामिल नहीं है।
|
|
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: डिवाइस पासकोड की आवश्यकता होती है, बैकअप में शामिल नहीं है।
|
|
|
|
**`AccessControlFlags`** एक्सेस विधियों को और अधिक परिष्कृत करते हैं, बायोमेट्रिक प्रमाणीकरण या पासकोड उपयोग की अनुमति देते हैं।
|
|
|
|
### **जेलब्रोकन डिवाइस चेतावनी**
|
|
|
|
> [!WARNING]
|
|
> **जेलब्रोकन डिवाइसों** पर, कीचेन की सुरक्षा से समझौता किया गया है, जो एक महत्वपूर्ण सुरक्षा जोखिम प्रस्तुत करता है।
|
|
|
|
### **कीचेन डेटा की स्थिरता**
|
|
|
|
ऐप विशेष डेटा के विपरीत जो ऐप अनइंस्टॉल होने पर हटा दिया जाता है, **कीचेन डेटा डिवाइस पर स्थायी रहता है**। यह विशेषता एक सेकंड-हैंड डिवाइस के नए मालिकों को पिछले मालिक के एप्लिकेशन डेटा तक पहुंचने में सक्षम बना सकती है, बस ऐप्स को फिर से इंस्टॉल करके। डेवलपर्स को इस जोखिम को कम करने के लिए ऐप इंस्टॉलेशन या लॉगआउट के दौरान कीचेन डेटा को सक्रिय रूप से साफ़ करने की सलाह दी जाती है। यहां एक स्विफ्ट कोड उदाहरण है जो पहले ऐप लॉन्च पर कीचेन डेटा को साफ़ करने का प्रदर्शन करता है:
|
|
```swift
|
|
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** के तहत sandbox नीतियों के माध्यम से किया जाता है।
|
|
|
|
डेवलपर्स अपने ऐप्स के लिए कुछ **क्षमताएँ या अनुमतियाँ** कॉन्फ़िगर करने में सक्षम होते हैं, जैसे **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 इस प्रकार दिख सकते हैं:
|
|
```xml
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>NSLocationWhenInUseUsageDescription</key>
|
|
<string>Your location is used to provide turn-by-turn directions to your destination.</string>
|
|
```
|
|
## डिवाइस क्षमताएँ
|
|
|
|
The `Info.plist` file of an app specifies **device capabilities** that help the App Store filter apps for device compatibility. These are defined under the **`UIRequiredDeviceCapabilities`** key. For instance:
|
|
```xml
|
|
<key>UIRequiredDeviceCapabilities</key>
|
|
<array>
|
|
<string>armv7</string>
|
|
</array>
|
|
```
|
|
यह उदाहरण दर्शाता है कि ऐप armv7 निर्देश सेट के साथ संगत है। डेवलपर्स nfc जैसी क्षमताओं को निर्दिष्ट कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि उनका ऐप केवल उन उपकरणों के लिए उपलब्ध है जो NFC का समर्थन करते हैं।
|
|
|
|
## अधिकार
|
|
|
|
**अधिकार** iOS ऐप विकास का एक और महत्वपूर्ण पहलू हैं, जो कुंजी-मूल्य जोड़े के रूप में कार्य करते हैं जो ऐप्स को रनटाइम जांचों से परे कुछ संचालन करने की अनुमति देते हैं। उदाहरण के लिए, एक ऐप में **डेटा सुरक्षा** सक्षम करने के लिए Xcode प्रोजेक्ट में एक विशिष्ट अधिकार जोड़ना शामिल है, जो फिर ऐप के अधिकार फ़ाइल या IPAs के लिए एम्बेडेड मोबाइल प्रावधान फ़ाइल में परिलक्षित होता है।
|
|
|
|
# संदर्भ
|
|
|
|
- [https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage](https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage)
|
|
- [https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md](https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md)
|
|
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/)
|
|
- [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|