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
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Basic Information
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.
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 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ãocom.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
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 parakextd
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é-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.
Kernelcache Local
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
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 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:
{% code overflow="wrap" %}
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
{% endcode %}
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 em:
# 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
- https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/
- https://www.youtube.com/watch?v=hGKOskSiaQo
{% hint style="success" %}
Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud.