macOS xpc_connection_get_audit_token Saldırısı
Reading time: 8 minutes
tip
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Daha fazla bilgi için orijinal gönderiyi kontrol edin: https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/. Bu bir özet:
Mach Mesajları Temel Bilgiler
Eğer Mach Mesajlarının ne olduğunu bilmiyorsanız bu sayfayı kontrol etmeye başlayın:
macOS IPC - Inter Process Communication
Şu anda hatırlamanız gereken (buradan tanım):
Mach mesajları bir mach portu üzerinden gönderilir, bu da mach çekirdeğine entegre edilmiş tek alıcı, çoklu gönderici iletişim kanalını ifade eder. Birden fazla süreç, bir mach portuna mesaj gönderebilir, ancak herhangi bir anda yalnızca tek bir süreç ondan okuyabilir. Dosya tanımlayıcıları ve soketler gibi, mach portları çekirdek tarafından tahsis edilir ve yönetilir ve süreçler yalnızca hangi mach portlarını kullanmak istediklerini belirtmek için kullanabilecekleri bir tam sayı görürler.
XPC Bağlantısı
Eğer bir XPC bağlantısının nasıl kurulduğunu bilmiyorsanız kontrol edin:
Açıklık Özeti
Bilmeniz gereken ilginç bir şey, XPC'nin soyutlamasının bire bir bağlantı olmasıdır, ancak bu, birden fazla göndericiye sahip olabilen bir teknoloji üzerine kuruludur, bu nedenle:
- Mach portları tek alıcı, çoklu gönderici.
- Bir XPC bağlantısının denetim belirteci, en son alınan mesajdan kopyalanan denetim belirtecidir.
- Bir XPC bağlantısının denetim belirtecini elde etmek, birçok güvenlik kontrolü için kritik öneme sahiptir.
Önceki durum umut verici görünse de, bunun sorun yaratmayacağı bazı senaryolar vardır (buradan):
- Denetim belirteçleri genellikle bir bağlantıyı kabul edip etmeyeceğine karar vermek için bir yetkilendirme kontrolü için kullanılır. Bu, hizmet portuna bir mesaj gönderilerek gerçekleştiğinden, henüz bir bağlantı kurulmamıştır. Bu port üzerindeki daha fazla mesaj, yalnızca ek bağlantı talepleri olarak işlenecektir. Bu nedenle, bir bağlantıyı kabul etmeden önceki kontroller savunmasız değildir (bu,
-listener:shouldAcceptNewConnection:
içinde denetim belirtecinin güvenli olduğu anlamına gelir). Bu nedenle, belirli eylemleri doğrulayan XPC bağlantılarını arıyoruz. - XPC olay işleyicileri senkronize bir şekilde işlenir. Bu, bir mesaj için olay işleyicisinin, bir sonraki mesaj için çağrılmadan önce tamamlanması gerektiği anlamına gelir, hatta eşzamanlı dağıtım kuyruklarında bile. Bu nedenle, bir XPC olay işleyicisinde denetim belirteci diğer normal (yanıt vermeyen!) mesajlar tarafından üzerine yazılamaz.
İki farklı yöntem bu durumdan yararlanılabilir:
- Variant1:
- Sömürü A hizmetine ve B hizmetine bağlanır
- B hizmeti, kullanıcının yapamayacağı ayrılmış bir işlevselliği A hizmetinde çağırabilir
- A hizmeti, bir
dispatch_async
içinde bağlantı için olay işleyicisi içinde değil ikenxpc_connection_get_audit_token
çağrısı yapar. - Böylece, farklı bir mesaj Denetim Belirtecini üzerine yazabilir çünkü olay işleyicisi dışında asenkron olarak dağıtılmaktadır.
- Sömürü, B hizmetine A hizmetine gönderme hakkını verir.
- Böylece B hizmeti aslında A hizmetine mesajlar gönderiyor.
- Sömürü, ayrılmış eylemi çağırmaya çalışır. Bir RC'de A hizmeti, bu eylemin yetkilendirmesini kontrol ederken, B hizmeti Denetim belirtecini üzerine yazmıştır (sömürüye, ayrılmış eylemi çağırma erişimi verir).
- Variant 2:
- B hizmeti, kullanıcının yapamayacağı ayrılmış bir işlevselliği A hizmetinde çağırabilir
- Sömürü, A hizmetiyle bağlantı kurar ve yanıt bekleyen bir mesaj gönderir.
- Sömürü, B hizmetine o yanıt portunu geçerek bir mesaj gönderir.
- B hizmeti yanıt verdiğinde, A hizmetine mesaj gönderir, bu sırada sömürü, ayrılmış bir işlevselliğe ulaşmaya çalışarak A hizmetine farklı bir mesaj gönderir ve B'den gelen yanıtın Denetim belirtecini tam zamanında üzerine yazmasını bekler (Race Condition).
Variant 1: xpc_connection_get_audit_token'ı bir olay işleyicisi dışında çağırma
Senaryo:
- Bağlanabileceğimiz iki mach hizmeti
A
veB
(sandbox profiline ve bağlantıyı kabul etmeden önceki yetkilendirme kontrollerine dayanarak). - A belirli bir eylem için bir yetkilendirme kontrolüne sahip olmalıdır ki
B
bunu geçebilir (ancak uygulamamız geçemez). - Örneğin, eğer B bazı yetkilere sahipse veya root olarak çalışıyorsa, A'dan ayrılmış bir eylemi gerçekleştirmesini istemesine izin verebilir.
- Bu yetkilendirme kontrolü için,
A
, örneğindispatch_async
'danxpc_connection_get_audit_token
çağrısı yaparak denetim belirtecini asenkron olarak alır.
caution
Bu durumda bir saldırgan, A'dan bir eylem gerçekleştirmesini istemek için sömürü tetikleyebilir ve B'nin `A'ya mesajlar göndermesini sağlarken birkaç kez yapabilir. RC başarılı olduğunda, B'nin denetim belirteci bellek içinde kopyalanacak ve sömürümüzün talebi A tarafından işlenirken gerçekleşecektir, bu da yalnızca B'nin talep edebileceği ayrıcalıklı eyleme erişim sağlar.
Bu, A
olarak smd
ve B
olarak diagnosticd
ile gerçekleşti. SMJobBless
fonksiyonu, yeni bir ayrıcalıklı yardımcı araç yüklemek için kullanılabilir ( root olarak). Eğer root olarak çalışan bir süreç smd ile iletişime geçerse, başka kontroller yapılmayacaktır.
Bu nedenle, B hizmeti diagnosticd
'dir çünkü root olarak çalışır ve bir süreci izlemek için kullanılabilir, bu nedenle izleme başladıktan sonra, saniyede birden fazla mesaj gönderir.
Saldırıyı gerçekleştirmek için:
- Standart XPC protokolünü kullanarak
smd
adlı hizmete bir bağlantı başlatın. diagnosticd
'ye ikincil bir bağlantı oluşturun. Normal prosedürün aksine, iki yeni mach portu oluşturup göndermek yerine, istemci portu gönderme hakkı,smd
bağlantısıyla ilişkili gönderme hakkının bir kopyasıyla değiştirilir.- Sonuç olarak, XPC mesajları
diagnosticd
'ye dağıtılabilir, ancakdiagnosticd
'en gelen yanıtlarsmd
'ye yönlendirilir.smd
için, hem kullanıcıdan hem dediagnosticd
'den gelen mesajların aynı bağlantıdan geldiği izlenimi vardır.
- Bir sonraki adım,
diagnosticd
'ye seçilen bir süreci (potansiyel olarak kullanıcının kendi süreci) izlemeye başlatmaktır. Aynı anda,smd
'ye rutin 1004 mesajlarının bir seli gönderilir. Buradaki amaç, yükseltilmiş ayrıcalıklara sahip bir aracı yüklemektir. - Bu eylem,
handle_bless
fonksiyonu içinde bir yarış durumu tetikler. Zamanlama kritik öneme sahiptir:xpc_connection_get_pid
fonksiyonu, kullanıcının sürecinin PID'sini döndürmelidir (çünkü ayrıcalıklı araç kullanıcının uygulama paketinde bulunur). Ancak,xpc_connection_get_audit_token
fonksiyonu, özellikleconnection_is_authorized
alt rutininde,diagnosticd
'ye ait denetim belirtecini referans almalıdır.
Variant 2: yanıt yönlendirme
Bir XPC (Çapraz Süreç İletişimi) ortamında, olay işleyicileri eşzamanlı olarak çalışmasa da, yanıt mesajlarının işlenmesi benzersiz bir davranış sergiler. Özellikle, yanıt bekleyen mesajlar göndermek için iki farklı yöntem vardır:
xpc_connection_send_message_with_reply
: Burada, XPC mesajı belirlenen bir kuyrukta alınır ve işlenir.xpc_connection_send_message_with_reply_sync
: Tersine, bu yöntemde XPC mesajı mevcut dağıtım kuyruğunda alınır ve işlenir.
Bu ayrım, yanıt paketlerinin bir XPC olay işleyicisinin yürütülmesiyle eşzamanlı olarak ayrıştırılma olasılığını sağlar. Özellikle, _xpc_connection_set_creds
denetim belirtecinin kısmi olarak üzerine yazılmasını önlemek için kilitleme uygulasa da, bu korumayı tüm bağlantı nesnesine genişletmez. Sonuç olarak, bu, bir paketin ayrıştırılması ile olay işleyicisinin yürütülmesi arasındaki aralıkta denetim belirtecinin değiştirilmesine olanak tanıyan bir zayıflık yaratır.
Bu zayıflıktan yararlanmak için aşağıdaki kurulum gereklidir:
A
veB
olarak adlandırılan iki mach hizmeti, her ikisi de bir bağlantı kurabilir.A
hizmetinin yalnızcaB
'nin gerçekleştirebileceği belirli bir eylem için bir yetkilendirme kontrolü içermesi gerekir (kullanıcının uygulaması bunu yapamaz).A
hizmeti, bir yanıt bekleyen bir mesaj göndermelidir.- Kullanıcı,
B
'ye yanıt vereceği bir mesaj gönderebilir.
Sömürü süreci aşağıdaki adımları içerir:
A
hizmetinin yanıt bekleyen bir mesaj göndermesini bekleyin.A
'ya doğrudan yanıt vermek yerine, yanıt portu ele geçirilir veB
hizmetine bir mesaj göndermek için kullanılır.- Ardından, yasaklı eylemi içeren bir mesaj gönderilir ve bunun
B
'den gelen yanıtla eşzamanlı olarak işleneceği beklenir.
Aşağıda, tanımlanan saldırı senaryosunun görsel bir temsili bulunmaktadır:
![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../images/image (1) (1) (1) (1) (1) (1) (1).png)
Keşif Problemleri
- Örnekleri Bulma Zorlukları:
xpc_connection_get_audit_token
kullanım örneklerini bulmak, hem statik hem de dinamik olarak zordu. - Metodoloji: Frida,
xpc_connection_get_audit_token
fonksiyonunu yakalamak için kullanıldı ve olay işleyicilerinden gelmeyen çağrıları filtreledi. Ancak, bu yöntem yalnızca yakalanan süreçle sınırlıydı ve aktif kullanım gerektiriyordu. - Analiz Araçları: Ulaşılabilir mach hizmetlerini incelemek için IDA/Ghidra gibi araçlar kullanıldı, ancak süreç zaman alıcıydı ve dyld paylaşılan önbelleği ile ilgili çağrılarla karmaşık hale geldi.
- Scripting Sınırlamaları:
dispatch_async
bloklarındanxpc_connection_get_audit_token
çağrılarını analiz etmek için script yazma girişimleri, blokların ayrıştırılması ve dyld paylaşılan önbelleği ile etkileşimdeki karmaşıklıklar nedeniyle engellendi.
Çözüm
- Rapor Edilen Sorunlar:
smd
içinde bulunan genel ve özel sorunları detaylandıran bir rapor Apple'a gönderildi. - Apple'ın Yanıtı: Apple,
smd
içindeki sorunuxpc_connection_get_audit_token
'ıxpc_dictionary_get_audit_token
ile değiştirerek ele aldı. - Çözümün Doğası:
xpc_dictionary_get_audit_token
fonksiyonu, alınan XPC mesajına bağlı mach mesajından doğrudan denetim belirtecini alması nedeniyle güvenli kabul edilir. Ancak,xpc_connection_get_audit_token
gibi kamu API'sinin bir parçası değildir. - Daha Kapsamlı Bir Çözümün Yokluğu: Apple'ın, bağlantının kaydedilen denetim belirteciyle uyumlu olmayan mesajları atma gibi daha kapsamlı bir çözüm uygulamadığı nedeninin belirsizliğini koruyor. Belirli senaryolarda (örneğin,
setuid
kullanımı) meşru denetim belirteci değişikliklerinin olabileceği ihtimali bir faktör olabilir. - Mevcut Durum: Sorun, iOS 17 ve macOS 14'te devam etmekte olup, bunu tanımlamaya ve anlamaya çalışanlar için bir zorluk teşkil etmektedir.
tip
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.