macOS Launch/Environment Constraints & Trust Cache
Reading time: 8 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Basic Information
Kikomo cha uzinduzi katika macOS kilianzishwa ili kuboresha usalama kwa kudhibiti jinsi, nani, na kutoka wapi mchakato unaweza kuanzishwa. Kilianza katika macOS Ventura, kinatoa mfumo unaopanga kila binary ya mfumo katika makundi tofauti ya vizuizi, ambayo yamefafanuliwa ndani ya cache ya kuaminika, orodha inayojumuisha binaries za mfumo na hash zao husika. Vizuizi hivi vinapanuka kwa kila binary inayoweza kutekelezwa ndani ya mfumo, ikihusisha seti ya kanuni zinazofafanua mahitaji ya kuanzisha binary maalum. Kanuni hizo zinajumuisha vizuizi vya kujitegemea ambavyo binary lazima ikidhi, vizuizi vya mzazi vinavyohitajika kukidhi na mchakato wake wa mzazi, na vizuizi vya kuwajibika vinavyopaswa kufuatwa na vyombo vingine husika.
Mekaniki hii inapanuka kwa programu za wahusika wengine kupitia Vizuizi vya Mazingira, kuanzia macOS Sonoma, ikiruhusu wabunifu kulinda programu zao kwa kubainisha seti ya funguo na thamani za vizuizi vya mazingira.
Unapofafanua vizuizi vya mazingira na maktaba katika kamusi za vizuizi ambazo unaziokoa katika faili za orodha ya mali za launchd
, au katika faili za orodha za mali za kando ambazo unazitumia katika saini ya msimbo.
Kuna aina 4 za vizuizi:
- Vizuizi vya Kujitegemea: Vizuizi vinavyotumika kwa binary inayotembea.
- Mchakato wa Mzazi: Vizuizi vinavyotumika kwa mzazi wa mchakato (kwa mfano
launchd
inayoendesha huduma ya XP) - Vizuizi vya Kuwajibika: Vizuizi vinavyotumika kwa mchakato unaoitisha huduma katika mawasiliano ya XPC
- Vizuizi vya kupakia maktaba: Tumia vizuizi vya kupakia maktaba kuelezea kwa kuchagua msimbo ambao unaweza kupakiwa
Hivyo wakati mchakato unajaribu kuanzisha mchakato mwingine — kwa kuita execve(_:_:_:)
au posix_spawn(_:_:_:_:_:_:)
— mfumo wa uendeshaji unakagua kwamba faili inayoweza kutekelezwa inakidhi vizuizi vyake vya kujitegemea. Pia inakagua kwamba mzazi wa mchakato inayoweza kutekelezwa inakidhi vizuizi vya mzazi vya executable, na kwamba mchakato wa kuwajibika inayoweza kutekelezwa inakidhi vizuizi vya mchakato wa kuwajibika. Ikiwa yoyote ya vizuizi hivi vya uzinduzi havikidhi, mfumo wa uendeshaji hauendeshi programu hiyo.
Ikiwa wakati wa kupakia maktaba sehemu yoyote ya vizuizi vya maktaba haviko kweli, mchakato wako haupaki maktaba.
LC Categories
LC inaundwa na fact na operesheni za kimantiki (na, au..) zinazounganisha ukweli.
Facts ambazo LC inaweza kutumia zimeandikwa. Kwa mfano:
- is-init-proc: Thamani ya Boolean inayonyesha ikiwa executable lazima iwe mchakato wa kuanzisha wa mfumo wa uendeshaji (
launchd
). - is-sip-protected: Thamani ya Boolean inayonyesha ikiwa executable lazima iwe faili iliyopewa ulinzi na Mfumo wa Uaminifu wa Mfumo (SIP).
on-authorized-authapfs-volume:
Thamani ya Boolean inayonyesha ikiwa mfumo wa uendeshaji ulipakia executable kutoka kwenye kiasi cha APFS kilichothibitishwa, kilichothibitishwa.on-authorized-authapfs-volume
: Thamani ya Boolean inayonyesha ikiwa mfumo wa uendeshaji ulipakia executable kutoka kwenye kiasi cha APFS kilichothibitishwa, kilichothibitishwa.- Kiasi cha Cryptexes
on-system-volume:
Thamani ya Boolean inayonyesha ikiwa mfumo wa uendeshaji ulipakia executable kutoka kwenye kiasi cha mfumo kilichozinduliwa kwa sasa.- Ndani ya /System...
- ...
Wakati binary ya Apple imesainiwa in itapewa LC category ndani ya cache ya kuaminika.
- iOS 16 LC categories zilirejelewa na kuandikwa hapa hapa.
- LC categories za sasa (macOS 14 - Somona) zimekaguliwa na maelezo yao yanaweza kupatikana hapa.
Kwa mfano, Kategoria 1 ni:
Category 1:
Self Constraint: (on-authorized-authapfs-volume || on-system-volume) && launch-type == 1 && validation-category == 1
Parent Constraint: is-init-proc
(on-authorized-authapfs-volume || on-system-volume)
: Lazima iwe katika System au Cryptexes volume.launch-type == 1
: Lazima iwe huduma ya mfumo (plist katika LaunchDaemons).validation-category == 1
: Kifaa cha mfumo wa uendeshaji.is-init-proc
: Launchd
Kurejesha LC Categories
Una habari zaidi kuhusu hii hapa, lakini kimsingi, Zimewekwa katika AMFI (AppleMobileFileIntegrity), hivyo unahitaji kupakua Kernel Development Kit ili kupata KEXT. Alama zinazohusiana na kConstraintCategory
ndizo za kuvutia. Ukizitoa utapata mstream wa DER (ASN.1) uliokodishwa ambao utahitaji kufasiriwa kwa ASN.1 Decoder au maktaba ya python-asn1 na skripti yake ya dump.py
, andrivet/python-asn1 ambayo itakupa mfuatano unaoeleweka zaidi.
Mipaka ya Mazingira
Hizi ni Mipaka za Uzinduzi zilizowekwa katika maombi ya wahusika wengine. Mwandishi anaweza kuchagua ukweli na operands za kimantiki kutumia katika maombi yake ili kuzuia ufikiaji kwake mwenyewe.
Inawezekana kuhesabu Mipaka ya Mazingira ya programu kwa:
codesign -d -vvvv app.app
Trust Caches
Katika macOS kuna baadhi ya hifadhi za kuaminika:
/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4
/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4
/System/Library/Security/OSLaunchPolicyData
Na katika iOS inaonekana kama iko katika /usr/standalone/firmware/FUD/StaticTrustCache.img4
.
warning
Katika macOS inayotumia vifaa vya Apple Silicon, ikiwa binary iliyosainiwa na Apple haipo katika hifadhi ya kuaminika, AMFI itakataa kuipakia.
Enumerating Trust Caches
Faili za awali za hifadhi za kuaminika ziko katika muundo IMG4 na IM4P, ambapo IM4P ni sehemu ya mzigo ya muundo wa IMG4.
Unaweza kutumia pyimg4 kutoa mzigo wa databasi:
# Installation
python3 -m pip install pyimg4
# Extract payloads data
cp /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4 /tmp
pyimg4 img4 extract -i /tmp/BaseSystemTrustCache.img4 -p /tmp/BaseSystemTrustCache.im4p
pyimg4 im4p extract -i /tmp/BaseSystemTrustCache.im4p -o /tmp/BaseSystemTrustCache.data
cp /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4 /tmp
pyimg4 img4 extract -i /tmp/StaticTrustCache.img4 -p /tmp/StaticTrustCache.im4p
pyimg4 im4p extract -i /tmp/StaticTrustCache.im4p -o /tmp/StaticTrustCache.data
pyimg4 im4p extract -i /System/Library/Security/OSLaunchPolicyData -o /tmp/OSLaunchPolicyData.data
(Chaguo lingine linaweza kuwa kutumia chombo img4tool, ambacho kitafanya kazi hata kwenye M1 hata kama toleo ni la zamani na kwa x86_64 ikiwa utaweka katika maeneo sahihi).
Sasa unaweza kutumia chombo trustcache kupata taarifa katika muundo unaoweza kusomeka:
# Install
wget https://github.com/CRKatri/trustcache/releases/download/v2.0/trustcache_macos_arm64
sudo mv ./trustcache_macos_arm64 /usr/local/bin/trustcache
xattr -rc /usr/local/bin/trustcache
chmod +x /usr/local/bin/trustcache
# Run
trustcache info /tmp/OSLaunchPolicyData.data | head
trustcache info /tmp/StaticTrustCache.data | head
trustcache info /tmp/BaseSystemTrustCache.data | head
version = 2
uuid = 35EB5284-FD1E-4A5A-9EFB-4F79402BA6C0
entry count = 969
0065fc3204c9f0765049b82022e4aa5b44f3a9c8 [none] [2] [1]
00aab02b28f99a5da9b267910177c09a9bf488a2 [none] [2] [1]
0186a480beeee93050c6c4699520706729b63eff [none] [2] [2]
0191be4c08426793ff3658ee59138e70441fc98a [none] [2] [3]
01b57a71112235fc6241194058cea5c2c7be3eb1 [none] [2] [2]
01e6934cb8833314ea29640c3f633d740fc187f2 [none] [2] [2]
020bf8c388deaef2740d98223f3d2238b08bab56 [none] [2] [3]
Kikundi cha kuaminika kinafuata muundo ufuatao, hivyo kategoria ya LC ni safu ya 4.
struct trust_cache_entry2 {
uint8_t cdhash[CS_CDHASH_LEN];
uint8_t hash_type;
uint8_t flags;
uint8_t constraintCategory;
uint8_t reserved0;
} __attribute__((__packed__));
Kisha, unaweza kutumia skripti kama hii kutoa data.
Kutoka kwenye data hiyo unaweza kuangalia Apps zenye thamani ya vizuizi vya uzinduzi 0
, ambazo ndizo ambazo hazijakabiliwa (angalia hapa kwa kila thamani ni nini).
Kupunguza Mashambulizi
Vizuizi vya Uzinduzi vingepunguza mashambulizi kadhaa ya zamani kwa kuthibitisha kwamba mchakato hautatekelezwa katika hali zisizotarajiwa: Kwa mfano kutoka maeneo yasiyotarajiwa au kuanzishwa na mchakato wa mzazi asiyejulikana (ikiwa uzinduzi wa launchd pekee unapaswa kuanzisha).
Zaidi ya hayo, Vizuizi vya Uzinduzi pia vinapunguza mashambulizi ya kushuka daraja.
Hata hivyo, havipunguzi matumizi ya kawaida ya XPC, Electron kuingiza msimbo au kuingiza dylib bila uthibitisho wa maktaba (isipokuwa vitambulisho vya timu vinavyoweza kupakia maktaba vinajulikana).
Ulinzi wa XPC Daemon
Katika toleo la Sonoma, jambo muhimu ni mipangilio ya wajibu ya huduma ya XPC daemon. Huduma ya XPC inawajibika kwa ajili yake mwenyewe, tofauti na mteja anayounganisha kuwa na wajibu. Hii imeandikwa katika ripoti ya maoni FB13206884. Mpangilio huu unaweza kuonekana kuwa na kasoro, kwani unaruhusu mwingiliano fulani na huduma ya XPC:
- Kuzindua Huduma ya XPC: Ikiwa inachukuliwa kuwa hitilafu, mpangilio huu haukuruhusu kuanzisha huduma ya XPC kupitia msimbo wa mshambuliaji.
- Kuungana na Huduma Inayoendelea: Ikiwa huduma ya XPC tayari inaendesha (inaweza kuwa imewezeshwa na programu yake ya asili), hakuna vizuizi vya kuungana nayo.
Wakati wa kutekeleza vizuizi kwenye huduma ya XPC kunaweza kuwa na manufaa kwa kupunguza dirisha la mashambulizi yanayoweza kutokea, haishughuliki wasiwasi wa msingi. Kuthibitisha usalama wa huduma ya XPC kimsingi kunahitaji kuthibitisha mteja anayounganisha kwa ufanisi. Hii inabaki kuwa njia pekee ya kuimarisha usalama wa huduma hiyo. Pia, inafaa kutaja kwamba mpangilio wa wajibu ulioelezwa kwa sasa unafanya kazi, ambayo huenda isiendane na muundo ulio kusudiwa.
Ulinzi wa Electron
Hata kama inahitajika kwamba programu lazima ifunguliwe na LaunchService (katika vizuizi vya wazazi). Hii inaweza kufikiwa kwa kutumia open
(ambayo inaweza kuweka mabadiliko ya mazingira) au kutumia Launch Services API (ambapo mabadiliko ya mazingira yanaweza kuonyeshwa).
Marejeleo
- https://youtu.be/f1HA5QhLQ7Y?t=24146
- https://theevilbit.github.io/posts/launch_constraints_deep_dive/
- https://eclecticlight.co/2023/06/13/why-wont-a-system-app-or-command-tool-run-launch-constraints-and-trust-caches/
- https://developer.apple.com/videos/play/wwdc2023/10266/
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.