iOS Basics

Support HackTricks

Razdvajanje privilegija i Sandbox

U iOS-u, postoji razlika u privilegijama između aplikacija dostupnih korisnicima i osnovnih procesa sistema. Aplikacije se pokreću pod identitetom korisnika mobile, dok ključni sistemski procesi rade kao root. Ovo razdvajanje se dodatno pojačava mehanizmom sandbox-a, koji nameće stroga ograničenja na to koje akcije aplikacije mogu preduzeti. Na primer, čak i ako aplikacije dele isti identitet korisnika, zabranjeno im je pristupanje ili modifikovanje podataka jednih drugih.

Aplikacije se instaliraju u specifičnu direktoriju (private/var/mobile/Applications/{random ID}) i imaju ograničen pristup čitanju određenih sistemskih oblasti i funkcionalnosti, kao što su SMS i telefonski pozivi. Pristup zaštićenim oblastima pokreće iskačući zahtev za korisničku dozvolu.

Zaštita podataka

iOS nudi programerima API-je za zaštitu podataka, koji su izgrađeni na Secure Enclave Processor (SEP) — posvećenom koprocesoru za kriptografske operacije i upravljanje ključevima. SEP osigurava integritet zaštite podataka putem jedinstvenog ključa specifičnog za uređaj, UID uređaja, ugrađenog u njega.

Pri kreiranju datoteke generiše se jedinstveni 256-bitni AES enkripcioni ključ, koji enkriptuje sadržaj datoteke. Ovaj enkripcioni ključ, zajedno sa ID-jem klase, zatim se enkriptuje koristeći ključ klase i čuva unutar metapodataka datoteke. Dešifrovanje datoteke uključuje korišćenje sistemskog ključa za pristup metapodacima, preuzimanje ključa klase sa ID-jem klase, a zatim dešifrovanje jedinstvenog enkripcionog ključa datoteke.

iOS definiše četiri klase zaštite za bezbednost podataka, koje određuju kada i kako se podaci mogu pristupiti:

  • Potpuna zaštita (NSFileProtectionComplete): Podaci su nedostupni dok se uređaj ne otključa korišćenjem korisničkog lozinke.

  • Zaštićeno osim ako je otvoreno (NSFileProtectionCompleteUnlessOpen): Omogućava pristup datoteci čak i nakon što je uređaj zaključan, pod uslovom da je datoteka otvorena kada je uređaj otključan.

  • Zaštićeno do prve korisničke autentifikacije (NSFileProtectionCompleteUntilFirstUserAuthentication): Podaci su dostupni nakon prve korisničke otključavanja posle pokretanja, ostajući dostupni čak i ako se uređaj ponovo zaključa.

  • Bez zaštite (NSFileProtectionNone): Podaci su zaštićeni samo UID-om uređaja, olakšavajući brzo daljinsko brisanje podataka.

Enkripcija svih klasa, osim za NSFileProtectionNone, uključuje ključ izveden iz UID-a uređaja i korisničke lozinke, osiguravajući da je dešifrovanje moguće samo na uređaju sa ispravnom lozinkom. Od iOS 7 nadalje, podrazumevana klasa zaštite je "Zaštićeno do prve korisničke autentifikacije".

Programeri mogu koristiti FileDP, alat za inspekciju klase zaštite podataka datoteka na iPhone-u.

# 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

U iOS-u, Keychain služi kao siguran kriptovani kontejner za čuvanje osetljivih informacija, koji je dostupan samo aplikaciji koja ga je sačuvala ili onima koji su izričito autorizovani. Ova enkripcija je ojačana jedinstvenom lozinkom koju generiše iOS, koja je sama po sebi kriptovana sa AES. Ovaj proces enkripcije koristi PBKDF2 funkciju, kombinujući korisnički kod sa solju dobijenom iz UID uređaja, komponentom kojoj može pristupiti samo secure enclave chipset. Kao rezultat, čak i ako je korisnički kod poznat, sadržaj Keychain-a ostaje nedostupan na bilo kom uređaju osim onog na kojem je prvobitno kriptovan.

Upravljanje i pristup podacima Keychain-a obavlja securityd daemon, na osnovu specifičnih prava aplikacije kao što su Keychain-access-groups i application-identifier.

Operacije Keychain API-a

Keychain API, detaljno opisan u Apple-ovoj dokumentaciji o Keychain Services, pruža osnovne funkcije za upravljanje sigurnim skladištem:

  • SecItemAdd: Dodaje novu stavku u Keychain.

  • SecItemUpdate: Ažurira postojeću stavku u Keychain.

  • SecItemCopyMatching: Preuzima stavku iz Keychain.

  • SecItemDelete: Uklanja stavku iz Keychain.

Brute-forcing lozinke Keychain-a uključuje ili napad na kriptovani ključ direktno ili pokušaj pogađanja lozinke na samom uređaju, što je značajno otežano primenom sigurnog enclave-a koji nameće kašnjenje između neuspešnih pokušaja.

Konfigurisanje zaštite podataka stavki Keychain-a

Nivoi zaštite podataka za stavke Keychain-a postavljaju se korišćenjem atributa kSecAttrAccessible tokom kreiranja ili ažuriranja stavke. Ovi nivoi, kako je navedeno od strane Apple-a, određuju kada i kako su stavke Keychain-a dostupne:

  • kSecAttrAccessibleAlways: Dostupno u bilo kojem trenutku, bez obzira na status zaključavanja uređaja.

  • kSecAttrAccessibleAlwaysThisDeviceOnly: Uvek dostupno, ali nije uključeno u rezervne kopije.

  • kSecAttrAccessibleAfterFirstUnlock: Dostupno nakon prvog otključavanja posle ponovnog pokretanja.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Isto kao i gore, ali nije prenosivo na nove uređaje.

  • kSecAttrAccessibleWhenUnlocked: Dostupno samo kada je uređaj otključan.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Dostupno kada je otključano, nije uključeno u rezervne kopije.

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Zahteva lozinku uređaja, nije uključeno u rezervne kopije.

AccessControlFlags dodatno preciziraju metode pristupa, omogućavajući biometrijsku autentifikaciju ili korišćenje lozinke.

Upozorenje o Jailbroken uređajima

Na jailbroken uređajima, zaštite Keychain-a su kompromitovane, što predstavlja značajan bezbednosni rizik.

Trajnost podataka Keychain-a

Za razliku od podataka specifičnih za aplikaciju koji se brišu prilikom deinstalacije aplikacije, podaci Keychain-a ostaju na uređaju. Ova karakteristika može omogućiti novim vlasnicima polovnog uređaja da pristupe podacima prethodnog vlasnika aplikacije jednostavno ponovnim instaliranjem aplikacija. Programerima se savetuje da proaktivno obrišu podatke Keychain-a prilikom instalacije aplikacije ili tokom odjave kako bi umanjili ovaj rizik. Evo primera Swift koda koji demonstrira kako da obrišete podatke Keychain-a prilikom prvog pokretanja aplikacije:

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

U oblasti razvoja aplikacija, sandboxing igra ključnu ulogu u poboljšanju bezbednosti. Ovaj proces osigurava da svaka aplikacija funkcioniše unutar svog jedinstvenog domaćeg direktorijuma, čime se sprečava pristup sistemskim datotekama ili podacima koji pripadaju drugim aplikacijama. Sprovođenje ovih ograničenja vrši se kroz sandbox politike, koje su deo Trusted BSD (MAC) Mandatory Access Control Framework.

Programeri imaju mogućnost da konfigurišu određene kapacitete ili dozvole za svoje aplikacije, kao što su Data Protection ili Keychain Sharing. Ove dozvole se primenjuju odmah nakon instalacije aplikacije. Ipak, za pristup određenim zaštićenim resursima, aplikacija mora dobiti izričitu saglasnost od korisnika prilikom prvog pokušaja. To se postiže korišćenjem purpose strings ili usage description strings, koje se prikazuju korisnicima u alertu za zahtev za dozvolu.

Za one koji imaju pristup izvor kodu, verifikacija dozvola uključenih u Info.plist datoteku može se izvršiti na sledeći način:

  1. Otvorite projekat u Xcode-u.

  2. Pronađite i otvorite Info.plist datoteku.

  3. Pretražujte ključeve koji počinju sa "Privacy -", uz mogućnost pregleda sirovih ključeva/vrednosti radi jasnoće.

Kada se radi sa IPA datotekom, sledeći koraci se mogu pratiti:

  1. Raspakujte IPA.

  2. Pronađite Info.plist datoteku unutar Payload/<appname>.app/.

  3. Konvertujte datoteku u XML format ako je potrebno, radi lakšeg pregleda.

Na primer, purpose strings u Info.plist datoteci mogu izgledati ovako:

<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

Datoteka Info.plist aplikacije specificira mogućnosti uređaja koje pomažu App Store-u da filtrira aplikacije prema kompatibilnosti sa uređajem. Ove su definisane pod ključem UIRequiredDeviceCapabilities. Na primer:

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

Ovaj primer ukazuje da je aplikacija kompatibilna sa armv7 skupom instrukcija. Programeri takođe mogu da specificiraju mogućnosti kao što je nfc kako bi osigurali da je njihova aplikacija dostupna samo uređajima koji podržavaju NFC.

Ovlašćenja

Ovlašćenja su još jedan kritičan aspekt razvoja iOS aplikacija, služeći kao parovi ključ-vrednost koji dodeljuju aplikacijama dozvolu da izvršavaju određene operacije van provere u vreme izvođenja. Na primer, omogućavanje Zaštite podataka u aplikaciji podrazumeva dodavanje specifičnog ovlašćenja u Xcode projektu, što se zatim odražava u datoteci ovlašćenja aplikacije ili u ugrađenoj mobilnoj proviziji za IPA.

Reference

Support HackTricks

Last updated