hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-connecting-process-check.md
2023-06-03 01:46:23 +00:00

7.1 KiB

Verificación de conexión de proceso XPC en macOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Verificación de conexión de proceso XPC

Cuando se establece una conexión a un servicio XPC, el servidor verificará si la conexión está permitida. Estas son las comprobaciones que suele realizar:

  1. Comprobar si el proceso de conexión está firmado con un certificado firmado por Apple (sólo otorgado por Apple).
    • Si esto no está verificado, un atacante podría crear un certificado falso para coincidir con cualquier otra comprobación.
  2. Comprobar si el proceso de conexión está firmado con el certificado de la organización (verificación de ID de equipo).
    • Si esto no está verificado, cualquier certificado de desarrollador de Apple puede ser utilizado para firmar y conectarse al servicio.
  3. Comprobar si el proceso de conexión contiene un ID de paquete adecuado.
  4. Comprobar si el proceso de conexión tiene un número de versión de software adecuado.
    • Si esto no está verificado, se podría utilizar un cliente antiguo e inseguro, vulnerable a la inyección de procesos, para conectarse al servicio XPC incluso con las otras comprobaciones en su lugar.
  5. Comprobar si el proceso de conexión tiene un derecho que le permite conectarse al servicio. Esto es aplicable para binarios de Apple.
  6. La verificación debe estar basada en el token de auditoría del cliente de conexión en lugar de su ID de proceso (PID) ya que lo primero previene los ataques de reutilización de PID.
    • Los desarrolladores rara vez utilizan la llamada a la API de 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 la Mac App Store.

Para obtener más información sobre la comprobación de ataques de reutilización de PID:

{% content-ref url="macos-pid-reuse.md" %} macos-pid-reuse.md {% endcontent-ref %}

Ejemplos de código

El servidor implementará esta verificación en una función llamada shouldAcceptNewConnection.

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

{% endcode %}

El objeto NSXPCConnection tiene una propiedad privada llamada auditToken (la que debería ser utilizada pero podría cambiar) y una propiedad pública llamada processIdentifier (la que no debería ser utilizada).

El proceso de conexión podría ser verificado con algo como:

{% code overflow="wrap" %}

[...]
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
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);

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

{% code overflow="wrap" %}

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

{% endcode %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥