macOS Kernel & System Extensions
Kernel XNU
O núcleo do macOS é o XNU, que significa "X is Not Unix". Esse kernel é fundamentalmente composto pelo micronúcleo Mach (a ser discutido posteriormente), e elementos do Berkeley Software Distribution (BSD). O XNU também fornece uma plataforma para drivers de kernel por meio de um sistema chamado I/O Kit. O kernel XNU faz parte do projeto de código aberto Darwin, o que significa que seu código-fonte é livremente acessível.
Do ponto de vista de um pesquisador de segurança ou de um desenvolvedor Unix, o macOS pode parecer bastante similar a um sistema FreeBSD com uma GUI elegante e uma série de aplicativos personalizados. A maioria dos aplicativos desenvolvidos para o BSD compilará e será executada no macOS sem a necessidade de modificações, pois as ferramentas de linha de comando familiares aos usuários Unix estão todas presentes no macOS. No entanto, como o kernel XNU incorpora o Mach, existem algumas diferenças significativas entre um sistema semelhante a Unix tradicional e o macOS, e essas diferenças podem causar problemas potenciais ou fornecer vantagens únicas.
Versão de código aberto do XNU: https://opensource.apple.com/source/xnu/
Mach
Mach é um micronúcleo projetado para ser compatível com o UNIX. Um de seus princípios de design chave foi minimizar a quantidade de código em execução no espaço do kernel e, em vez disso, permitir que muitas funções típicas do kernel, como sistema de arquivos, rede e E/S, sejam executadas como tarefas em nível de usuário.
No XNU, o Mach é responsável por muitas das operações críticas de baixo nível que um kernel normalmente manipula, como escalonamento de processador, multitarefa e gerenciamento de memória virtual.
BSD
O kernel XNU também incorpora uma quantidade significativa de código derivado do projeto FreeBSD. Esse código é executado como parte do kernel junto com o Mach, no mesmo espaço de endereço. No entanto, o código do FreeBSD dentro do XNU pode diferir substancialmente do código original do FreeBSD porque foram necessárias modificações para garantir sua compatibilidade com o Mach. O FreeBSD contribui para muitas operações de kernel, incluindo:
Gerenciamento de processos
Manipulação de sinais
Mecanismos básicos de segurança, incluindo gerenciamento de usuário e grupo
Infraestrutura de chamada de sistema
Pilha TCP/IP e soquetes
Firewall e filtragem de pacotes
Compreender a interação entre BSD e Mach pode ser complexo, devido aos seus diferentes frameworks conceituais. Por exemplo, o BSD usa processos como sua unidade fundamental de execução, enquanto o Mach opera com base em threads. Essa discrepância é conciliada no XNU associando cada processo BSD a uma tarefa Mach que contém exatamente uma thread Mach. Quando a chamada de sistema fork() do BSD é usada, o código do BSD dentro do kernel usa funções do Mach para criar uma estrutura de tarefa e uma thread.
Além disso, Mach e BSD mantêm modelos de segurança diferentes: o modelo de segurança do Mach é baseado em direitos de porta, enquanto o modelo de segurança do BSD opera com base na propriedade do processo. Disparidades entre esses dois modelos ocasionalmente resultaram em vulnerabilidades de escalonamento de privilégios locais. Além das chamadas de sistema típicas, também existem armadilhas do Mach que permitem que programas em espaço de usuário interajam com o kernel. Esses elementos diferentes juntos formam a arquitetura híbrida e multifacetada do kernel macOS.
I/O Kit - Drivers
O I/O Kit é um framework de driver de dispositivo orientado a objetos de código aberto no kernel XNU, que lida com drivers de dispositivo carregados dinamicamente. Ele permite que código modular seja adicionado ao kernel dinamicamente, suportando hardware diversificado.
macOS IOKitIPC - Comunicação entre Processos
macOS IPC - Inter Process CommunicationKernelcache
O kernelcache é uma versão pré-compilada e pré-linkada do kernel XNU, juntamente com drivers de dispositivo essenciais e extensões de kernel. Ele é armazenado em um formato compactado e é descompactado na memória durante o processo de inicialização. O kernelcache facilita um tempo de inicialização mais rápido ao ter uma versão pronta para ser executada do kernel e drivers essenciais disponíveis, reduzindo o tempo e os recursos que seriam gastos dinamicamente carregando e vinculando esses componentes no momento da inicialização.
No iOS, ele está localizado em /System/Library/Caches/com.apple.kernelcaches/kernelcache
no macOS você pode encontrá-lo com find / -name kernelcache 2>/dev/null
ou mdfind kernelcache | grep kernelcache
É possível executar kextstat
para verificar as extensões de kernel carregadas.
IMG4
O formato de arquivo IMG4 é um formato de contêiner usado pela Apple em seus dispositivos iOS e macOS para armazenar e verificar com segurança componentes de firmware (como kernelcache). O formato IMG4 inclui um cabeçalho e várias tags que encapsulam diferentes partes de dados, incluindo a carga útil real (como um kernel ou bootloader), uma assinatura e um conjunto de propriedades de manifesto. O formato suporta verificação criptográfica, permitindo que o dispositivo confirme a autenticidade e integridade do componente de firmware antes de executá-lo.
Geralmente é composto pelos seguintes componentes:
Carga útil (IM4P):
Frequentemente comprimido (LZFSE4, LZSS, ...)
Opcionalmente criptografado
Manifesto (IM4M):
Contém Assinatura
Dicionário Adicional Chave/Valor
Informações de Restauração (IM4R):
Também conhecido como APNonce
Impede a reprodução de algumas atualizações
OPCIONAL: Geralmente isso não é encontrado
Descompacte o Kernelcache:
Símbolos do Kernelcache
Às vezes a Apple lança o kernelcache com símbolos. Você pode baixar alguns firmwares com símbolos seguindo os links em https://theapplewiki.com.
IPSW
Estes são firmwares da Apple que você pode baixar em https://ipsw.me/. Entre outros arquivos, ele conterá o kernelcache. Para extrair os arquivos, você pode simplesmente descompactá-lo.
Após extrair o firmware, você obterá um arquivo como: kernelcache.release.iphone14
. Está em formato IMG4, você pode extrair as informações interessantes com:
Você pode verificar os símbolos extraídos do kernelcache com: nm -a kernelcache.release.iphone14.e | wc -l
Com isso, agora podemos extrair todas as extensões ou a que você está interessado em:
Extensões de Kernel do macOS
O macOS é super restritivo ao carregar Extensões de Kernel (.kext) devido aos altos privilégios que o código terá ao ser executado. Na verdade, por padrão, é virtualmente impossível (a menos que seja encontrada uma forma de contornar).
macOS Kernel ExtensionsExtensões de Sistema do macOS
Em vez de usar Extensões de Kernel, o macOS criou as Extensões de Sistema, que oferecem APIs em nível de usuário para interagir com o kernel. Dessa forma, os desenvolvedores podem evitar o uso de extensões de kernel.
macOS System ExtensionsReferências
Last updated