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, Zorunlu Erişim Kontrol Çerçevesi anlamına gelir ve bilgisayarınızı korumaya yardımcı olmak için işletim sistemine entegre edilmiş bir güvenlik sistemidir. Belirli sistem bölümlerine, dosyalara, uygulamalara ve sistem kaynaklarına kimlerin veya nelerin erişebileceği konusunda katı kurallar belirleyerek çalışır. Bu kuralları otomatik olarak uygulayarak, MACF yalnızca yetkilendirilmiş kullanıcıların ve süreçlerin belirli eylemleri gerçekleştirmesine izin verir, yetkisiz erişim veya kötü niyetli faaliyetler riskini azaltır.
MACF'nin gerçekten herhangi bir karar vermediğini, yalnızca eylemleri yakaladığını ve kararları çağırdığı politika modüllerine (kernel uzantıları) bıraktığını unutmayın; bunlar arasında AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
, TMSafetyNet.kext
ve mcxalr.kext
bulunmaktadır.
Süreç bir syscall/mach tuzağı gerçekleştirir
İlgili işlev çekirdek içinde çağrılır
İşlev MACF'yi çağırır
MACF, o işlevi politikalarına bağlamak için talep eden politika modüllerini kontrol eder
MACF, ilgili politikaları çağırır
Politikalar, eylemi izin verip vermeyeceklerini belirtir
Apple, MAC Framework KPI'sini kullanabilen tek kişidir.
MACF, ardından politikaların bazı erişim izni verip vermeyeceğini kontrol edeceği etiketler kullanır. Etiketlerin yapı tanımının kodu burada bulunabilir; bu, struct ucred
içinde burada cr_label
kısmında kullanılır. Etiket, MACF politikalarının işaretçi ayırması için kullanabileceği bayraklar ve bir dizi slot içerir. Örneğin, Sandbox konteyner profilini işaret edecektir.
Bir MACF Politikası, belirli çekirdek işlemlerinde uygulanacak kural ve koşulları tanımlar.
Bir çekirdek uzantısı, bir mac_policy_conf
yapısını yapılandırabilir ve ardından mac_policy_register
çağrısını yaparak kaydedebilir. Buradan:
Kernel uzantılarını bu politikaları yapılandırırken tanımlamak, mac_policy_register
çağrılarına bakarak kolaydır. Ayrıca, uzantının ayrıştırmasını kontrol ederek kullanılan mac_policy_conf
yapısını bulmak da mümkündür.
MACF politikalarının dinamik olarak kaydedilebileceğini ve kaydının kaldırılabileceğini unutmayın.
mac_policy_conf
'nin ana alanlarından biri mpc_ops
'dir. Bu alan, politikanın ilgilendiği işlemleri belirtir. Bunların yüzlercesi olduğunu unutmayın, bu nedenle hepsini sıfırlamak ve ardından politikanın ilgilendiği yalnızca belirli olanları seçmek mümkündür. Buradan:
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 çok kısa bir süre içinde başlatılır. XNU'nun bootstrap_thread
'inde ayarlanır: ipc_bootstrap
'tan sonra mac_policy_init()
çağrısı yapılır, bu da mac_policy_list
'i başlatır ve kısa bir süre sonra mac_policy_initmach()
çağrılır. Bu fonksiyon, Info.plist
'lerinde AppleSecurityExtension
anahtarına sahip tüm Apple kext'lerini alır, örneğin ALF.kext
, AppleMobileFileIntegrity.kext
, Quarantine.kext
, Sandbox.kext
ve TMSafetyNet.kext
ve bunları yükler.
MACF'ye yapılan çağrıları #if CONFIG_MAC
gibi kod içinde tanımlanmış bloklarda bulmak yaygındır. Ayrıca, bu blokların içinde belirli eylemleri gerçekleştirmek için izinleri kontrol etmek amacıyla MACF'yi çağıran mac_proc_check*
çağrılarını bulmak mümkündür. Ayrıca, MACF çağrılarının formatı: mac_<object>_<opType>_opName
şeklindedir.
Nesne aşağıdakilerden biri olabilir: bpfdesc
, cred
, file
, proc
, vnode
, mount
, devfs
, ifnet
, inpcb
, mbuf
, ipq
, pipe
, sysv[msg/msq/shm/sem]
, posix[shm/sem]
, socket
, kext
.
opType
genellikle eylemi izin vermek veya reddetmek için kullanılacak olan kontrol anlamına gelir. Ancak, verilen eyleme tepki vermek için kext'in izin vereceği notify
'yi bulmak da mümkündür.
Bir örneği https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621 adresinde bulabilirsiniz:
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
MAC_CHECK
makrosunu çağıran, kodu https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261 adresinde bulunabilir.
Hangi, tüm kayıtlı mac politikalarını çağırarak işlevlerini çalıştıracak ve çıktıyı hata değişkeninde depolayacak, bu değişken yalnızca başarı kodları ile mac_error_select
tarafından geçersiz kılınabilir, bu nedenle herhangi bir kontrol başarısız olursa, tüm kontrol başarısız olacak ve işlem izin verilmeyecektir.
Ancak, tüm MACF çağrılarının yalnızca eylemleri reddetmek için kullanılmadığını unutmayın. Örneğin, mac_priv_grant
, herhangi bir politikanın 0 ile yanıt vermesi durumunda talep edilen ayrıcalığı verecek olan MAC_GRANT makrosunu çağırır:
Bu çağrılar, bsd/sys/priv.h dosyasında tanımlanan (onlarca) ayrıcalığı kontrol etmek ve sağlamak için tasarlanmıştır.
Bazı çekirdek kodları, sürecin KAuth kimlik bilgileri ile priv_check_cred()
çağrısını bsd/kern/kern_priv.c dosyasından yapar ve ayrıcalık kodlarından birini kullanarak mac_priv_check
çağrısını yapar; bu, herhangi bir politikanın ayrıcalığı vermeyi reddedip etmediğini kontrol eder ve ardından mac_priv_grant
çağrısını yaparak herhangi bir politikanın ayrıcalığı
verip vermediğini kontrol eder.
Bu kanca, tüm sistem çağrılarını yakalamaya olanak tanır. bsd/dev/[i386|arm]/systemcalls.c
dosyasında, bu kodu içeren tanımlı fonksiyonu unix_syscall
görebilirsiniz:
Hangi çağıran süreçte bitmask kontrol edilecektir, eğer mevcut syscall mac_proc_check_syscall_unix
çağırması gerekiyorsa. Bunun nedeni, syscalls'ın bu kadar sık çağrılmasıdır, bu yüzden her seferinde mac_proc_check_syscall_unix
çağırmaktan kaçınmak ilginçtir.
proc_set_syscall_filter_mask()
fonksiyonunun, bir süreçte bitmask syscalls'ı ayarlamak için Sandbox tarafından çağrıldığını unutmayın; bu, sandboxed süreçlerde maskeleri ayarlamak içindir.
MACF ile etkileşimde bulunmak, security/mac.h dosyasında tanımlanan bazı syscalls aracılığıyla mümkündür:
AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)