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

6 KiB

Extensões de Kernel do macOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Informações básicas

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

Requisitos

Obviamente, isso é tão poderoso que é complicado carregar uma extensão de kernel. Estes são os requisitos que uma extensão de kernel deve atender para ser carregada:

  • Ao entrar no modo de recuperação, as extensões de kernel devem estar habilitadas para carregamento:
  • A extensão de kernel deve estar assinada com um certificado de assinatura de código de kernel, que só pode ser concedido pela Apple. Eles revisarão detalhadamente a empresa e as razões pelas quais é necessária.
  • A extensão de kernel também deve ser notarizada, a Apple poderá verificá-la em busca de malware.
  • Em seguida, o usuário root é quem pode carregar a extensão de kernel e os arquivos dentro do pacote devem pertencer ao root.
  • Durante o processo de carregamento, o pacote deve ser preparado em uma localização protegida sem raiz: /Library/StagedExtensions (requer a concessão com.apple.rootless.storage.KernelExtensionManagement)
  • Por fim, ao tentar carregá-lo, o usuário receberá uma solicitação de confirmação e, se aceita, o computador deve ser reiniciado para carregá-lo.

Processo de carregamento

No Catalina, era assim: É interessante destacar 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

  1. O cli kextutil inicia o processo de verificação para carregar uma extensão
  • Ele se comunica com o kextd usando um serviço Mach
  1. O kextd verifica várias coisas, como a assinatura
  • Ele se comunica com o syspolicyd para verificar se a extensão pode ser carregada
  1. O syspolicyd pergunta ao usuário se a extensão não foi carregada anteriormente
  • O syspolicyd informa o resultado ao kextd
  1. O kextd finalmente pode instruir o kernel a carregar a extensão

Se o kextd não estiver disponível, o kextutil pode realizar as mesmas verificações.

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥