macOS XPC Connecting Process Check

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

XPC Connecting Process Check

Cuando se establece una conexi贸n a un servicio XPC, el servidor verificar谩 si la conexi贸n est谩 permitida. Estas son las verificaciones que normalmente realizar铆a:

  1. Verificar si el proceso que se conecta est谩 firmado con un certificado firmado por Apple (solo otorgado por Apple).
  • Si esto no se verifica, un atacante podr铆a crear un certificado falso para coincidir con cualquier otra verificaci贸n.
  1. Verificar si el proceso que se conecta est谩 firmado con el certificado de la organizaci贸n (verificaci贸n del ID del equipo).
  • Si esto no se verifica, cualquier certificado de desarrollador de Apple puede ser utilizado para firmar y conectarse al servicio.
  1. Verificar si el proceso que se conecta contiene un ID de paquete adecuado.
  • Si esto no se verifica, cualquier herramienta firmada por la misma organizaci贸n podr铆a ser utilizada para interactuar con el servicio XPC.
  1. (4 o 5) Verificar si el proceso que se conecta tiene un n煤mero de versi贸n de software adecuado.
  • Si esto no se verifica, un cliente antiguo e inseguro, vulnerable a la inyecci贸n de procesos, podr铆a ser utilizado para conectarse al servicio XPC incluso con las otras verificaciones en su lugar.
  1. (4 o 5) Verificar si el proceso que se conecta tiene un runtime endurecido sin derechos peligrosos (como los que permiten cargar bibliotecas arbitrarias o usar variables de entorno DYLD).
  2. Si esto no se verifica, el cliente podr铆a ser vulnerable a la inyecci贸n de c贸digo.
  3. Verificar si el proceso que se conecta tiene un derecho que le permite conectarse al servicio. Esto es aplicable para binarios de Apple.
  4. La verificaci贸n debe basarse en el token de auditor铆a del cliente que se conecta en lugar de su ID de proceso (PID) ya que el primero previene ataques de reutilizaci贸n de PID.
  • Los desarrolladores raramente utilizan la llamada a la API del token de auditor铆a ya que es privada, por lo que Apple podr铆a cambiarla en cualquier momento. Adem谩s, el uso de API privadas no est谩 permitido en las aplicaciones de Mac App Store.
  • Si se utiliza el m茅todo processIdentifier, podr铆a ser vulnerable.
  • xpc_dictionary_get_audit_token deber铆a ser utilizado en lugar de xpc_connection_get_audit_token, ya que este 煤ltimo tambi茅n podr铆a ser vulnerable en ciertas situaciones.

Communication Attacks

Para m谩s informaci贸n sobre el ataque de reutilizaci贸n de PID, consulta:

macOS PID Reuse

Para m谩s informaci贸n sobre el ataque xpc_connection_get_audit_token, consulta:

macOS xpc_connection_get_audit_token Attack

Trustcache - Prevenci贸n de Ataques de Downgrade

Trustcache es un m茅todo defensivo introducido en m谩quinas Apple Silicon que almacena una base de datos de CDHSAH de binarios de Apple para que solo se puedan ejecutar binarios no modificados permitidos. Lo que previene la ejecuci贸n de versiones de downgrade.

Code Examples

El servidor implementar谩 esta verificaci贸n en una funci贸n llamada shouldAcceptNewConnection.

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

El objeto NSXPCConnection tiene una propiedad privada auditToken (la que deber铆a usarse pero podr铆a cambiar) y una propiedad p煤blica processIdentifier (la que no deber铆a usarse).

El proceso de conexi贸n podr铆a verificarse con algo como:

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))

Si un desarrollador no quiere verificar la versi贸n del cliente, podr铆a comprobar que el cliente no es vulnerable a la inyecci贸n de procesos al menos:

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

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks