macOS MACF - Mandatory Access Control Framework
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)
MACF inamaanisha Mandatory Access Control Framework, ambayo ni mfumo wa usalama uliojengwa ndani ya mfumo wa uendeshaji kusaidia kulinda kompyuta yako. Inafanya kazi kwa kuweka kanuni kali kuhusu nani au nini kinaweza kufikia sehemu fulani za mfumo, kama vile faili, programu, na rasilimali za mfumo. Kwa kutekeleza kanuni hizi kiotomatiki, MACF inahakikisha kwamba ni watumiaji na michakato walioidhinishwa pekee wanaweza kufanya vitendo maalum, kupunguza hatari ya ufikiaji usioidhinishwa au shughuli mbaya.
Kumbuka kwamba MACF haifanyi maamuzi yoyote kwani inachukua tu hatua, inawaachia maamuzi moduli za sera (kernel extensions) inazopiga simu kama AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
, TMSafetyNet.kext
na mcxalr.kext
.
Mchakato unafanya syscall/mach trap
Kazi husika inaitwa ndani ya kernel
Kazi inaita MACF
MACF inakagua moduli za sera ambazo zilitaka kuunganisha kazi hiyo katika sera zao
MACF inaita sera husika
Sera zinaonyesha kama zinaruhusu au kukataa hatua hiyo
Apple ndiye pekee anayeweza kutumia MAC Framework KPI.
MACF inatumia labels ambazo kisha sera zinakagua kama zinapaswa kutoa ufikiaji fulani au la. Kanuni ya kutangaza muundo wa labels inaweza kupatikana hapa, ambayo kisha inatumika ndani ya struct ucred
hapa katika sehemu ya cr_label
. Label ina bendera na nambari ya slots ambazo zinaweza kutumika na sera za MACF kutoa viashiria. Kwa mfano, Sanbox itakuwa na kiashiria cha wasifu wa kontena.
Sera ya MACF inafafanua kanuni na masharti yanayopaswa kutumika katika operesheni fulani za kernel.
Kupanua kernel kunaweza kuunda muundo wa mac_policy_conf
kisha kujiandikisha kwa kuita mac_policy_register
. Kutoka hapa:
Ni rahisi kubaini nyongeza za kernel zinazokamilisha sera hizi kwa kuangalia simu za mac_policy_register
. Zaidi ya hayo, kuangalia disassemble ya nyongeza pia inawezekana kupata muundo wa mac_policy_conf
unaotumika.
Kumbuka kwamba sera za MACF zinaweza kuandikishwa na kufutwa pia kitaalamu.
Moja ya maeneo makuu ya mac_policy_conf
ni mpc_ops
. Huu ni uwanja unaoeleza ni shughuli zipi sera inavutiwa nazo. Kumbuka kwamba kuna mamia yao, hivyo inawezekana kuweka sifuri zote kisha kuchagua zile tu ambazo sera inavutiwa nazo. Kutoka hapa:
Almost all the hooks will be called back by MACF when one of those operations are intercepted. However, mpo_policy_*
hooks are an exception because mpo_hook_policy_init()
is a callback called upon registration (so after mac_policy_register()
) and mpo_hook_policy_initbsd()
is called during late registration once the BSD subsystem has initialised properly.
Moreover, the mpo_policy_syscall
hook can be registered by any kext to expose a private ioctl style call interface. Then, a user client will be able to call mac_syscall
(#381) specifying as parameters the policy name with an integer code and optional arguments.
For example, the Sandbox.kext
uses this a lot.
Checking the kext's __DATA.__const*
is possible to identify the mac_policy_ops
structure used when registering the policy. It's possible to find it because its pointer is at an offset inside mpo_policy_conf
and also because the amount of NULL pointers that will be in that area.
Moreover, it's also possible to get the list of kexts that have configured a policy by dumping from memory the struct _mac_policy_list
which is updated with every policy that is registered.
MACF inaanzishwa mapema sana. Inapangwa katika bootstrap_thread
ya XNU: baada ya ipc_bootstrap
wito wa mac_policy_init()
ambayo inaanzisha mac_policy_list
na muda mfupi baadaye mac_policy_initmach()
inaitwa. Miongoni mwa mambo mengine, kazi hii itapata kexts zote za Apple zenye ufunguo wa AppleSecurityExtension
katika Info.plist yao kama vile ALF.kext
, AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
na TMSafetyNet.kext
na kuzipakia.
Ni kawaida kupata wito kwa MACF ulioainishwa katika msimbo kama: #if CONFIG_MAC
vizuizi vya masharti. Aidha, ndani ya vizuizi hivi inawezekana kupata wito kwa mac_proc_check*
ambayo inaita MACF ili kuangalia ruhusa za kutekeleza vitendo fulani. Aidha, muundo wa wito wa MACF ni: mac_<object>_<opType>_opName
.
Kitu ni kimoja kati ya yafuatayo: bpfdesc
, cred
, file
, proc
, vnode
, mount
, devfs
, ifnet
, inpcb
, mbuf
, ipq
, pipe
, sysv[msg/msq/shm/sem]
, posix[shm/sem]
, socket
, kext
.
opType
kwa kawaida ni check ambayo itatumika kuruhusu au kukataa kitendo. Hata hivyo, pia inawezekana kupata notify
, ambayo itaruhusu kext kujibu kitendo kilichotolewa.
You can find an example in https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621:
Then, it's possible to find the code of mac_file_check_mmap
in https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174
Ambayo inaita macro ya MAC_CHECK
, ambayo msimbo wake unaweza kupatikana katika https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261
Ambayo itapitia sera zote za mac zilizorekodiwa ikitumia kazi zao na kuhifadhi matokeo ndani ya mabadiliko ya makosa, ambayo yanaweza kubadilishwa tu na mac_error_select
kwa nambari za mafanikio hivyo ikiwa ukaguzi wowote unashindwa ukaguzi kamili utashindwa na hatua haitaruhusiwa.
Hata hivyo, kumbuka kwamba si kila kito cha MACF kinatumika tu kukataa hatua. Kwa mfano, mac_priv_grant
inaita macro MAC_GRANT, ambayo itatoa kibali kilichohitajika ikiwa sera yoyote itajibu kwa 0:
Hizi callas zinakusudia kuangalia na kutoa (mifumo ya) privileges zilizofafanuliwa katika bsd/sys/priv.h.
Baadhi ya msimbo wa kernel utaita priv_check_cred()
kutoka bsd/kern/kern_priv.c kwa kutumia KAuth credentials za mchakato na moja ya msimbo wa privileges ambayo itaita mac_priv_check
ili kuona kama sera yoyote inasitisha kutoa ile privilege na kisha inaita mac_priv_grant
ili kuona kama sera yoyote inatoa privilege
.
Hii hook inaruhusu kukamata simu zote za mfumo. Katika bsd/dev/[i386|arm]/systemcalls.c
inawezekana kuona kazi iliyoelezwa unix_syscall
, ambayo ina msimbo huu:
Ambayo itakagua katika mchakato unaoitwa bitmask ikiwa syscall ya sasa inapaswa kuita mac_proc_check_syscall_unix
. Hii ni kwa sababu syscalls zinaitwa mara nyingi sana kwamba ni muhimu kuepuka kuita mac_proc_check_syscall_unix
kila wakati.
Kumbuka kwamba kazi proc_set_syscall_filter_mask()
, ambayo huweka bitmask syscalls katika mchakato inaitwa na Sandbox kuweka masks kwenye mchakato zilizowekwa kwenye sandbox.
Inawezekana kuingiliana na MACF kupitia baadhi ya syscalls zilizofafanuliwa katika security/mac.h:
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)