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, macOS tarafından kullanılan XNU (çekirdek) arasındaki İletişim için bir çerçevedir ve macOS ve iOS'ta işlemler arası iletişim sağlar. XPC, sistemdeki farklı işlemler arasında güvenli, asenkron yöntem çağrıları yapma mekanizması sunar. Bu, her bir bileşenin yalnızca işini yapmak için ihtiyaç duyduğu izinlerle çalıştığı ayrılmış ayrıcalıklarla uygulamaların oluşturulmasına olanak tanıyarak, tehlikeye atılmış bir işlemin potansiyel zararını sınırlamaktadır.
XPC, aynı sistemde çalışan farklı programların veri göndermesi ve alması için bir dizi yöntem olan İşlemler Arası İletişim (IPC) biçimini kullanır.
XPC'nin başlıca faydaları şunlardır:
Güvenlik: Çalışmayı farklı işlemlere ayırarak, her bir işleme yalnızca ihtiyaç duyduğu izinler verilebilir. Bu, bir işlem tehlikeye atılsa bile, zarar verme yeteneğinin sınırlı olduğu anlamına gelir.
Kararlılık: XPC, çökme durumlarını meydana geldiği bileşene izole etmeye yardımcı olur. Bir işlem çökerse, sistemin geri kalanını etkilemeden yeniden başlatılabilir.
Performans: XPC, farklı görevlerin farklı işlemlerde aynı anda çalıştırılmasına olanak tanıyarak kolay bir eşzamanlılık sağlar.
Tek dezavantaj, bir uygulamayı birkaç işleme ayırmanın ve bunların XPC aracılığıyla iletişim kurmasının daha az verimli olmasıdır. Ancak günümüz sistemlerinde bu neredeyse fark edilmez ve faydalar daha iyidir.
Bir uygulamanın XPC bileşenleri uygulamanın kendisinin içindedir. Örneğin, Safari'de bunları /Applications/Safari.app/Contents/XPCServices
dizininde bulabilirsiniz. .xpc
uzantısına sahiptirler (örneğin com.apple.Safari.SandboxBroker.xpc
) ve ana ikili dosya ile birlikte paketlenmiştir: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker
ve bir Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Bir XPC bileşeninin diğer XPC bileşenlerinden veya ana uygulama ikili dosyasından farklı haklara ve ayrıcalıklara sahip olacağını düşünebilirsiniz. EXCEPT bir XPC hizmeti, Info.plist dosyasında JoinExistingSession True olarak ayarlandığında. Bu durumda, XPC hizmeti, onu çağıran uygulama ile aynı güvenlik oturumunda çalışacaktır.
XPC hizmetleri, gerektiğinde launchd tarafından başlatılır ve tüm görevler tamamlandığında sistem kaynaklarını serbest bırakmak için kapalı tutulur. Uygulama özel XPC bileşenleri yalnızca uygulama tarafından kullanılabilir, böylece potansiyel güvenlik açıklarıyla ilişkili riski azaltır.
Sistem genelindeki XPC hizmetleri tüm kullanıcılar tarafından erişilebilir. Bu hizmetler, ya launchd ya da Mach türünde, belirli dizinlerde bulunan plist dosyalarında tanımlanmalıdır; örneğin /System/Library/LaunchDaemons
, /Library/LaunchDaemons
, /System/Library/LaunchAgents
veya /Library/LaunchAgents
.
Bu plist dosyalarında, hizmetin adıyla birlikte MachServices
adında bir anahtar ve ikili dosyanın yolunu içeren Program
adında bir anahtar bulunacaktır:
The ones in LaunchDameons
root tarafından çalıştırılır. Yani, yetkisiz bir işlem bunlardan biriyle iletişim kurabiliyorsa, yetkileri artırma olanağına sahip olabilir.
xpc_object_t
Her XPC mesajı, serileştirme ve serileştirmeyi basitleştiren bir sözlük nesnesidir. Ayrıca, libxpc.dylib
çoğu veri türünü tanımlar, bu nedenle alınan verilerin beklenen türde olması sağlanabilir. C API'sinde her nesne bir xpc_object_t
'dir (ve türü xpc_get_type(object)
kullanılarak kontrol edilebilir).
Ayrıca, xpc_copy_description(object)
fonksiyonu, hata ayıklama amaçları için yararlı olabilecek nesnenin bir dize temsilini almak için kullanılabilir.
Bu nesnelerin ayrıca xpc_<object>_copy
, xpc_<object>_equal
, xpc_<object>_hash
, xpc_<object>_serialize
, xpc_<object>_deserialize
gibi çağrılacak bazı yöntemleri vardır...
xpc_object_t
nesneleri, xpc_<objetType>_create
fonksiyonu çağrılarak oluşturulur; bu, içsel olarak _xpc_base_create(Class, Size)
fonksiyonunu çağırır ve burada nesnenin sınıf türü (bir XPC_TYPE_*
türü) ve boyutu belirtilir (metadata için ekstra 40B eklenir). Bu, nesnenin verilerinin 40B'lik bir ofsetten başlayacağı anlamına gelir.
Bu nedenle, xpc_<objectType>_t
, xpc_object_t
'nin bir alt sınıfı olan bir türdür ve bu da os_object_t*
'nin bir alt sınıfı olacaktır.
Anahtarın türünü ve gerçek değerini almak veya ayarlamak için xpc_dictionary_[get/set]_<objectType>
kullananın geliştirici olması gerektiğini unutmayın.
xpc_pipe
Bir xpc_pipe
, işlemlerin iletişim kurmak için kullanabileceği bir FIFO borusudur (iletişim Mach mesajlarını kullanır).
Bir XPC sunucusu oluşturmak için xpc_pipe_create()
veya belirli bir Mach portu kullanarak oluşturmak için xpc_pipe_create_from_port()
çağrısı yapılabilir. Ardından, mesajları almak için xpc_pipe_receive
ve xpc_pipe_try_receive
çağrıları yapılabilir.
xpc_pipe
nesnesinin, kullanılan iki Mach portu ve adı (varsa) hakkında bilgileri içeren bir xpc_object_t
olduğunu unutmayın. Örneğin, secinitd
daemon'u plist'inde /System/Library/LaunchDaemons/com.apple.secinitd.plist
boruyu com.apple.secinitd
olarak yapılandırır.
Bir xpc_pipe
örneği, launchd
tarafından oluşturulan bootstrap pipe'dır ve Mach portlarının paylaşılmasını mümkün kılar.
NSXPC*
Bunlar, XPC bağlantılarının soyutlanmasını sağlayan Objective-C yüksek seviyeli nesnelerdir. Ayrıca, bu nesneleri DTrace ile hata ayıklamak, önceki nesnelerden daha kolaydır.
GCD Kuyrukları
XPC, mesajları iletmek için GCD kullanır, ayrıca xpc.transactionq
, xpc.io
, xpc-events.add-listenerq
, xpc.service-instance
gibi belirli dağıtım kuyrukları oluşturur...
Bunlar, diğer projelerin XPCServices
klasöründe bulunan .xpc
uzantılı paketlerdir ve Info.plist
dosyasında CFBundlePackageType
XPC!
olarak ayarlanmıştır.
Bu dosya, uygulama, kullanıcı, sistem veya bir sandbox tanımlayabilen _SandboxProfile
gibi diğer yapılandırma anahtarlarına sahiptir veya hizmete erişmek için gerekli olan haklar veya kimlikleri belirtebilecek _AllowedClients
anahtarına sahiptir. Bu ve diğer yapılandırma seçenekleri, hizmet başlatıldığında yapılandırmak için yararlı olacaktır.
Uygulama, xpc_connection_create_mach_service
kullanarak bir XPC hizmetine bağlanmaya çalışır, ardından launchd daemon'u bulur ve xpcproxy
'yi başlatır. xpcproxy
, yapılandırılmış kısıtlamaları uygular ve sağlanan FD'ler ve Mach portları ile hizmeti başlatır.
XPC hizmetinin arama hızını artırmak için bir önbellek kullanılır.
xpcproxy
'nin eylemlerini izlemek mümkündür:
XPC kütüphanesi, xpc_ktrace_pid0
ve xpc_ktrace_pid1
çağrılarıyla eylemleri günlüğe kaydetmek için kdebug
kullanır. Kullandığı kodlar belgelenmemiştir, bu nedenle bunları /usr/share/misc/trace.codes
dosyasına eklemek gereklidir. 0x29
ön ekine sahiptirler ve örneğin biri 0x29000004
: XPC_serializer_pack
'dır.
xpcproxy
aracı 0x22
ön ekini kullanır, örneğin: 0x2200001c: xpcproxy:will_do_preexec
.
Uygulamalar, böyle olaylar gerçekleştiğinde isteğe bağlı olarak başlatılmalarını sağlayan farklı olay mesajlarına abone olabilirler. Bu hizmetlerin kurulumu, önceki dosyalarla aynı dizinlerde bulunan launchd plist dosyalarında yapılır ve ekstra bir LaunchEvent
anahtarı içerir.
Bir süreç, bir XPC bağlantısı aracılığıyla bir yöntemi çağırmaya çalıştığında, XPC hizmeti o sürecin bağlanmasına izin verilip verilmediğini kontrol etmelidir. Bunu kontrol etmenin yaygın yolları ve yaygın tuzaklar şunlardır:
macOS XPC Connecting Process CheckApple, uygulamaların bazı hakları yapılandırmalarına ve bunları nasıl alacaklarına izin verir, böylece çağıran süreç bu haklara sahipse, XPC hizmetinden bir yöntemi çağırmasına izin verilir:
macOS XPC AuthorizationXPC mesajlarını dinlemek için xpcspy kullanabilirsiniz, bu araç Frida kullanır.
Başka bir kullanılabilir araç XPoCe2.
RemoteXPC.framework
(from libxpc
) tarafından sağlanan bu işlevsellik, farklı ana bilgisayarlar aracılığıyla XPC ile iletişim kurmayı sağlar.
Uzaktan XPC'yi destekleyen hizmetler, plist'lerinde UsesRemoteXPC
anahtarına sahip olacaktır; bu, /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist
dosyasında olduğu gibi. Ancak, hizmet launchd
ile kaydedilmiş olsa da, işlevselliği sağlayan UserEventAgent
'dir; bu, com.apple.remoted.plugin
ve com.apple.remoteservicediscovery.events.plugin
eklentilerini içerir.
Ayrıca, RemoteServiceDiscovery.framework
, com.apple.remoted.plugin
'den bilgi almayı sağlar ve get_device
, get_unique_device
, connect
gibi işlevleri açığa çıkarır...
Bağlantı kullanıldığında ve hizmetin soket fd
'si toplandığında, remote_xpc_connection_*
sınıfı kullanılabilir.
Uzaktan hizmetler hakkında bilgi almak için /usr/libexec/remotectl
cli aracını kullanarak şu parametreler ile bilgi almak mümkündür:
BridgeOS ile ana bilgisayar arasındaki iletişim, özel bir IPv6 arayüzü üzerinden gerçekleşir. MultiverseSupport.framework
, iletişim için kullanılacak fd
'ye sahip soketlerin kurulmasına olanak tanır.
Bu iletişimleri netstat
, nettop
veya açık kaynak seçeneği netbottom
kullanarak bulmak mümkündür.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)