macOS XPC
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
XPC, ambayo inasimama kwa XNU (kernel inayotumiwa na macOS) mawasiliano kati ya Mchakato, ni mfumo wa mawasiliano kati ya michakato kwenye macOS na iOS. XPC inatoa mekanizma ya kufanya kuitana kwa njia salama, zisizo za moja kwa moja kati ya michakato tofauti kwenye mfumo. Ni sehemu ya mtindo wa usalama wa Apple, ikiruhusu kuundwa kwa programu zenye mamlaka tofauti ambapo kila kipengele kinakimbia na idhini tu inazohitaji kufanya kazi yake, hivyo kupunguza uharibifu unaoweza kutokea kutokana na mchakato ulioathirika.
XPC inatumia aina ya Mawasiliano kati ya Mchakato (IPC), ambayo ni seti ya mbinu za programu tofauti zinazokimbia kwenye mfumo mmoja kutuma data mbele na nyuma.
Faida kuu za XPC ni pamoja na:
Usalama: Kwa kutenganisha kazi katika michakato tofauti, kila mchakato unaweza kupewa tu idhini inazohitaji. Hii inamaanisha kwamba hata kama mchakato umeathirika, ina uwezo mdogo wa kufanya madhara.
Utulivu: XPC husaidia kutenga ajali kwenye kipengele ambapo zinatokea. Ikiwa mchakato utaanguka, unaweza kuanzishwa tena bila kuathiri mfumo mzima.
Utendaji: XPC inaruhusu urahisi wa ushirikiano, kwani kazi tofauti zinaweza kufanywa kwa wakati mmoja katika michakato tofauti.
Hasara pekee ni kwamba kutenganisha programu katika michakato kadhaa na kuwafanya komunikate kupitia XPC ni chini ya ufanisi. Lakini katika mifumo ya leo hii haionekani sana na faida ni bora.
Vipengele vya XPC vya programu viko ndani ya programu yenyewe. Kwa mfano, katika Safari unaweza kuvikuta katika /Applications/Safari.app/Contents/XPCServices
. Vina kiendelezi .xpc
(kama com.apple.Safari.SandboxBroker.xpc
) na pia ni bundles na binary kuu ndani yake: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker
na Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Kama unavyoweza kufikiria, kipengele cha XPC kitakuwa na idhini na mamlaka tofauti na vipengele vingine vya XPC au binary kuu ya programu. ISIPOKUWA huduma ya XPC imewekwa na JoinExistingSession iliyowekwa kuwa “True” katika faili yake ya Info.plist. Katika kesi hii, huduma ya XPC itakimbia katika sehemu moja ya usalama kama programu iliyoiita.
Huduma za XPC zinaanzishwa na launchd inapohitajika na zinaz shutdown mara zote kazi zote zitakapokamilika ili kuachilia rasilimali za mfumo. Vipengele vya XPC vya programu vinaweza kutumiwa tu na programu, hivyo kupunguza hatari inayohusiana na udhaifu unaoweza kutokea.
Huduma za XPC za mfumo mzima zinapatikana kwa watumiaji wote. Huduma hizi, ama launchd au aina ya Mach, zinahitaji kuwa zimefafanuliwa katika faili za plist zilizoko katika directories maalum kama /System/Library/LaunchDaemons
, /Library/LaunchDaemons
, /System/Library/LaunchAgents
, au /Library/LaunchAgents
.
Faili hizi za plists zitakuwa na ufunguo unaoitwa MachServices
wenye jina la huduma, na ufunguo unaoitwa Program
wenye njia ya binary:
The ones in LaunchDameons
are run by root. So if an unprivileged process can talk with one of these it could be able to escalate privileges.
xpc_object_t
Kila ujumbe wa XPC ni kitu cha kamusi ambacho kinarahisisha serialization na deserialization. Zaidi ya hayo, libxpc.dylib
inatangaza aina nyingi za data hivyo inawezekana kuhakikisha kuwa data iliyopokelewa ni ya aina inayotarajiwa. Katika API ya C kila kitu ni xpc_object_t
(na aina yake inaweza kuangaliwa kwa kutumia xpc_get_type(object)
).
Zaidi ya hayo, kazi xpc_copy_description(object)
inaweza kutumika kupata uwakilishi wa mfuatano wa kitu ambacho kinaweza kuwa na manufaa kwa madhumuni ya urekebishaji.
Vitu hivi pia vina baadhi ya mbinu za kuita kama xpc_<object>_copy
, xpc_<object>_equal
, xpc_<object>_hash
, xpc_<object>_serialize
, xpc_<object>_deserialize
...
xpc_object_t
zinaundwa kwa kuita kazi xpc_<objetType>_create
, ambayo ndani inaita _xpc_base_create(Class, Size)
ambapo inaonyeshwa aina ya darasa la kitu (moja ya XPC_TYPE_*
) na ukubwa wake (B 40 za ziada zitaongezwa kwenye ukubwa kwa metadata). Hii inamaanisha kuwa data ya kitu itaanza kwenye ofset B 40.
Kwa hivyo, xpc_<objectType>_t
ni aina ya subclass ya xpc_object_t
ambayo itakuwa subclass ya os_object_t*
.
Kumbuka kwamba inapaswa kuwa mbunifu anayetumia xpc_dictionary_[get/set]_<objectType>
kupata au kuweka aina na thamani halisi ya funguo.
xpc_pipe
xpc_pipe
ni bomba la FIFO ambalo michakato inaweza kutumia kuwasiliana (mawasiliano hutumia ujumbe wa Mach).
Inawezekana kuunda seva ya XPC kwa kuita xpc_pipe_create()
au xpc_pipe_create_from_port()
ili kuunda kwa kutumia bandari maalum ya Mach. Kisha, kupokea ujumbe inawezekana kuita xpc_pipe_receive
na xpc_pipe_try_receive
.
Kumbuka kwamba kitu cha xpc_pipe
ni xpc_object_t
chenye taarifa katika muundo wake kuhusu bandari mbili za Mach zinazotumika na jina (ikiwa ipo). Jina, kwa mfano, daemon secinitd
katika plist yake /System/Library/LaunchDaemons/com.apple.secinitd.plist
inakamilisha bomba linaloitwa com.apple.secinitd
.
Mfano wa xpc_pipe
ni bootstrap pipe iliyoundwa na launchd
ikifanya iwezekane kushiriki bandari za Mach.
NSXPC*
Hizi ni vitu vya kiwango cha juu vya Objective-C ambavyo vinaruhusu ubunifu wa muunganisho wa XPC. Zaidi ya hayo, ni rahisi kurekebisha vitu hivi na DTrace kuliko zile za awali.
GCD Queues
XPC inatumia GCD kupitisha ujumbe, zaidi ya hayo inazalisha foleni fulani za dispatch kama xpc.transactionq
, xpc.io
, xpc-events.add-listenerq
, xpc.service-instance
...
Hizi ni bundles zenye kiendelezi .xpc
zilizoko ndani ya folda ya XPCServices
ya miradi mingine na katika Info.plist
zina CFBundlePackageType
iliyowekwa kuwa XPC!
.
Faili hii ina funguo zingine za usanidi kama ServiceType
ambayo inaweza kuwa Application, User, System au _SandboxProfile
ambayo inaweza kufafanua sandbox au _AllowedClients
ambayo inaweza kuashiria haki au ID inayohitajika kuwasiliana na seva. hizi na chaguzi zingine za usanidi zitakuwa na manufaa kuunda huduma wakati inazinduliwa.
Programu inajaribu kuungana na huduma ya XPC kwa kutumia xpc_connection_create_mach_service
, kisha launchd inapata daemon na kuanzisha xpcproxy
. xpcproxy
inatekeleza vizuizi vilivyowekwa na inazalisha huduma hiyo kwa FDs na bandari za Mach zilizotolewa.
Ili kuboresha kasi ya kutafuta huduma ya XPC, cache inatumika.
Inawezekana kufuatilia vitendo vya xpcproxy
kwa kutumia:
The XPC library inatumia kdebug
kurekodi vitendo vinavyopiga xpc_ktrace_pid0
na xpc_ktrace_pid1
. Mifumo inayotumika haijaandikwa, hivyo inahitajika kuiongeza kwenye /usr/share/misc/trace.codes
. Zina kiambishi 0x29
na kwa mfano moja ni 0x29000004
: XPC_serializer_pack
.
Kifaa xpcproxy
kinatumia kiambishi 0x22
, kwa mfano: 0x2200001c: xpcproxy:will_do_preexec
.
Programu zinaweza kujiandikisha kwa ujumbe tofauti wa matukio, na kuwapa uwezo wa kuanzishwa kwa mahitaji wakati matukio kama hayo yanapotokea. Mipangilio ya huduma hizi inafanywa katika faili za plist za launchd, zilizoko katika directories sawa na zile za awali na zinafunguo ya ziada LaunchEvent
.
Wakati mchakato unajaribu kupiga simu kwa njia ya XPC, huduma ya XPC inapaswa kuangalia kama mchakato huo unaruhusiwa kuungana. Hapa kuna njia za kawaida za kuangalia hiyo na mtego wa kawaida:
macOS XPC Connecting Process CheckApple pia inaruhusu programu kuweka haki fulani na jinsi ya kuzipata hivyo ikiwa mchakato unaopiga simu una hizo itaruhusiwa kupiga simu kwa njia kutoka huduma ya XPC:
macOS XPC AuthorizationIli kunasa ujumbe wa XPC unaweza kutumia xpcspy ambayo inatumia Frida.
Another possible tool to use is XPoCe2.
Hii kazi inayotolewa na RemoteXPC.framework
(kutoka libxpc
) inaruhusu kuwasiliana kupitia XPC kati ya mwenyeji tofauti.
Huduma zinazounga mkono remote XPC zitakuwa na katika plist yao ufunguo UsesRemoteXPC kama ilivyo katika /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist
. Hata hivyo, ingawa huduma itasajiliwa na launchd
, ni UserEventAgent
pamoja na plugins com.apple.remoted.plugin
na com.apple.remoteservicediscovery.events.plugin
ambazo zinatoa kazi hiyo.
Zaidi ya hayo, RemoteServiceDiscovery.framework
inaruhusu kupata taarifa kutoka kwa com.apple.remoted.plugin
ikionyesha kazi kama get_device
, get_unique_device
, connect
...
Mara tu connect
inapotumika na soketi fd
ya huduma inakusanywa, inawezekana kutumia darasa la remote_xpc_connection_*
.
Inawezekana kupata taarifa kuhusu huduma za mbali kwa kutumia zana ya cli /usr/libexec/remotectl
kwa kutumia vigezo kama:
Mawasiliano kati ya BridgeOS na mwenyeji hufanyika kupitia kiunganishi maalum cha IPv6. MultiverseSupport.framework
inaruhusu kuanzisha soketi ambazo fd
zitatumika kwa mawasiliano.
Inawezekana kupata mawasiliano haya kwa kutumia netstat
, nettop
au chaguo la chanzo wazi, netbottom
.
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)