macOS XPC Connecting Process Check

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

XPC Verbindung Prozessprüfung

Wenn eine Verbindung zu einem XPC-Dienst hergestellt wird, überprüft der Server, ob die Verbindung zulässig ist. Dies sind die üblicherweise durchgeführten Überprüfungen:

  1. Überprüfen Sie, ob der verbindende Prozess mit einem von Apple signierten Zertifikat signiert ist (das nur von Apple vergeben wird).

  • Wenn dies nicht überprüft wird, könnte ein Angreifer ein gefälschtes Zertifikat erstellen, um jede andere Überprüfung zu erfüllen.

  1. Überprüfen Sie, ob der verbindende Prozess mit dem Zertifikat der Organisation signiert ist (Team-ID-Überprüfung).

  • Wenn dies nicht überprüft wird, kann jedes Entwicklerzertifikat von Apple zum Signieren und zur Verbindung mit dem Dienst verwendet werden.

  1. Überprüfen Sie, ob der verbindende Prozess eine korrekte Bundle-ID enthält.

  • Wenn dies nicht überprüft wird, kann jedes von derselben Organisation signierte Tool verwendet werden, um mit dem XPC-Dienst zu interagieren.

  1. (4 oder 5) Überprüfen Sie, ob der verbindende Prozess eine korrekte Softwareversionsnummer hat.

  • Wenn dies nicht überprüft wird, können alte, unsichere Clients, die anfällig für Prozesseinspritzung sind, verwendet werden, um sich mit dem XPC-Dienst zu verbinden, selbst wenn die anderen Überprüfungen vorhanden sind.

  1. (4 oder 5) Überprüfen Sie, ob der verbindende Prozess eine gehärtete Laufzeit ohne gefährliche Berechtigungen hat (wie solche, die das Laden beliebiger Bibliotheken oder die Verwendung von DYLD-Umgebungsvariablen ermöglichen).

  2. Wenn dies nicht überprüft wird, könnte der Client anfällig für Codeinjektion sein.

  3. Überprüfen Sie, ob der verbindende Prozess eine Berechtigung hat, die ihm die Verbindung mit dem Dienst ermöglicht. Dies gilt für Apple-Binärdateien.

  4. Die Überprüfung muss basierend auf dem Audit-Token des verbindenden Clients erfolgen, anstatt auf seiner Prozess-ID (PID), da ersteres PID-Wiederverwendungsangriffe verhindert.

  • Entwickler verwenden die Audit-Token-API-Routine selten, da sie privat ist und von Apple jederzeit geändert werden könnte. Außerdem ist die Verwendung privater APIs in Mac App Store-Apps nicht zulässig.

  • Wenn die Methode processIdentifier verwendet wird, könnte sie anfällig sein.

  • Anstelle von xpc_connection_get_audit_token sollte xpc_dictionary_get_audit_token verwendet werden, da letztere in bestimmten Situationen ebenfalls anfällig sein könnte.

Kommunikationsangriffe

Weitere Informationen zum Angriff auf die PID-Wiederverwendung finden Sie unter:

pagemacOS PID Reuse

Weitere Informationen zum Angriff auf xpc_connection_get_audit_token finden Sie unter:

pagemacOS xpc_connection_get_audit_token Attack

Trustcache - Prävention von Downgrade-Angriffen

Trustcache ist eine defensive Methode, die in Apple Silicon-Maschinen eingeführt wurde und eine Datenbank von CDHSAH von Apple-Binärdateien speichert, sodass nur zugelassene, nicht modifizierte Binärdateien ausgeführt werden können. Dadurch wird die Ausführung von Downgrade-Versionen verhindert.

Codebeispiele

Der Server implementiert diese Überprüfung in einer Funktion namens shouldAcceptNewConnection.

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

Das Objekt NSXPCConnection hat eine private Eigenschaft auditToken (die verwendet werden sollte, aber sich ändern könnte) und eine öffentliche Eigenschaft processIdentifier (die nicht verwendet werden sollte).

Der verbindende Prozess könnte mit etwas Ähnlichem überprüft werden:

[...]
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))

Wenn ein Entwickler die Version des Clients nicht überprüfen möchte, könnte er zumindest überprüfen, ob der Client anfällig für Prozessinjektion ist:

[...]
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
}
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated