macOS Kernel Extensions & Debugging
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
As extensões do kernel (Kexts) são pacotes com uma extensão .kext
que são carregados diretamente no espaço do kernel do macOS, fornecendo funcionalidade adicional ao sistema operacional principal.
Obviamente, isso é tão poderoso que é complicado carregar uma extensão do kernel. Estes são os requisitos que uma extensão do kernel deve atender para ser carregada:
Ao entrar no modo de recuperação, as extensões do kernel devem ser permitidas para serem carregadas:
A extensão do kernel deve ser assinada com um certificado de assinatura de código do kernel, que só pode ser concedido pela Apple. Quem irá revisar em detalhes a empresa e as razões pelas quais é necessário.
A extensão do kernel também deve ser notarizada, a Apple poderá verificá-la em busca de malware.
Então, o usuário root é quem pode carregar a extensão do kernel e os arquivos dentro do pacote devem pertencer ao root.
Durante o processo de upload, o pacote deve ser preparado em um local protegido não-root: /Library/StagedExtensions
(requer a concessão com.apple.rootless.storage.KernelExtensionManagement
).
Finalmente, ao tentar carregá-la, o usuário receberá um pedido de confirmação e, se aceito, o computador deve ser reiniciado para carregá-la.
No Catalina era assim: É interessante notar que o processo de verificação ocorre no userland. No entanto, apenas aplicativos com a concessão com.apple.private.security.kext-management
podem solicitar ao kernel que carregue uma extensão: kextcache
, kextload
, kextutil
, kextd
, syspolicyd
kextutil
cli inicia o processo de verificação para carregar uma extensão
Ele se comunicará com kextd
enviando usando um serviço Mach.
kextd
verificará várias coisas, como a assinatura
Ele se comunicará com syspolicyd
para verificar se a extensão pode ser carregada.
syspolicyd
pedirá ao usuário se a extensão não foi carregada anteriormente.
syspolicyd
relatará o resultado para kextd
kextd
finalmente poderá dizer ao kernel para carregar a extensão
Se kextd
não estiver disponível, kextutil
pode realizar as mesmas verificações.
Embora as extensões do kernel sejam esperadas em /System/Library/Extensions/
, se você for para esta pasta você não encontrará nenhum binário. Isso se deve ao kernelcache e, para reverter um .kext
, você precisa encontrar uma maneira de obtê-lo.
O kernelcache é uma versão pré-compilada e pré-vinculada do kernel XNU, juntamente com drivers e extensões do kernel essenciais. 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 execução do kernel e drivers cruciais disponíveis, reduzindo o tempo e os recursos que seriam gastos carregando e vinculando dinamicamente esses componentes no momento da inicialização.
No iOS, está localizado em /System/Library/Caches/com.apple.kernelcaches/kernelcache
no macOS você pode encontrá-lo com: find / -name "kernelcache" 2>/dev/null
No meu caso no macOS, eu o encontrei em:
/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache
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.
Ele é geralmente composto pelos seguintes componentes:
Carga útil (IM4P):
Frequentemente compactada (LZFSE4, LZSS, …)
Opcionalmente criptografada
Manifesto (IM4M):
Contém Assinatura
Dicionário adicional de Chave/Valor
Informações de Restauração (IM4R):
Também conhecido como APNonce
Impede a repetição de algumas atualizações
OPCIONAL: Geralmente isso não é encontrado
Descompacte o Kernelcache:
No https://github.com/dortania/KdkSupportPkg/releases é possível encontrar todos os kits de depuração do kernel. Você pode baixá-lo, montá-lo, abri-lo com a ferramenta Suspicious Package, acessar a pasta .kext
e extrair.
Verifique os símbolos com:
Às vezes, a Apple libera kernelcache com símbolos. Você pode baixar alguns firmwares com símbolos seguindo os links nessas páginas. Os firmwares conterão o kernelcache entre outros arquivos.
Para extrair os arquivos, comece mudando a extensão de .ipsw
para .zip
e descompacte.
Após extrair o firmware, você obterá um arquivo como: kernelcache.release.iphone14
. Está no formato IMG4, você pode extrair as informações interessantes com:
Verifique se o kernelcache possui símbolos com
Com isso, agora podemos extrair todas as extensões ou a que você está interessado em:
Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)