Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHubHackTricks e HackTricks Cloud.
Informações Básicas
XPC, que significa XNU (o kernel usado pelo macOS) inter-Process Communication, é um framework para comunicação entre processos no macOS e iOS. O XPC fornece um mecanismo para realizar chamadas de métodos seguras e assíncronas entre diferentes processos no sistema. É parte do paradigma de segurança da Apple, permitindo a criação de aplicações com separação de privilégios onde cada componente executa com apenas as permissões necessárias para realizar seu trabalho, limitando assim o potencial dano de um processo comprometido.
O XPC usa uma forma de Comunicação Inter-Processos (IPC), que é um conjunto de métodos para diferentes programas em execução no mesmo sistema enviarem dados um para o outro.
Os principais benefícios do XPC incluem:
Segurança: Ao separar o trabalho em diferentes processos, cada processo pode ser concedido apenas as permissões de que precisa. Isso significa que mesmo que um processo seja comprometido, sua capacidade de causar danos é limitada.
Estabilidade: O XPC ajuda a isolar falhas no componente onde ocorrem. Se um processo falha, ele pode ser reiniciado sem afetar o restante do sistema.
Desempenho: O XPC permite fácil concorrência, pois diferentes tarefas podem ser executadas simultaneamente em diferentes processos.
A única desvantagem é que separar uma aplicação em vários processos fazendo-os comunicar via XPC é menos eficiente. Mas nos sistemas atuais isso quase não é perceptível e os benefícios são melhores.
Serviços XPC Específicos de Aplicações
Os componentes XPC de uma aplicação estão dentro da própria aplicação. Por exemplo, no Safari você pode encontrá-los em /Applications/Safari.app/Contents/XPCServices. Eles têm a extensão .xpc (como com.apple.Safari.SandboxBroker.xpc) e são também bundles com o binário principal dentro dele: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker e um Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Como você deve estar pensando, um componente XPC terá diferentes direitos e privilégios do que os outros componentes XPC ou o binário principal do aplicativo. EXCETO se um serviço XPC for configurado com JoinExistingSession definido como “True” no seu arquivo Info.plist. Neste caso, o serviço XPC será executado na mesma sessão de segurança que a aplicação que o chamou.
Os serviços XPC são iniciados pelo launchd quando necessário e encerrados assim que todas as tarefas estão completas para liberar recursos do sistema. Componentes XPC específicos de aplicações só podem ser utilizados pela aplicação, reduzindo assim o risco associado a potenciais vulnerabilidades.
Serviços XPC de Sistema
Serviços XPC de sistema estão acessíveis a todos os usuários. Esses serviços, seja do tipo launchd ou Mach, precisam ser definidos em arquivos plist localizados em diretórios especificados como /System/Library/LaunchDaemons, /Library/LaunchDaemons, /System/Library/LaunchAgents, ou /Library/LaunchAgents.
Esses arquivos plist terão uma chave chamada MachServices com o nome do serviço, e uma chave chamada Program com o caminho para o binário:
Os que estão em LaunchDameons são executados pelo root. Portanto, se um processo não privilegiado puder se comunicar com um deles, ele poderá escalar privilégios.
Mensagens de Eventos XPC
Aplicações podem se inscrever em diferentes mensagens de eventos, permitindo que sejam iniciadas sob demanda quando tais eventos ocorrerem. A configuração para esses serviços é feita nos arquivos plist do launchd, localizados nos mesmos diretórios que os anteriores e contendo uma chave extra LaunchEvent.
Verificação do Processo de Conexão XPC
Quando um processo tenta chamar um método via uma conexão XPC, o serviço XPC deve verificar se esse processo tem permissão para conectar. Aqui estão as maneiras comuns de verificar isso e as armadilhas comuns:
A Apple também permite que aplicativos configurem alguns direitos e como obtê-los para que, se o processo de chamada tiver esses direitos, ele seja permitido chamar um método do serviço XPC:
Para farejar as mensagens XPC, você pode usar xpcspy que utiliza Frida.
# Installpip3installxpcspypip3installxpcspy--no-deps# To not make xpcspy install Frida 15 and downgrade your Frida installation# Start sniffingxpcspy-U-r-W<bundle-id>## Using filters (i: for input, o: for output)xpcspy-U<prog-name>-t'i:com.apple.*'-t'o:com.apple.*'-r
# Compile the server & clientgccxpc_server.c-oxpc_servergccxpc_client.c-oxpc_client# Save server on it's locationcpxpc_server/tmp# Load daemonsudocpxyz.hacktricks.service.plist/Library/LaunchDaemonssudolaunchctlload/Library/LaunchDaemons/xyz.hacktricks.service.plist# Call client./xpc_client# Cleansudolaunchctlunload/Library/LaunchDaemons/xyz.hacktricks.service.plistsudorm/Library/LaunchDaemons/xyz.hacktricks.service.plist/tmp/xpc_server
Exemplo de Código em Objective-C para Comunicação XPC
```bash # Compile the server & client gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client