{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
# Utenganishaji wa Haki na Sandbox
Katika iOS, kuna tofauti katika haki kati ya programu zinazoweza kufikiwa na mtumiaji na michakato ya msingi ya mfumo. Programu zinaendesha chini ya utambulisho wa mtumiaji **`mobile`**, wakati michakato muhimu ya mfumo inafanya kazi kama **`root`**. Utenganishaji huu unaboreshwa na mekanizma ya sandbox, ambayo inatoa mipaka madhubuti juu ya vitendo ambavyo programu zinaweza kuchukua. Kwa mfano, hata kama programu zinashiriki utambulisho sawa wa mtumiaji, zinakatazwa kufikia au kubadilisha data za kila mmoja.
Programu zinawekwa katika directory maalum (`private/var/mobile/Applications/{random ID}`) na zina upatikanaji wa kusoma uliozuiliwa kwa maeneo na kazi fulani za mfumo, kama vile SMS na simu. Upatikanaji wa maeneo yaliyolindwa unachochea ombi la kuruka kwa ruhusa ya mtumiaji.
# Ulinzi wa Data
iOS inatoa waendelezaji **Data Protection APIs**, iliyojengwa juu ya Secure Enclave Processor (SEP) — co-processor maalum kwa ajili ya operesheni za kificho na usimamizi wa funguo. SEP inahakikisha ulinzi wa data kwa njia ya funguo maalum za kifaa, UID ya kifaa, iliyojumuishwa ndani yake.
Pale faili inapotengenezwa, funguo ya kipekee ya AES ya bit 256 inazalishwa, ikificha maudhui ya faili. Funguo hii ya kificho, pamoja na ID ya darasa, kisha inafichwa kwa kutumia funguo ya darasa na kuhifadhiwa ndani ya metadata ya faili. Kufichua faili kunahusisha kutumia funguo ya mfumo kufikia metadata, kupata funguo ya darasa na ID ya darasa, na kisha kufichua funguo ya kipekee ya kificho ya faili.
iOS inaelezea **darasa nne za ulinzi** kwa ajili ya usalama wa data, ambazo zinatofautisha wakati na jinsi data inaweza kufikiwa:
- **Ulinzi Kamili (NSFileProtectionComplete)**: Data haiwezi kufikiwa mpaka kifaa kifunguliwe kwa kutumia nambari ya siri ya mtumiaji.
- **Ililindwa Isipokuwa Iwapo Imefunguliwa (NSFileProtectionCompleteUnlessOpen)**: Inaruhusu upatikanaji wa faili hata baada ya kifaa kufungwa, ikiwa faili ilifunguliwa wakati kifaa kilifunguliwa.
- **Ililindwa Hadi Uthibitisho wa Kwanza wa Mtumiaji (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Data inapatikana baada ya uthibitisho wa kwanza wa mtumiaji baada ya kuanzisha, ikibaki inapatikana hata kama kifaa kimefungwa tena.
- **Hakuna Ulinzi (NSFileProtectionNone)**: Data inalindwa tu na UID ya kifaa, ikiruhusu kufuta data kwa haraka kwa mbali.
Fichuo la madarasa yote, isipokuwa `NSFileProtectionNone`, linahusisha funguo inayotokana na UID ya kifaa na nambari ya siri ya mtumiaji, kuhakikisha kwamba kufichua kunawezekana tu kwenye kifaa chenye nambari sahihi ya siri. Kuanzia iOS 7 na kuendelea, darasa la ulinzi la kawaida ni "Ililindwa Hadi Uthibitisho wa Kwanza wa Mtumiaji".
Waendelezaji wanaweza kutumia [**FileDP**](https://github.com/abjurato/FileDp-Source), chombo cha kukagua darasa la ulinzi wa data wa faili kwenye 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
```
## **Keychain**
Katika iOS, **Keychain** inatumika kama **konteina salama iliyo na usimbuaji** kwa ajili ya kuhifadhi **taarifa nyeti**, inayopatikana tu na programu iliyohifadhi taarifa hizo au zile zilizoidhinishwa wazi. Usimbuaji huu unalindwa na **nenosiri la kipekee lililotengenezwa na iOS**, ambalo lenyewe limefichwa kwa **AES**. Mchakato huu wa usimbuaji unatumia **PBKDF2 function**, ukichanganya nambari ya siri ya mtumiaji na chumvi iliyotokana na **UID** ya kifaa, sehemu ambayo ni ya **secure enclave chipset** pekee inayoweza kufikiwa. Kwa hivyo, hata kama nambari ya siri ya mtumiaji inajulikana, maudhui ya Keychain yanabaki yasiyoweza kupatikana kwenye kifaa kingine chochote isipokuwa kile ambacho yalifichwa awali.
**Usimamizi na ufikiaji** wa data za Keychain unashughulikiwa na **`securityd` daemon**, kulingana na haki maalum za programu kama `Keychain-access-groups` na `application-identifier`.
### **Keychain API Operations**
Keychain API, iliyoelezwa katika [nyaraka za Keychain Services za Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), inatoa kazi muhimu za usimamizi wa hifadhi salama:
- **`SecItemAdd`**: Inaongeza kipengele kipya kwenye Keychain.
- **`SecItemUpdate`**: Inaweza kuboresha kipengele kilichopo kwenye Keychain.
- **`SecItemCopyMatching`**: Inapata kipengele kutoka kwenye Keychain.
- **`SecItemDelete`**: Inafuta kipengele kutoka kwenye Keychain.
Kujaribu kufungua nenosiri la Keychain kunahusisha ama kushambulia funguo zilizofichwa moja kwa moja au kujaribu kukisia nambari ya siri kwenye kifaa chenyewe, ambayo inakabiliwa kwa kiasi kikubwa na utekelezaji wa secure enclave wa kuchelewesha kati ya majaribio yasiyofanikiwa.
### **Configuring Keychain Item Data Protection**
Viwango vya ulinzi wa data kwa vipengele vya Keychain vinakabiliwa kwa kutumia sifa ya `kSecAttrAccessible` wakati wa kuunda au kuboresha kipengele. Viwango hivi, [kama ilivyoainishwa na Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), vinatambulisha wakati na jinsi vipengele vya Keychain vinavyopatikana:
- **`kSecAttrAccessibleAlways`**: Inapatikana wakati wowote, bila kujali hali ya kufunga kifaa.
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Inapatikana kila wakati, lakini haijajumuishwa kwenye nakala za akiba.
- **`kSecAttrAccessibleAfterFirstUnlock`**: Inapatikana baada ya kufungua mara ya kwanza baada ya kuanzisha upya.
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Kama ilivyo hapo juu, lakini haiwezi kuhamishwa kwa vifaa vipya.
- **`kSecAttrAccessibleWhenUnlocked`**: Inapatikana tu wakati kifaa kimefunguliwa.
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Inapatikana wakati kimefunguliwa, haijajumuishwa kwenye nakala za akiba.
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Inahitaji nambari ya siri ya kifaa, haijajumuishwa kwenye nakala za akiba.
**`AccessControlFlags`** zinaboresha zaidi mbinu za ufikiaji, kuruhusu uthibitisho wa kibaiolojia au matumizi ya nambari ya siri.
### **Jailbroken Devices Warning**
{% hint style="warning" %}
Katika **vifaa vilivyovunjwa**, ulinzi wa Keychain umeharibiwa, na kuleta hatari kubwa ya usalama.
{% endhint %}
### **Persistence of Keychain Data**
Tofauti na data maalum za programu zinazofutwa wakati wa kufuta programu, **data za Keychain zinadumu** kwenye kifaa. Tabia hii inaweza kuwapa wamiliki wapya wa kifaa cha pili ufikiaji wa data za programu za mmiliki wa awali kwa kuanzisha upya programu. Wanakuza wanashauriwa kufuta data za Keychain kwa hiari wakati wa usakinishaji wa programu au wakati wa kutoka ili kupunguza hatari hii. Hapa kuna mfano wa msimbo wa Swift unaoonyesha jinsi ya kufuta data za Keychain wakati wa uzinduzi wa kwanza wa programu:
```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
}
```
# **App Capabilities**
Katika eneo la maendeleo ya programu, **sandboxing** ina jukumu muhimu katika kuimarisha usalama. Mchakato huu unahakikisha kwamba kila programu inafanya kazi ndani ya directory yake ya nyumbani, hivyo kuzuia kufikia faili za mfumo au data zinazomilikiwa na programu nyingine. Utekelezaji wa vizuizi hivi unafanywa kupitia sera za sandbox, ambazo ni sehemu ya **Trusted BSD (MAC) Mandatory Access Control Framework**.
Wakuu wa programu wana uwezo wa kuunda **uwezo au ruhusa** fulani kwa programu zao, kama vile **Data Protection** au **Keychain Sharing**. Ruhusa hizi zinatumika mara moja baada ya programu kufungwa. Hata hivyo, ili kufikia rasilimali fulani zilizolindwa, programu inapaswa kupata idhini wazi kutoka kwa mtumiaji wakati wa jaribio la kwanza. Hii inafanywa kupitia matumizi ya _purpose strings_ au _usage description strings_, ambazo zinawasilishwa kwa watumiaji katika arifa ya ombi la ruhusa.
Kwa wale wenye ufikiaji wa msimbo wa chanzo, uthibitisho wa ruhusa zilizo katika faili ya `Info.plist` unaweza kufanywa kwa:
1. Kufungua mradi katika Xcode.
2. Kutafuta na kufungua faili ya `Info.plist`.
3. Kutafuta funguo zilizoanzishwa na `"Privacy -"`, ikiwa na chaguo la kuona funguo/thamani za asili kwa uwazi.
Wakati wa kushughulikia faili ya IPA, hatua zifuatazo zinaweza kufuatwa:
1. Fungua faili la IPA.
2. Tafuta faili ya `Info.plist` ndani ya `Payload/.app/`.
3. Geuza faili kuwa katika muundo wa XML ikiwa ni lazima, kwa ajili ya ukaguzi rahisi.
Kwa mfano, purpose strings katika faili ya `Info.plist` zinaweza kuonekana kama hii:
```xml
NSLocationWhenInUseUsageDescription
Your location is used to provide turn-by-turn directions to your destination.
```
## Device Capabilities
Faili la `Info.plist` la programu linaeleza **uwezo wa kifaa** ambao husaidia Duka la Programu kuchuja programu kwa ajili ya ulinganifu wa kifaa. Hizi zimefafanuliwa chini ya **`UIRequiredDeviceCapabilities`** ufunguo. Kwa mfano:
```xml
UIRequiredDeviceCapabilities
armv7
```
This example indicates that the app is compatible with the armv7 instruction set. Developers may also specify capabilities like nfc to ensure their app is only available to devices supporting NFC.
## Entitlements
**Entitlements** ni kipengele kingine muhimu katika maendeleo ya programu za iOS, kinachofanya kazi kama jozi za funguo-thamani ambazo zinawapa programu ruhusa ya kufanya operesheni fulani zaidi ya ukaguzi wa wakati wa utekelezaji. Kwa mfano, kuwezesha **Data Protection** katika programu kunahusisha kuongeza ruhusa maalum katika mradi wa Xcode, ambayo kisha inaonyeshwa katika faili za ruhusa za programu au faili ya mkataba wa simu iliyojumuishwa kwa IPAs.
# References
* [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/)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}