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

5.9 KiB

Extensiones del Kernel de macOS

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

Información básica

Las extensiones del kernel (Kexts) son paquetes con una extensión .kext que se cargan directamente en el espacio del kernel de macOS, proporcionando funcionalidad adicional al sistema operativo principal.

Requisitos

Obviamente, esto es tan poderoso que es complicado cargar una extensión del kernel. Estos son los requisitos que debe cumplir una extensión del kernel para poder cargarse:

  • Cuando se ingresa al modo de recuperación, las extensiones del kernel deben estar permitidas para cargarse:
  • La extensión del kernel debe estar firmada con un certificado de firma de código del kernel, que solo puede ser concedido por Apple. Quien revisará en detalle la empresa y las razones por las que se necesita.
  • La extensión del kernel también debe estar notarizada, Apple podrá verificarla en busca de malware.
  • Luego, el usuario root es el que puede cargar la extensión del kernel y los archivos dentro del paquete deben pertenecer a root.
  • Durante el proceso de carga, el paquete debe prepararse en una ubicación protegida y no root: /Library/StagedExtensions (requiere el permiso com.apple.rootless.storage.KernelExtensionManagement).
  • Finalmente, al intentar cargarla, el usuario recibirá una solicitud de confirmación y, si se acepta, se debe reiniciar la computadora para cargarla.

Proceso de carga

En Catalina era así: Es interesante destacar que el proceso de verificación ocurre en userland. Sin embargo, solo las aplicaciones con el permiso com.apple.private.security.kext-management pueden solicitar al kernel que cargue una extensión: kextcache, kextload, kextutil, kextd, syspolicyd

  1. kextutil inicia el proceso de verificación para cargar una extensión
  • Se comunicará con kextd enviando un servicio Mach.
  1. kextd verificará varias cosas, como la firma
  • Se comunicará con syspolicyd para verificar si se puede cargar la extensión.
  1. syspolicyd solicitará al usuario si la extensión no se ha cargado previamente.
  • syspolicyd informará el resultado a kextd
  1. kextd finalmente podrá indicarle al kernel que cargue la extensión

Si kextd no está disponible, kextutil puede realizar las mismas verificaciones.

Referencias

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