macOS - AMFI - AppleMobileFileIntegrity

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

AppleMobileFileIntegrity.kext y amfid

Se centra en hacer cumplir la integridad del c贸digo que se ejecuta en el sistema, proporcionando la l贸gica detr谩s de la verificaci贸n de la firma de c贸digo de XNU. Tambi茅n es capaz de verificar derechos y manejar otras tareas sensibles, como permitir la depuraci贸n u obtener puertos de tarea.

Adem谩s, para algunas operaciones, el kext prefiere contactar al espacio de usuario que ejecuta el demonio /usr/libexec/amfid. Esta relaci贸n de confianza ha sido abusada en varios jailbreaks.

AMFI utiliza pol铆ticas de MACF y registra sus hooks en el momento en que se inicia. Adem谩s, prevenir su carga o descarga podr铆a desencadenar un p谩nico del kernel. Sin embargo, hay algunos argumentos de arranque que permiten debilitar AMFI:

  • amfi_unrestricted_task_for_pid: Permite que task_for_pid se permita sin derechos requeridos
  • amfi_allow_any_signature: Permite cualquier firma de c贸digo
  • cs_enforcement_disable: Argumento a nivel de sistema utilizado para deshabilitar la aplicaci贸n de la firma de c贸digo
  • amfi_prevent_old_entitled_platform_binaries: Anula los binarios de plataforma con derechos
  • amfi_get_out_of_my_way: Desactiva amfi por completo

Estas son algunas de las pol铆ticas de MACF que registra:

  • cred_check_label_update_execve: Se realizar谩 una actualizaci贸n de etiqueta y devolver谩 1
  • cred_label_associate: Actualiza la ranura de etiqueta mac de AMFI con la etiqueta
  • cred_label_destroy: Elimina la ranura de etiqueta mac de AMFI
  • cred_label_init: Mueve 0 en la ranura de etiqueta mac de AMFI
  • cred_label_update_execve: Verifica los derechos del proceso para ver si se le debe permitir modificar las etiquetas.
  • file_check_mmap: Verifica si mmap est谩 adquiriendo memoria y configur谩ndola como ejecutable. En ese caso, verifica si se necesita validaci贸n de biblioteca y, si es as铆, llama a la funci贸n de validaci贸n de biblioteca.
  • file_check_library_validation: Llama a la funci贸n de validaci贸n de biblioteca que verifica, entre otras cosas, si un binario de plataforma est谩 cargando otro binario de plataforma o si el proceso y el nuevo archivo cargado tienen el mismo TeamID. Ciertos derechos tambi茅n permitir谩n cargar cualquier biblioteca.
  • policy_initbsd: Configura claves NVRAM de confianza
  • policy_syscall: Verifica pol铆ticas DYLD como si el binario tiene segmentos sin restricciones, si debe permitir variables de entorno... esto tambi茅n se llama cuando un proceso se inicia a trav茅s de amfi_check_dyld_policy_self().
  • proc_check_inherit_ipc_ports: Verifica si, cuando un proceso ejecuta un nuevo binario, otros procesos con derechos de ENV脥O sobre el puerto de tarea del proceso deben mantenerlos o no. Se permiten binarios de plataforma, el derecho get-task-allow lo permite, los derechos task_for_pid-allow son permitidos y los binarios con el mismo TeamID.
  • proc_check_expose_task: hace cumplir los derechos
  • amfi_exc_action_check_exception_send: Se env铆a un mensaje de excepci贸n al depurador
  • amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update: Ciclo de vida de la etiqueta durante el manejo de excepciones (depuraci贸n)
  • proc_check_get_task: Verifica derechos como get-task-allow que permite a otros procesos obtener el puerto de tareas y task_for_pid-allow, que permite al proceso obtener los puertos de tareas de otros procesos. Si ninguno de esos, llama a amfid permitunrestricteddebugging para verificar si est谩 permitido.
  • proc_check_mprotect: Niega si se llama a mprotect con la bandera VM_PROT_TRUSTED, que indica que la regi贸n debe ser tratada como si tuviera una firma de c贸digo v谩lida.
  • vnode_check_exec: Se llama cuando se cargan archivos ejecutables en memoria y establece cs_hard | cs_kill, lo que matar谩 el proceso si alguna de las p谩ginas se vuelve inv谩lida
  • vnode_check_getextattr: MacOS: Verifica com.apple.root.installed y isVnodeQuarantined()
  • vnode_check_setextattr: Como obtener + com.apple.private.allow-bless y derecho equivalente de instalador interno
  • vnode_check_signature: C贸digo que llama a XNU para verificar la firma de c贸digo utilizando derechos, cach茅 de confianza y amfid
  • proc_check_run_cs_invalid: Intercepta llamadas a ptrace() (PT_ATTACH y PT_TRACE_ME). Verifica si alguno de los derechos get-task-allow, run-invalid-allow y run-unsigned-code y si ninguno, verifica si se permite la depuraci贸n.
  • proc_check_map_anon: Si se llama a mmap con la bandera MAP_JIT, AMFI verificar谩 el derecho dynamic-codesigning.

AMFI.kext tambi茅n expone una API para otras extensiones del kernel, y es posible encontrar sus dependencias con:

bash
kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
8   com.apple.kec.corecrypto
19   com.apple.driver.AppleMobileFileIntegrity
22   com.apple.security.sandbox
24   com.apple.AppleSystemPolicy
67   com.apple.iokit.IOUSBHostFamily
70   com.apple.driver.AppleUSBTDM
71   com.apple.driver.AppleSEPKeyStore
74   com.apple.iokit.EndpointSecurity
81   com.apple.iokit.IOUserEthernet
101   com.apple.iokit.IO80211Family
102   com.apple.driver.AppleBCMWLANCore
118   com.apple.driver.AppleEmbeddedUSBHost
134   com.apple.iokit.IOGPUFamily
135   com.apple.AGXG13X
137   com.apple.iokit.IOMobileGraphicsFamily
138   com.apple.iokit.IOMobileGraphicsFamily-DCP
162   com.apple.iokit.IONVMeFamily

amfid

Este es el demonio que se ejecuta en modo usuario que AMFI.kext utilizar谩 para verificar las firmas de c贸digo en modo usuario.
Para que AMFI.kext se comunique con el demonio, utiliza mensajes mach a trav茅s del puerto HOST_AMFID_PORT, que es el puerto especial 18.

Ten en cuenta que en macOS ya no es posible que los procesos root secuestren puertos especiales, ya que est谩n protegidos por SIP y solo launchd puede acceder a ellos. En iOS se verifica que el proceso que env铆a la respuesta tenga el CDHash codificado de amfid.

Es posible ver cu谩ndo se solicita a amfid que verifique un binario y la respuesta de este depur谩ndolo y estableciendo un punto de interrupci贸n en mach_msg.

Una vez que se recibe un mensaje a trav茅s del puerto especial, MIG se utiliza para enviar cada funci贸n a la funci贸n que est谩 llamando. Las funciones principales fueron revertidas y explicadas dentro del libro.

Provisioning Profiles

Un perfil de aprovisionamiento se puede utilizar para firmar c贸digo. Hay perfiles de Desarrollador que se pueden utilizar para firmar c贸digo y probarlo, y perfiles Empresariales que se pueden utilizar en todos los dispositivos.

Despu茅s de que una aplicaci贸n se env铆a a la Apple Store, si es aprobada, es firmada por Apple y el perfil de aprovisionamiento ya no es necesario.

Un perfil generalmente utiliza la extensi贸n .mobileprovision o .provisionprofile y se puede volcar con:

bash
openssl asn1parse -inform der -in /path/to/profile

# Or

security cms -D -i /path/to/profile

Aunque a veces se les llama certificados, estos perfiles de aprovisionamiento tienen m谩s que un certificado:

  • AppIDName: El Identificador de Aplicaci贸n
  • AppleInternalProfile: Designa esto como un perfil interno de Apple
  • ApplicationIdentifierPrefix: Precedido al AppIDName (igual que TeamIdentifier)
  • CreationDate: Fecha en formato YYYY-MM-DDTHH:mm:ssZ
  • DeveloperCertificates: Un array de (usualmente uno) certificado(s), codificado como datos Base64
  • Entitlements: Los derechos permitidos con derechos para este perfil
  • ExpirationDate: Fecha de expiraci贸n en formato YYYY-MM-DDTHH:mm:ssZ
  • Name: El Nombre de la Aplicaci贸n, el mismo que AppIDName
  • ProvisionedDevices: Un array (para certificados de desarrollador) de UDIDs para los cuales este perfil es v谩lido
  • ProvisionsAllDevices: Un booleano (verdadero para certificados empresariales)
  • TeamIdentifier: Un array de (usualmente uno) cadena(s) alfanum茅rica(s) utilizadas para identificar al desarrollador para prop贸sitos de interacci贸n entre aplicaciones
  • TeamName: Un nombre legible por humanos utilizado para identificar al desarrollador
  • TimeToLive: Validez (en d铆as) del certificado
  • UUID: Un Identificador 脷nico Universal para este perfil
  • Version: Actualmente establecido en 1

Tenga en cuenta que la entrada de derechos contendr谩 un conjunto restringido de derechos y el perfil de aprovisionamiento solo podr谩 otorgar esos derechos espec铆ficos para evitar otorgar derechos privados de Apple.

Tenga en cuenta que los perfiles generalmente se encuentran en /var/MobileDeviceProvisioningProfiles y es posible verificarlos con security cms -D -i /path/to/profile

libmis.dyld

Esta es la biblioteca externa que amfid llama para preguntar si debe permitir algo o no. Esto ha sido abusado hist贸ricamente en el jailbreak al ejecutar una versi贸n con puerta trasera que permitir铆a todo.

En macOS esto est谩 dentro de MobileDevice.framework.

AMFI Trust Caches

iOS AMFI mantiene una lista de hashes conocidos que est谩n firmados ad-hoc, llamada Trust Cache y se encuentra en la secci贸n __TEXT.__const del kext. Tenga en cuenta que en operaciones muy espec铆ficas y sensibles es posible extender este Trust Cache con un archivo externo.

References

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks