iOS Basics

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Separacija privilegija i pesak

U iOS-u postoji razlika u privilegijama između aplikacija koje su dostupne korisniku i osnovnih procesa sistema. Aplikacije se izvršavaju pod identitetom korisnika mobile, dok ključni sistemski procesi rade kao root. Ova separacija je poboljšana mehanizmom peska, koji nameće stroga ograničenja na akcije koje aplikacije mogu preduzeti. Na primer, čak i ako aplikacije dele isti korisnički identitet, zabranjeno im je pristupanje ili menjanje podataka drugih aplikacija.

Aplikacije se instaliraju u određeni direktorijum (private/var/mobile/Applications/{random ID}) i imaju ograničen pristup određenim sistemskim područjima i funkcionalnostima, kao što su SMS poruke i telefonski pozivi. Pristup zaštićenim područjima pokreće zahtev za dozvolu korisnika.

Zaštita podataka

iOS nudi programerima Data Protection APIs, izgrađene na Secure Enclave Processor (SEP) - posebnom koprocessoru za kriptografske operacije i upravljanje ključevima. SEP obezbeđuje integritet zaštite podataka putem jedinstvenog ključa specifičnog za uređaj, UID uređaja, koji je ugrađen u njega.

Prilikom kreiranja datoteke, generiše se jedinstveni 256-bitni AES ključ za šifrovanje sadržaja datoteke. Ovaj ključ za šifrovanje, zajedno sa ID-em klase, zatim se šifruje pomoću ključa klase i čuva unutar metapodataka datoteke. Dekripcija datoteke uključuje korišćenje sistema ključa za pristup metapodacima, dobijanje ključa klase sa ID-em klase, a zatim dekripciju jedinstvenog ključa za šifrovanje datoteke.

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

  • Potpuna zaštita (NSFileProtectionComplete): Podaci su nedostupni sve dok se uređaj ne otključa korisnikovim šifrom.

  • 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 autentifikacije korisnika (NSFileProtectionCompleteUntilFirstUserAuthentication): Podaci su dostupni nakon prve otključane korisničke autentifikacije nakon pokretanja, i ostaju dostupni čak i ako se uređaj ponovo zaključa.

  • Bez zaštite (NSFileProtectionNone): Podaci su zaštićeni samo UID-om uređaja, što omogućava brisanje podataka na daljinu.

Šifrovanje svih klasa, osim NSFileProtectionNone, uključuje ključ koji se dobija iz UID-a uređaja i korisničke šifre, čime se osigurava da se dekripcija može izvršiti samo na uređaju sa ispravnom šifrom. Od iOS 7, podrazumevana klasa zaštite je "Zaštićeno do prve autentifikacije korisnika".

Programeri mogu koristiti FileDP, alat za pregledanje 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 šifrovan kontejner za skladištenje osetljivih informacija, koji je dostupan samo aplikaciji koja ga je skladištila ili onima koji su eksplicitno ovlašćeni. Ova enkripcija je ojačana jedinstvenom lozinkom generisanom od strane iOS-a, koja je sama po sebi enkriptovana sa AES-om. Ovaj proces enkripcije koristi PBKDF2 funkciju, kombinujući korisnikovu lozinku sa solju izvedenom iz UID-a uređaja, komponentom kojoj samo bezbedni enklavni čipset može pristupiti. Kao rezultat toga, čak i ako je korisnikova lozinka poznata, sadržaj Keychain-a ostaje nedostupan na bilo kom uređaju osim onog na kojem je originalno enkriptovan.

Upravljanje i pristup podacima Keychain-a se obavljaju putem securityd demona, na osnovu određenih privilegija aplikacije kao što su Keychain-access-groups i application-identifier.

Operacije Keychain API-ja

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

  • SecItemAdd: Dodaje novu stavku u Keychain.

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

  • SecItemCopyMatching: Preuzima stavku iz Keychain-a.

  • SecItemDelete: Uklanja stavku iz Keychain-a.

Brute-forcing Keychain lozinke uključuje ili napad na enkriptovan ključ direktno ili pokušaj pogodjenja lozinke na samom uređaju, što je značajno otežano zbog bezbednog enklavnog sprovođenja kašnjenja između neuspelih pokušaja.

Konfigurisanje zaštite podataka Keychain stavki

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

  • kSecAttrAccessibleAlways: Uvek dostupno, bez obzira na status zaključavanja uređaja.

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

  • kSecAttrAccessibleAfterFirstUnlock: Dostupno nakon prvog otključavanja nakon restarta.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Isto kao prethodno, 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 upotrebu lozinke.

Upozorenje za jailbroken uređaje

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

Trajnost Keychain podataka

Za razliku od podataka specifičnih za aplikaciju koji se brišu prilikom deinstalacije aplikacije, Keychain podaci persistiraju na uređaju. Ova karakteristika omogućava novim vlasnicima polovnog uređaja da pristupe podacima prethodnog vlasnika aplikacije jednostavno reinstaliranjem aplikacija. Razvojni programeri se savetuju da proaktivno brišu Keychain podatke prilikom instalacije aplikacije ili tokom odjavljivanja kako bi umanjili ovaj rizik. Evo primera Swift koda koji demonstrira kako obrisati Keychain podatke 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
}

Mogućnosti aplikacije

U svetu razvoja aplikacija, sandboxing igra ključnu ulogu u poboljšanju bezbednosti. Ovaj proces osigurava da svaka aplikacija radi unutar svog sopstvenog jedinstvenog direktorijuma, čime se sprečava pristup sistemskim fajlovima ili podacima drugih aplikacija. Sprovođenje ovih ograničenja vrši se putem sandbox politika, koje su deo Trusted BSD (MAC) Mandatory Access Control Framework.

Razvojni programeri imaju mogućnost konfigurisanja određenih mogućnosti ili dozvola za svoje aplikacije, kao što su Zaštita podataka ili Deljenje ključeva. Ove dozvole se primenjuju odmah nakon instaliranja aplikacije. Međutim, za pristup određenim zaštićenim resursima, aplikacija mora dobiti izričitu saglasnost korisnika prilikom prvog pokušaja. To se postiže kroz upotrebu purpose strings ili usage description strings, koji se prikazuju korisnicima u zahtevu za dozvolu.

Za one koji imaju pristup izvornom kodu, provera dozvola koje su uključene u Info.plist fajl može se obaviti na sledeći način:

  1. Otvorite projekat u Xcode-u.

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

  3. Pretražite ključeve sa prefiksom "Privacy -", sa opcijom prikaza sirovih ključeva/vrednosti radi jasnoće.

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

  1. Dekompresirajte IPA fajl.

  2. Pronađite Info.plist fajl unutar Payload/<naziv_aplikacije>.app/.

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

Na primer, purpose strings u Info.plist fajlu 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>

Mogućnosti uređaja

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

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

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

Ovlašćenja

Ovlašćenja su još jedan ključni aspekt razvoja iOS aplikacija, koji služe kao parovi ključ-vrednost koji dodeljuju aplikacijama dozvole za obavljanje određenih operacija izvan vremena izvršavanja. Na primer, omogućavanje Zaštite podataka u aplikaciji uključuje dodavanje određenog ovlašćenja u Xcode projekat, koje se zatim odražava u datoteci ovlašćenja aplikacije ili u ugrađenoj mobilnoj provizionoj datoteci za IPAs.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated