macOS XPC Bağlantı Süreci Kontrolü

Reading time: 4 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) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

XPC Bağlantı Süreci Kontrolü

Bir XPC hizmetine bağlantı kurulduğunda, sunucu bağlantının izinli olup olmadığını kontrol eder. Genellikle gerçekleştireceği kontroller şunlardır:

  1. Bağlanan sürecin Apple imzalı bir sertifika ile imzalanıp imzalanmadığını kontrol et.
  • Eğer bu doğrulanmazsa, bir saldırgan herhangi bir diğer kontrolü karşılamak için sahte bir sertifika oluşturabilir.
  1. Bağlanan sürecin kuruluşun sertifikası ile imzalanıp imzalanmadığını kontrol et (takım ID doğrulaması).
  • Eğer bu doğrulanmazsa, Apple'dan alınan herhangi bir geliştirici sertifikası imzalamak için kullanılabilir ve hizmete bağlanabilir.
  1. Bağlanan sürecin uygun bir paket kimliğine sahip olup olmadığını kontrol et.
  • Eğer bu doğrulanmazsa, aynı kuruluş tarafından imzalanmış herhangi bir araç XPC hizmeti ile etkileşimde bulunmak için kullanılabilir.
  1. (4 veya 5) Bağlanan sürecin uygun bir yazılım sürüm numarasına sahip olup olmadığını kontrol et.
  • Eğer bu doğrulanmazsa, eski, güvensiz istemciler, süreç enjeksiyonuna karşı savunmasız olarak XPC hizmetine bağlanmak için kullanılabilir, diğer kontroller mevcut olsa bile.
  1. (4 veya 5) Bağlanan sürecin tehlikeli yetkilendirmeleri olmayan sertleştirilmiş bir çalışma zamanı olup olmadığını kontrol et (örneğin, rastgele kütüphanelerin yüklenmesine veya DYLD ortam değişkenlerinin kullanılmasına izin verenler gibi).
  2. Eğer bu doğrulanmazsa, istemci kod enjeksiyonuna karşı savunmasız olabilir.
  3. Bağlanan sürecin hizmete bağlanmasına izin veren bir yetkilendirme olup olmadığını kontrol et. Bu, Apple ikili dosyaları için geçerlidir.
  4. Doğrulama, bağlanan istemcinin denetim belirteci üzerine olmalıdır, süreç ID'si (PID) yerine, çünkü ilki PID yeniden kullanım saldırılarını önler.
  • Geliştiriciler denetim belirteci API çağrısını nadiren kullanır çünkü bu özeldir, bu nedenle Apple istediği zaman değiştirebilir. Ayrıca, özel API kullanımı Mac App Store uygulamalarında yasaklanmıştır.
  • processIdentifier yöntemi kullanılıyorsa, savunmasız olabilir.
  • xpc_dictionary_get_audit_token yerine xpc_connection_get_audit_token kullanılmalıdır, çünkü sonuncusu da belirli durumlarda savunmasız olabilir.

İletişim Saldırıları

PID yeniden kullanım saldırısı hakkında daha fazla bilgi için kontrol et:

macOS PID Reuse

Daha fazla bilgi için xpc_connection_get_audit_token saldırısını kontrol et:

macOS xpc_connection_get_audit_token Attack

Trustcache - Aşağı Dönüş Saldırıları Önleme

Trustcache, yalnızca izin verilen değiştirilmemiş ikili dosyaların çalıştırılmasını sağlamak için Apple Silicon makinelerinde tanıtılan savunma yöntemidir ve Apple ikililerinin CDHSAH veritabanını depolar. Bu, aşağı sürüm versiyonlarının çalıştırılmasını önler.

Kod Örnekleri

Sunucu bu doğrulamayı shouldAcceptNewConnection adlı bir işlevde uygulayacaktır.

objectivec
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
//Check connection
return YES;
}

NSXPCConnection nesnesinin özel bir auditToken (kullanılması gereken ama değişebilecek olan) ve genel bir processIdentifier (kullanılmaması gereken) özelliği vardır.

Bağlanan süreç, şöyle bir şeyle doğrulanabilir:

objectivec
[...]
SecRequirementRef requirementRef = NULL;
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
/* Check:
- Signed by a cert signed by Apple
- Check the bundle ID
- Check the TEAMID of the signing cert
- Check the version used
*/

// Check the requirements with the PID (vulnerable)
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);

// Check the requirements wuing the auditToken (secure)
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))

Eğer bir geliştirici istemcinin sürümünü kontrol etmek istemiyorsa, en azından istemcinin işlem enjeksiyonuna karşı savunmasız olmadığını kontrol edebilir:

objectivec
[...]
CFDictionaryRef csInfo = NULL;
SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo);
uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue];
const uint32_t cs_hard = 0x100;        // don't load invalid page.
const uint32_t cs_kill = 0x200;        // Kill process if page is invalid
const uint32_t cs_restrict = 0x800;    // Prevent debugging
const uint32_t cs_require_lv = 0x2000; // Library Validation
const uint32_t cs_runtime = 0x10000;   // hardened runtime
if ((csFlags & (cs_hard | cs_require_lv)) {
return Yes; // Accept connection
}

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) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin