macOS xpc_connection_get_audit_token Ataque

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

Para m谩s informaci贸n, consulta la publicaci贸n original: https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/. Este es un resumen:

Informaci贸n B谩sica sobre Mensajes Mach

Si no sabes qu茅 son los Mensajes Mach, comienza a revisar esta p谩gina:

macOS IPC - Inter Process Communication

Por el momento, recuerda que (definici贸n de aqu铆):
Los mensajes Mach se env铆an a trav茅s de un mach port, que es un canal de comunicaci贸n de un solo receptor, m煤ltiples emisores integrado en el n煤cleo mach. M煤ltiples procesos pueden enviar mensajes a un mach port, pero en cualquier momento solo un 煤nico proceso puede leer de 茅l. Al igual que los descriptores de archivo y los sockets, los mach ports son asignados y gestionados por el n煤cleo y los procesos solo ven un entero, que pueden usar para indicar al n煤cleo cu谩l de sus mach ports desean usar.

Conexi贸n XPC

Si no sabes c贸mo se establece una conexi贸n XPC, consulta:

macOS XPC

Resumen de Vulnerabilidades

Lo que es interesante que sepas es que la abstracci贸n de XPC es una conexi贸n uno a uno, pero se basa en una tecnolog铆a que puede tener m煤ltiples emisores, as铆 que:

  • Los mach ports son de un solo receptor, m煤ltiples emisores.
  • El token de auditor铆a de una conexi贸n XPC es el token de auditor铆a copiado del mensaje recibido m谩s recientemente.
  • Obtener el token de auditor铆a de una conexi贸n XPC es cr铆tico para muchas verificaciones de seguridad.

Aunque la situaci贸n anterior suena prometedora, hay algunos escenarios donde esto no causar谩 problemas (de aqu铆):

  • Los tokens de auditor铆a se utilizan a menudo para una verificaci贸n de autorizaci贸n para decidir si aceptar una conexi贸n. Como esto ocurre utilizando un mensaje al puerto de servicio, no se ha establecido ninguna conexi贸n a煤n. M谩s mensajes en este puerto simplemente se manejar谩n como solicitudes de conexi贸n adicionales. Por lo tanto, cualquier verificaci贸n antes de aceptar una conexi贸n no es vulnerable (esto tambi茅n significa que dentro de -listener:shouldAcceptNewConnection: el token de auditor铆a es seguro). Por lo tanto, buscamos conexiones XPC que verifiquen acciones espec铆ficas.
  • Los controladores de eventos XPC se manejan de manera sincr贸nica. Esto significa que el controlador de eventos para un mensaje debe completarse antes de llamarlo para el siguiente, incluso en colas de despacho concurrentes. Por lo tanto, dentro de un controlador de eventos XPC, el token de auditor铆a no puede ser sobrescrito por otros mensajes normales (隆no de respuesta!).

Dos m茅todos diferentes en los que esto podr铆a ser explotable:

  1. Variante 1:
  • El exploit se conecta al servicio A y al servicio B
  • El servicio B puede llamar a una funcionalidad privilegiada en el servicio A que el usuario no puede
  • El servicio A llama a xpc_connection_get_audit_token mientras no est谩 dentro del controlador de eventos para una conexi贸n en un dispatch_async.
  • Por lo tanto, un mensaje diferente podr铆a sobrescribir el Token de Auditor铆a porque se est谩 despachando de manera as铆ncrona fuera del controlador de eventos.
  • El exploit pasa a servicio B el derecho de ENV脥O al servicio A.
  • Por lo tanto, el svc B estar谩 realmente enviando los mensajes al servicio A.
  • El exploit intenta llamar a la acci贸n privilegiada. En un RC, el svc A verifica la autorizaci贸n de esta acci贸n mientras svc B sobrescribi贸 el token de auditor铆a (dando al exploit acceso para llamar a la acci贸n privilegiada).
  1. Variante 2:
  • El servicio B puede llamar a una funcionalidad privilegiada en el servicio A que el usuario no puede
  • El exploit se conecta con el servicio A que env铆a al exploit un mensaje esperando una respuesta en un puerto de respuesta espec铆fico.
  • El exploit env铆a a servicio B un mensaje pasando ese puerto de respuesta.
  • Cuando el servicio B responde, env铆a el mensaje al servicio A, mientras el exploit env铆a un mensaje diferente al servicio A tratando de alcanzar una funcionalidad privilegiada y esperando que la respuesta del servicio B sobrescriba el token de auditor铆a en el momento perfecto (Condici贸n de Carrera).

Variante 1: llamando a xpc_connection_get_audit_token fuera de un controlador de eventos

Escenario:

  • Dos servicios mach A y B a los que ambos podemos conectarnos (basado en el perfil de sandbox y las verificaciones de autorizaci贸n antes de aceptar la conexi贸n).
  • A debe tener una verificaci贸n de autorizaci贸n para una acci贸n espec铆fica que B puede pasar (pero nuestra aplicaci贸n no puede).
  • Por ejemplo, si B tiene algunos derechos o se est谩 ejecutando como root, podr铆a permitirle pedir a A que realice una acci贸n privilegiada.
  • Para esta verificaci贸n de autorizaci贸n, A obtiene el token de auditor铆a de manera as铆ncrona, por ejemplo, llamando a xpc_connection_get_audit_token desde dispatch_async.

caution

En este caso, un atacante podr铆a desencadenar una Condici贸n de Carrera haciendo un exploit que pide a A que realice una acci贸n varias veces mientras hace que B env铆e mensajes a A. Cuando la RC es exitosa, el token de auditor铆a de B ser谩 copiado en memoria mientras la solicitud de nuestro exploit est谩 siendo manejada por A, d谩ndole acceso a la acci贸n privilegiada que solo B podr铆a solicitar.

Esto ocurri贸 con A como smd y B como diagnosticd. La funci贸n SMJobBless de smb se puede usar para instalar un nuevo ayudante privilegiado (como root). Si un proceso que se ejecuta como root contacta smd, no se realizar谩n m谩s verificaciones.

Por lo tanto, el servicio B es diagnosticd porque se ejecuta como root y se puede usar para monitorear un proceso, as铆 que una vez que se ha iniciado el monitoreo, enviar谩 m煤ltiples mensajes por segundo.

Para realizar el ataque:

  1. Iniciar una conexi贸n al servicio llamado smd utilizando el protocolo XPC est谩ndar.
  2. Formar una conexi贸n secundaria a diagnosticd. A diferencia del procedimiento normal, en lugar de crear y enviar dos nuevos mach ports, el derecho de env铆o del puerto del cliente se sustituye por un duplicado del derecho de env铆o asociado con la conexi贸n smd.
  3. Como resultado, los mensajes XPC pueden ser despachados a diagnosticd, pero las respuestas de diagnosticd se redirigen a smd. Para smd, parece que los mensajes del usuario y de diagnosticd provienen de la misma conexi贸n.

Imagen que representa el proceso de exploit

  1. El siguiente paso implica instruir a diagnosticd para que inicie el monitoreo de un proceso elegido (potencialmente el propio del usuario). Al mismo tiempo, se env铆a una inundaci贸n de mensajes rutinarios 1004 a smd. La intenci贸n aqu铆 es instalar una herramienta con privilegios elevados.
  2. Esta acci贸n desencadena una condici贸n de carrera dentro de la funci贸n handle_bless. El tiempo es cr铆tico: la llamada a la funci贸n xpc_connection_get_pid debe devolver el PID del proceso del usuario (ya que la herramienta privilegiada reside en el paquete de la aplicaci贸n del usuario). Sin embargo, la funci贸n xpc_connection_get_audit_token, espec铆ficamente dentro de la subrutina connection_is_authorized, debe hacer referencia al token de auditor铆a perteneciente a diagnosticd.

Variante 2: reenv铆o de respuestas

En un entorno XPC (Comunicaci贸n entre Procesos), aunque los controladores de eventos no se ejecutan de manera concurrente, el manejo de mensajes de respuesta tiene un comportamiento 煤nico. Espec铆ficamente, existen dos m茅todos distintos para enviar mensajes que esperan una respuesta:

  1. xpc_connection_send_message_with_reply: Aqu铆, el mensaje XPC se recibe y procesa en una cola designada.
  2. xpc_connection_send_message_with_reply_sync: Por el contrario, en este m茅todo, el mensaje XPC se recibe y procesa en la cola de despacho actual.

Esta distinci贸n es crucial porque permite la posibilidad de que los paquetes de respuesta se analicen de manera concurrente con la ejecuci贸n de un controlador de eventos XPC. Notablemente, mientras que _xpc_connection_set_creds implementa un bloqueo para protegerse contra la sobrescritura parcial del token de auditor铆a, no extiende esta protecci贸n a todo el objeto de conexi贸n. En consecuencia, esto crea una vulnerabilidad donde el token de auditor铆a puede ser reemplazado durante el intervalo entre el an谩lisis de un paquete y la ejecuci贸n de su controlador de eventos.

Para explotar esta vulnerabilidad, se requiere la siguiente configuraci贸n:

  • Dos servicios mach, denominados A y B, ambos de los cuales pueden establecer una conexi贸n.
  • El servicio A debe incluir una verificaci贸n de autorizaci贸n para una acci贸n espec铆fica que solo B puede realizar (la aplicaci贸n del usuario no puede).
  • El servicio A debe enviar un mensaje que anticipa una respuesta.
  • El usuario puede enviar un mensaje a B al que este responder谩.

El proceso de explotaci贸n implica los siguientes pasos:

  1. Esperar a que el servicio A env铆e un mensaje que espera una respuesta.
  2. En lugar de responder directamente a A, se secuestra el puerto de respuesta y se utiliza para enviar un mensaje al servicio B.
  3. Posteriormente, se despacha un mensaje que involucra la acci贸n prohibida, con la expectativa de que se procese de manera concurrente con la respuesta de B.

A continuaci贸n se muestra una representaci贸n visual del escenario de ataque descrito:

![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../images/image (1) (1) (1) (1) (1) (1) (1).png)

https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png

Problemas de Descubrimiento

  • Dificultades para Localizar Instancias: Buscar instancias del uso de xpc_connection_get_audit_token fue un desaf铆o, tanto est谩tica como din谩micamente.
  • Metodolog铆a: Se utiliz贸 Frida para enganchar la funci贸n xpc_connection_get_audit_token, filtrando llamadas que no proven铆an de controladores de eventos. Sin embargo, este m茅todo estaba limitado al proceso enganchado y requer铆a uso activo.
  • Herramientas de An谩lisis: Se utilizaron herramientas como IDA/Ghidra para examinar servicios mach alcanzables, pero el proceso fue lento, complicado por llamadas que involucraban la cach茅 compartida de dyld.
  • Limitaciones de Scripting: Los intentos de scriptar el an谩lisis para llamadas a xpc_connection_get_audit_token desde bloques dispatch_async se vieron obstaculizados por complejidades en el an谩lisis de bloques e interacciones con la cach茅 compartida de dyld.

La soluci贸n

  • Problemas Reportados: Se present贸 un informe a Apple detallando los problemas generales y espec铆ficos encontrados en smd.
  • Respuesta de Apple: Apple abord贸 el problema en smd sustituyendo xpc_connection_get_audit_token por xpc_dictionary_get_audit_token.
  • Naturaleza de la Soluci贸n: La funci贸n xpc_dictionary_get_audit_token se considera segura ya que recupera el token de auditor铆a directamente del mensaje mach vinculado al mensaje XPC recibido. Sin embargo, no forma parte de la API p煤blica, similar a xpc_connection_get_audit_token.
  • Ausencia de una Soluci贸n M谩s Amplia: No est谩 claro por qu茅 Apple no implement贸 una soluci贸n m谩s integral, como descartar mensajes que no se alineen con el token de auditor铆a guardado de la conexi贸n. La posibilidad de cambios leg铆timos en el token de auditor铆a en ciertos escenarios (por ejemplo, uso de setuid) podr铆a ser un factor.
  • Estado Actual: El problema persiste en iOS 17 y macOS 14, representando un desaf铆o para aquellos que buscan identificarlo y comprenderlo.

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