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
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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:
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:
- 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 undispatch_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).
- 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
yB
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 axpc_connection_get_audit_token
desdedispatch_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:
- Iniciar una conexi贸n al servicio llamado
smd
utilizando el protocolo XPC est谩ndar. - 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贸nsmd
. - Como resultado, los mensajes XPC pueden ser despachados a
diagnosticd
, pero las respuestas dediagnosticd
se redirigen asmd
. Parasmd
, parece que los mensajes del usuario y dediagnosticd
provienen de la misma conexi贸n.
- 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 asmd
. La intenci贸n aqu铆 es instalar una herramienta con privilegios elevados. - 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贸nxpc_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贸nxpc_connection_get_audit_token
, espec铆ficamente dentro de la subrutinaconnection_is_authorized
, debe hacer referencia al token de auditor铆a perteneciente adiagnosticd
.
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:
xpc_connection_send_message_with_reply
: Aqu铆, el mensaje XPC se recibe y procesa en una cola designada.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
yB
, 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 soloB
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:
- Esperar a que el servicio
A
env铆e un mensaje que espera una respuesta. - En lugar de responder directamente a
A
, se secuestra el puerto de respuesta y se utiliza para enviar un mensaje al servicioB
. - 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)
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 bloquesdispatch_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
sustituyendoxpc_connection_get_audit_token
porxpc_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 axpc_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
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.