macOS MACF - Mandatory Access Control Framework
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
MACF staan vir Verpligte Toegang Beheer Raamwerk, wat 'n sekuriteitstelsel is wat in die bedryfstelsel ingebou is om jou rekenaar te help beskerm. Dit werk deur strenge reëls op te stel oor wie of wat toegang tot sekere dele van die stelsel kan hê, soos lêers, toepassings en stelselhulpbronne. Deur hierdie reëls outomaties af te dwing, verseker MACF dat slegs gemagtigde gebruikers en prosesse spesifieke aksies kan uitvoer, wat die risiko van ongemagtigde toegang of kwaadwillige aktiwiteite verminder.
Let daarop dat MACF nie werklik enige besluite neem nie, aangesien dit net aksies onderskep, dit laat die besluite aan die beleidsmodules (kernuitbreidings) wat dit aanroep soos AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
, TMSafetyNet.kext
en mcxalr.kext
.
Proses voer 'n syscall/mach trap uit
Die relevante funksie word binne die kern aangeroep
Funksie roep MACF aan
MACF kontroleer beleidsmodules wat versoek het om daardie funksie in hul beleid te haak
MACF roep die relevante beleids aan
Beleide dui aan of hulle die aksie toelaat of weier
Apple is die enigste wat die MAC Framework KPI kan gebruik.
MACF gebruik etikette wat dan deur die beleide gebruik sal word om te kontroleer of hulle sekere toegang moet toestaan of nie. Die kode van die etikette struktuurdeklarasie kan hier gevind word, wat dan binne die struct ucred
in hier in die cr_label
deel gebruik word. Die etiket bevat vlae en 'n aantal slots wat deur MACF beleide gebruik kan word om wysigers toe te ken. Byvoorbeeld, Sanbox sal na die houerprofiel verwys.
'n MACF Beleid definieer reëls en voorwaardes wat in sekere kernoperasies toegepas moet word.
'n Kernuitbreiding kan 'n mac_policy_conf
struktuur konfigureer en dit dan registreer deur mac_policy_register
aan te roep. Van hier:
Dit is maklik om die kernuitbreidings wat hierdie beleide konfigureer te identifiseer deur oproepe na mac_policy_register
te kontroleer. Boonop, deur die ontbinding van die uitbreiding te kontroleer, is dit ook moontlik om die gebruikte mac_policy_conf
struktuur te vind.
Let daarop dat MACF beleide ook dynamies geregistreer en ongeregistreer kan word.
Een van die hoofvelde van die mac_policy_conf
is die mpc_ops
. Hierdie veld spesifiseer watter operasies die beleid belangrik vind. Let daarop dat daar honderde daarvan is, so dit is moontlik om al hulle op nul te stel en dan net diegene te kies waarin die beleid belangstel. Van hier:
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 word baie vroeg geïnitialiseer. Dit word opgestel in XNU se bootstrap_thread
: na ipc_bootstrap
'n oproep na mac_policy_init()
wat die mac_policy_list
initaliseer en 'n oomblik later word mac_policy_initmach()
aangeroep. Onder andere dinge, sal hierdie funksie al die Apple kexts met die AppleSecurityExtension
sleutel in hul Info.plist soos ALF.kext
, AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
en TMSafetyNet.kext
kry en laai.
Dit is algemeen om oproepe na MACF te vind wat in kode gedefinieer is soos: #if CONFIG_MAC
voorwaardelike blokke. Bovendien, binne hierdie blokke is dit moontlik om oproepe na mac_proc_check*
te vind wat MACF aanroep om toestemmings te kontroleer om sekere aksies uit te voer. Boonop is die formaat van die MACF oproepe: mac_<object>_<opType>_opName
.
Die objek is een van die volgende: bpfdesc
, cred
, file
, proc
, vnode
, mount
, devfs
, ifnet
, inpcb
, mbuf
, ipq
, pipe
, sysv[msg/msq/shm/sem]
, posix[shm/sem]
, socket
, kext
.
Die opType
is gewoonlik check wat gebruik sal word om die aksie toe te laat of te weier. Dit is egter ook moontlik om notify
te vind, wat die kext sal toelaat om op die gegewe aksie te reageer.
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
Wat die MAC_CHECK
makro aanroep, waarvan die kode gevind kan word in https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261
Wat al die geregistreerde mac-beleide sal deurgaan, hul funksies aanroep en die uitvoer binne die fout veranderlike stoor, wat slegs deur mac_error_select
oorruilbaar sal wees deur sukses kodes, sodat as enige toets misluk, die volledige toets sal misluk en die aksie nie toegelaat sal word nie.
Maar, onthou dat nie alle MACF-aanroepings slegs gebruik word om aksies te weier nie. Byvoorbeeld, mac_priv_grant
roep die makro MAC_GRANT aan, wat die aangevraagde voorreg sal toeken as enige beleid met 'n 0 antwoordgee:
Hierdie aanroepe is bedoel om (tens of) privileges te kontroleer en te verskaf soos gedefinieer in bsd/sys/priv.h.
Sommige kernkode sal priv_check_cred()
aanroep vanaf bsd/kern/kern_priv.c met die KAuth geloofsbriewe van die proses en een van die privileges kode wat mac_priv_check
sal aanroep om te sien of enige beleid weier om die privilege te gee en dan roep dit mac_priv_grant
aan om te sien of enige beleid die privilege
toeken.
Hierdie haak laat toe om alle stelselaanroepe te onderskep. In bsd/dev/[i386|arm]/systemcalls.c
is dit moontlik om die verklaarde funksie unix_syscall
te sien, wat hierdie kode bevat:
Welke sal die oproepende proses bitmask nagaan of die huidige syscall mac_proc_check_syscall_unix
moet aanroep. Dit is omdat syscalls so gereeld aangeroep word dat dit interessant is om te probeer om mac_proc_check_syscall_unix
nie elke keer aan te roep nie.
Let daarop dat die funksie proc_set_syscall_filter_mask()
, wat die bitmask syscalls in 'n proses stel, deur Sandbox aangeroep word om maskers op gesandboksde prosesse te stel.
Dit is moontlik om met MACF te kommunikeer deur sommige syscalls wat in security/mac.h gedefinieer is:
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)