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 beleids gebruik 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 beleids gebruik kan word om wysigers toe te ken. Byvoorbeeld, Sanbox sal na die houerprofiel wys.
'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. Moreover, inside these blocks it's possible to find calls to mac_proc_check*
which calls MACF to check for permissions to perform certain actions. Moreover, the format of the MACF callouts is: mac_<object>_<opType>_opName
.
The object is one of the following: bpfdesc
, cred
, file
, proc
, vnode
, mount
, devfs
, ifnet
, inpcb
, mbuf
, ipq
, pipe
, sysv[msg/msq/shm/sem]
, posix[shm/sem]
, socket
, kext
.
The opType
is usually check which will be used to allow or deny the action. However, it's also possible to find notify
, which will allow the kext to react to the given action.
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 foutvariabele stoor, wat slegs deur mac_error_select
oorruilbaar sal wees deur sukses kodes, so as enige toets misluk, sal die volledige toets misluk en die aksie nie toegelaat word nie.
Onthou egter 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 sou 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
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 vermy om mac_proc_check_syscall_unix
elke keer aan te roep.
Let daarop dat die funksie proc_set_syscall_filter_mask()
, wat die bitmask syscalls in 'n proses stel, deur Sandbox aangeroep word om masks 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)