hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md

9.9 KiB

macOS Kernel Extensions & Debugging

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

As extensões do kernel (Kexts) são pacotes com a extensão .kext que são carregados diretamente no espaço do kernel do macOS, fornecendo funcionalidade adicional ao sistema operacional principal.

Requirements

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 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.

Loading process

Em Catalina era assim: É interessante notar que o processo de verificação ocorre em 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

  1. kextutil cli inicia o processo de verificação para carregar uma extensão
  • Ele se comunicará com kextd enviando usando um serviço Mach.
  1. kextd verificará várias coisas, como a assinatura
  • Ele se comunicará com syspolicyd para verificar se a extensão pode ser carregada.
  1. syspolicyd pedirá ao usuário se a extensão não foi carregada anteriormente.
  • syspolicyd relatará o resultado para kextd
  1. 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.

Enumeration (loaded kexts)

# Get loaded kernel extensions
kextstat

# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1

Kernelcache

{% hint style="danger" %} 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. {% endhint %}

O kernelcache é uma versão pré-compilada e pré-linkada 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.

Kernelcache Local

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
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

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.

Ele é geralmente composto pelos seguintes componentes:

  • Carga útil (IM4P):
  • Frequentemente compactada (LZFSE4, LZSS, …)
  • Opcionalmente criptografada
  • Manifesto (IM4M):
  • Contém a 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:

# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Download

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:

nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l

À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:

pyimg4:

{% code overflow="wrap" %}

pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

{% endcode %}

img4tool:

img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Inspecionando kernelcache

Verifique se o kernelcache possui símbolos com

nm -a kernelcache.release.iphone14.e | wc -l

Com isso, agora podemos extrair todas as extensões ou a que você está interessado:

# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e

# Extract all
kextex_all kernelcache.release.iphone14.e

# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l

Depuração

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}