macOS - AMFI - AppleMobileFileIntegrity
Reading time: 7 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
AppleMobileFileIntegrity.kext i amfid
Fokusira se na sprovođenje integriteta koda koji se izvršava na sistemu, pružajući logiku iza verifikacije potpisa koda XNU-a. Takođe može da proveri prava i obavlja druge osetljive zadatke kao što su omogućavanje debagovanja ili dobijanje portova zadataka.
Štaviše, za neke operacije, kext preferira da kontaktira korisnički prostor koji pokreće demon /usr/libexec/amfid
. Ova poverljiva veza je zloupotrebljena u nekoliko jailbreak-ova.
AMFI koristi MACF politike i registruje svoje hook-ove u trenutku kada se pokrene. Takođe, sprečavanje njegovog učitavanja ili uklanjanja može izazvati kernel panic. Međutim, postoje neki argumenti za pokretanje koji omogućavaju oslabiti AMFI:
amfi_unrestricted_task_for_pid
: Dozvoljava task_for_pid bez potrebnih pravaamfi_allow_any_signature
: Dozvoljava bilo koji potpis kodacs_enforcement_disable
: Argument na nivou sistema koji se koristi za onemogućavanje sprovođenja potpisivanja kodaamfi_prevent_old_entitled_platform_binaries
: Odbacuje platforme binarne sa pravimaamfi_get_out_of_my_way
: Potpuno onemogućava amfi
Ovo su neke od MACF politika koje registruje:
cred_check_label_update_execve:
Ažuriranje oznake će biti izvršeno i vratiće 1cred_label_associate
: Ažurira AMFI-ovu mac oznakucred_label_destroy
: Uklanja AMFI-ovu mac oznakucred_label_init
: Postavlja 0 u AMFI-ovu mac oznakucred_label_update_execve
: Proverava prava procesa da vidi da li bi trebalo da mu bude dozvoljeno da menja oznake.file_check_mmap
: Proverava da li mmap stiče memoriju i postavlja je kao izvršivu. U tom slučaju proverava da li je potrebna validacija biblioteke i, ako jeste, poziva funkciju za validaciju biblioteke.file_check_library_validation
: Poziva funkciju za validaciju biblioteke koja proverava, između ostalog, da li platforma binarna učitava drugu platformu binarnu ili da li proces i novo učitani fajl imaju isti TeamID. Određena prava će takođe omogućiti učitavanje bilo koje biblioteke.policy_initbsd
: Postavlja poverljive NVRAM ključevepolicy_syscall
: Proverava DYLD politike kao što su da li binarna ima neograničene segmente, da li bi trebalo da dozvoli env varijable... ovo se takođe poziva kada se proces pokreće putemamfi_check_dyld_policy_self()
.proc_check_inherit_ipc_ports
: Proverava da li kada proces izvršava novu binarnu, drugi procesi sa SEND pravima nad portom zadatka procesa treba da ih zadrže ili ne. Platforme binarne su dozvoljene,get-task-allow
pravo to dozvoljava,task_for_pid-allow
prava su dozvoljena i binarne sa istim TeamID.proc_check_expose_task
: sprovodi pravaamfi_exc_action_check_exception_send
: Poruka izuzetka se šalje debageruamfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update
: Životni ciklus oznake tokom obrade izuzetaka (debugging)proc_check_get_task
: Proverava prava kao što suget-task-allow
koja omogućava drugim procesima da dobiju port zadatka itask_for_pid-allow
, koja omogućava procesu da dobije portove zadataka drugih procesa. Ako nijedno od toga nije, pozivaamfid permitunrestricteddebugging
da proveri da li je dozvoljeno.proc_check_mprotect
: Odbija ako jemprotect
pozvan sa oznakomVM_PROT_TRUSTED
koja ukazuje da se region mora tretirati kao da ima važeći potpis koda.vnode_check_exec
: Poziva se kada se izvršne datoteke učitavaju u memoriju i postavljacs_hard | cs_kill
što će ubiti proces ako neka od stranica postane nevažećavnode_check_getextattr
: MacOS: Proveravacom.apple.root.installed
iisVnodeQuarantined()
vnode_check_setextattr
: Kao get + com.apple.private.allow-bless i interno-instalacijski ekvivalent pravavnode_check_signature
: Kod koji poziva XNU da proveri potpis koda koristeći prava, trust cache iamfid
proc_check_run_cs_invalid
: Presrećeptrace()
pozive (PT_ATTACH
iPT_TRACE_ME
). Proverava za bilo koje od pravaget-task-allow
,run-invalid-allow
irun-unsigned-code
i ako nijedno, proverava da li je debagovanje dozvoljeno.proc_check_map_anon
: Ako je mmap pozvan saMAP_JIT
oznakom, AMFI će proveritidynamic-codesigning
pravo.
AMFI.kext
takođe izlaže API za druge kernel ekstenzije, i moguće je pronaći njegove zavisnosti sa:
kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
8 com.apple.kec.corecrypto
19 com.apple.driver.AppleMobileFileIntegrity
22 com.apple.security.sandbox
24 com.apple.AppleSystemPolicy
67 com.apple.iokit.IOUSBHostFamily
70 com.apple.driver.AppleUSBTDM
71 com.apple.driver.AppleSEPKeyStore
74 com.apple.iokit.EndpointSecurity
81 com.apple.iokit.IOUserEthernet
101 com.apple.iokit.IO80211Family
102 com.apple.driver.AppleBCMWLANCore
118 com.apple.driver.AppleEmbeddedUSBHost
134 com.apple.iokit.IOGPUFamily
135 com.apple.AGXG13X
137 com.apple.iokit.IOMobileGraphicsFamily
138 com.apple.iokit.IOMobileGraphicsFamily-DCP
162 com.apple.iokit.IONVMeFamily
amfid
Ovo je demon koji radi u korisničkom režimu i koji će AMFI.kext
koristiti za proveru potpisa koda u korisničkom režimu.
Da bi AMFI.kext
komunicirao sa demonom, koristi mach poruke preko porta HOST_AMFID_PORT
, koji je poseban port 18
.
Napomena: u macOS-u više nije moguće da root procesi preuzmu posebne portove jer su zaštićeni SIP
-om i samo launchd može da ih dobije. U iOS-u se proverava da proces koji šalje odgovor ima hardkodovani CDHash amfid
.
Moguće je videti kada se amfid
traži da proveri binarni fajl i odgovor na to tako što se debaguje i postavi breakpoint u mach_msg
.
Kada se poruka primi putem posebnog porta, MIG se koristi za slanje svake funkcije funkciji koju poziva. Glavne funkcije su obrnute i objašnjene unutar knjige.
Provisioning Profiles
Provisioning profil se može koristiti za potpisivanje koda. Postoje Developer profili koji se mogu koristiti za potpisivanje koda i testiranje, i Enterprise profili koji se mogu koristiti na svim uređajima.
Nakon što je aplikacija poslata u Apple Store, ako je odobrena, potpisuje je Apple i provisioning profil više nije potreban.
Profil obično koristi ekstenziju .mobileprovision
ili .provisionprofile
i može se dumpovati sa:
openssl asn1parse -inform der -in /path/to/profile
# Or
security cms -D -i /path/to/profile
Iako se ponekad nazivaju sertifikovanim, ovi profili za dodeljivanje imaju više od sertifikata:
- AppIDName: Identifikator aplikacije
- AppleInternalProfile: Oznaka da je ovo Apple interni profil
- ApplicationIdentifierPrefix: Prependovan AppIDName (isto kao TeamIdentifier)
- CreationDate: Datum u formatu
YYYY-MM-DDTHH:mm:ssZ
- DeveloperCertificates: Niz (obično jedan) sertifikat(a), kodiran kao Base64 podaci
- Entitlements: Prava dozvoljena sa pravima za ovaj profil
- ExpirationDate: Datum isteka u formatu
YYYY-MM-DDTHH:mm:ssZ
- Name: Ime aplikacije, isto kao AppIDName
- ProvisionedDevices: Niz (za sertifikate programera) UDID-ova za koje je ovaj profil važeći
- ProvisionsAllDevices: Boolean (true za preduzetničke sertifikate)
- TeamIdentifier: Niz (obično jedan) alfanumeričkih stringova koji se koriste za identifikaciju programera u svrhe interakcije između aplikacija
- TeamName: Ljudski čitljivo ime koje se koristi za identifikaciju programera
- TimeToLive: Važenje (u danima) sertifikata
- UUID: Univerzalno jedinstveni identifikator za ovaj profil
- Version: Trenutno postavljeno na 1
Napomena: Unos prava će sadržati ograničen set prava i profil za dodeljivanje će moći da dodeli samo ta specifična prava kako bi se sprečilo dodeljivanje privatnih prava Apple-u.
Napomena: Profili se obično nalaze u /var/MobileDeviceProvisioningProfiles
i moguće je proveriti ih sa security cms -D -i /path/to/profile
libmis.dyld
Ovo je spoljašnja biblioteka koju amfid
poziva kako bi pitao da li treba da dozvoli nešto ili ne. Ovo je istorijski zloupotrebljavano u jailbreak-u pokretanjem verzije sa backdoor-om koja bi dozvolila sve.
U macOS-u ovo se nalazi unutar MobileDevice.framework
.
AMFI Trust Caches
iOS AMFI održava listu poznatih hash-eva koji su potpisani ad-hoc, nazvanu Trust Cache i nalazi se u __TEXT.__const
sekciji kext-a. Napomena: U vrlo specifičnim i osetljivim operacijama moguće je proširiti ovu Trust Cache sa spoljnim fajlom.
References
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.