macOS xpc_connection_get_audit_token Attack
Para mais informações, confira o post original: https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/. Este é um resumo:
Informações Básicas sobre Mensagens Mach
Se você não sabe o que são Mensagens Mach, comece verificando esta página:
pagemacOS IPC - Inter Process CommunicationPor enquanto, lembre-se de que (definição daqui): As mensagens Mach são enviadas por uma porta mach, que é um canal de comunicação único receptor, múltiplos remetentes integrado ao kernel mach. Múltiplos processos podem enviar mensagens para uma porta mach, mas em qualquer momento apenas um processo pode lê-la. Assim como descritores de arquivo e soquetes, as portas mach são alocadas e gerenciadas pelo kernel e os processos veem apenas um número inteiro, que podem usar para indicar ao kernel qual de suas portas mach desejam usar.
Conexão XPC
Se você não sabe como uma conexão XPC é estabelecida, verifique:
pagemacOS XPCResumo da Vulnerabilidade
O que é interessante saber é que a abstração do XPC é uma conexão um para um, mas é baseada em cima de uma tecnologia que pode ter múltiplos remetentes, então:
As portas mach são receptor único, múltiplos remetentes.
O token de auditoria de uma conexão XPC é o token de auditoria copiado da mensagem mais recentemente recebida.
Obter o token de auditoria de uma conexão XPC é crítico para muitas verificações de segurança.
Embora a situação anterior pareça promissora, existem cenários em que isso não causará problemas (daqui):
Os tokens de auditoria são frequentemente usados para uma verificação de autorização para decidir se aceitam uma conexão. Como isso acontece usando uma mensagem para a porta de serviço, ainda não há conexão estabelecida. Mais mensagens nesta porta serão tratadas como solicitações de conexão adicionais. Portanto, verificações antes de aceitar uma conexão não são vulneráveis (isso também significa que dentro de
-listener:shouldAcceptNewConnection:
o token de auditoria está seguro). Estamos, portanto, procurando por conexões XPC que verifiquem ações específicas.Os manipuladores de eventos XPC são tratados de forma síncrona. Isso significa que o manipulador de eventos para uma mensagem deve ser concluído antes de chamá-lo para a próxima, mesmo em filas de despacho concorrentes. Portanto, dentro de um manipulador de eventos XPC, o token de auditoria não pode ser sobrescrito por outras mensagens normais (não de resposta!).
Duas maneiras diferentes pelas quais isso pode ser explorado:
Variante1:
Explorar conecta ao serviço A e serviço B
O serviço B pode chamar uma funcionalidade privilegiada no serviço A que o usuário não pode
O serviço A chama
xpc_connection_get_audit_token
enquanto não dentro do manipulador de eventos para uma conexão em umdispatch_async
.Assim, uma mensagem diferente poderia sobrescrever o Token de Auditoria porque está sendo despachada de forma assíncrona fora do manipulador de eventos.
O exploit passa para serviço B o direito de ENVIO para o serviço A.
Então svc B estará realmente enviando as mensagens para o serviço A.
O exploit tenta chamar a ação privilegiada. Em um RC svc A verifica a autorização desta ação enquanto svc B sobrescreveu o Token de Auditoria (dando ao exploit acesso para chamar a ação privilegiada).
Variante 2:
O serviço B pode chamar uma funcionalidade privilegiada no serviço A que o usuário não pode
O exploit se conecta com o serviço A que envia ao exploit uma mensagem esperando uma resposta em uma porta de resposta específica.
O exploit envia ao serviço B uma mensagem passando essa porta de resposta.
Quando o serviço B responde, ele envia a mensagem para o serviço A, enquanto o exploit envia uma mensagem diferente para o serviço A tentando alcançar uma funcionalidade privilegiada e esperando que a resposta do serviço B sobrescreva o Token de Auditoria no momento perfeito (Condição de Corrida).
Variante 1: chamando xpc_connection_get_audit_token fora de um manipulador de eventos
Cenário:
Dois serviços mach
A
eB
aos quais podemos nos conectar (com base no perfil de sandbox e nas verificações de autorização antes de aceitar a conexão).A deve ter uma verificação de autorização para uma ação específica que
B
pode passar (mas nosso aplicativo não pode).Por exemplo, se B tiver algumas prerrogativas ou estiver sendo executado como root, ele pode permitir que ele peça a A para executar uma ação privilegiada.
Para esta verificação de autorização,
A
obtém o token de auditoria de forma assíncrona, por exemplo, chamandoxpc_connection_get_audit_token
dedispatch_async
.
Neste caso, um atacante poderia desencadear uma Condição de Corrida criando um exploit que peça a A para executar uma ação várias vezes enquanto faz B enviar mensagens para A
. Quando o RC for bem-sucedido, o token de auditoria de B será copiado na memória enquanto a solicitação do nosso exploit está sendo tratada por A, dando-lhe acesso à ação privilegiada que apenas B poderia solicitar.
Isso aconteceu com A
como smd
e B
como diagnosticd
. A função SMJobBless
de smb pode ser usada para instalar uma nova ferramenta auxiliar privilegiada (como root). Se um processo em execução como root entrar em contato com smd, nenhuma outra verificação será realizada.
Portanto, o serviço B é diagnosticd
porque é executado como root e pode ser usado para monitorar um processo, então, uma vez que a monitoração tenha começado, ele enviará várias mensagens por segundo.
Para realizar o ataque:
Inicie uma conexão com o serviço chamado
smd
usando o protocolo XPC padrão.Forme uma conexão secundária com
diagnosticd
. Contrariamente ao procedimento normal, em vez de criar e enviar duas novas portas mach, o direito de envio da porta do cliente é substituído por uma duplicata do direito de envio associado à conexãosmd
.Como resultado, as mensagens XPC podem ser despachadas para
diagnosticd
, mas as respostas dediagnosticd
são redirecionadas parasmd
. Parasmd
, parece que as mensagens tanto do usuário quanto dediagnosticd
estão originando da mesma conexão.
O próximo passo envolve instruir
diagnosticd
a iniciar a monitoração de um processo escolhido (potencialmente o do usuário). Concurrentemente, uma inundação de mensagens de rotina 1004 é enviada parasmd
. A intenção aqui é instalar uma ferramenta com privilégios elevados.Esta ação desencadeia uma condição de corrida dentro da função
handle_bless
. O timing é crucial: a chamada da funçãoxpc_connection_get_pid
deve retornar o PID do processo do usuário (pois a ferramenta privilegiada reside no pacote de aplicativo do usuário). No entanto, a funçãoxpc_connection_get_audit_token
, especificamente dentro da sub-rotinaconnection_is_authorized
, deve fazer referência ao token de auditoria pertencente aodiagnosticd
.
Variante 2: encaminhamento de resposta
Em um ambiente XPC (Comunicação entre Processos), embora os manipuladores de eventos não sejam executados simultaneamente, o tratamento de mensagens de resposta possui um comportamento único. Especificamente, existem dois métodos distintos para enviar mensagens que esperam uma resposta:
xpc_connection_send_message_with_reply
: Aqui, a mensagem XPC é recebida e processada em uma fila designada.xpc_connection_send_message_with_reply_sync
: Por outro lado, neste método, a mensagem XPC é recebida e processada na fila de despacho atual.
Essa distinção é crucial porque permite a possibilidade de pacotes de resposta serem analisados simultaneamente com a execução de um manipulador de eventos XPC. Notavelmente, embora _xpc_connection_set_creds
implemente bloqueio para proteger contra a sobrescrita parcial do token de auditoria, isso não se estende à proteção do objeto de conexão inteiro. Consequentemente, isso cria uma vulnerabilidade onde o token de auditoria pode ser substituído durante o intervalo entre a análise de um pacote e a execução de seu manipulador de eventos.
Para explorar essa vulnerabilidade, a seguinte configuração é necessária:
Dois serviços mach, referidos como
A
eB
, ambos capazes de estabelecer uma conexão.O serviço
A
deve incluir uma verificação de autorização para uma ação específica que apenasB
pode realizar (a aplicação do usuário não pode).O serviço
A
deve enviar uma mensagem que antecipa uma resposta.O usuário pode enviar uma mensagem para
B
para a qual ele responderá.
O processo de exploração envolve os seguintes passos:
Aguardar o serviço
A
enviar uma mensagem que espera uma resposta.Em vez de responder diretamente para
A
, a porta de resposta é sequestrada e usada para enviar uma mensagem para o serviçoB
.Posteriormente, uma mensagem envolvendo a ação proibida é despachada, com a expectativa de que seja processada simultaneamente com a resposta de **
B
.
Abaixo está uma representação visual do cenário de ataque descrito:
![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png)
Problemas de Descoberta
Dificuldades em Localizar Instâncias: A busca por instâncias de uso de
xpc_connection_get_audit_token
foi desafiadora, tanto estaticamente quanto dinamicamente.Metodologia: Frida foi utilizada para enganchar a função
xpc_connection_get_audit_token
, filtrando chamadas que não se originam de manipuladores de eventos. No entanto, esse método estava limitado ao processo enganchado e exigia uso ativo.Ferramentas de Análise: Ferramentas como IDA/Ghidra foram usadas para examinar serviços mach alcançáveis, mas o processo foi demorado, complicado por chamadas envolvendo o cache compartilhado dyld.
Limitações de Scripting: Tentativas de criar um script para a análise de chamadas para
xpc_connection_get_audit_token
a partir de blocosdispatch_async
foram dificultadas por complexidades na análise de blocos e interações com o cache compartilhado dyld.
A correção
Problemas Reportados: Um relatório foi enviado à Apple detalhando os problemas gerais e específicos encontrados dentro de
smd
.Resposta da Apple: A Apple abordou o problema em
smd
substituindoxpc_connection_get_audit_token
porxpc_dictionary_get_audit_token
.Natureza da Correção: A função
xpc_dictionary_get_audit_token
é considerada segura, pois recupera o token de auditoria diretamente da mensagem mach vinculada à mensagem XPC recebida. No entanto, não faz parte da API pública, semelhante axpc_connection_get_audit_token
.Ausência de uma Correção Mais Abrangente: Permanece incerto por que a Apple não implementou uma correção mais abrangente, como descartar mensagens que não se alinham com o token de auditoria salvo da conexão. A possibilidade de alterações legítimas no token de auditoria em certos cenários (por exemplo, uso de
setuid
) pode ser um fator.Status Atual: O problema persiste no iOS 17 e macOS 14, representando um desafio para aqueles que buscam identificá-lo e compreendê-lo.
Last updated