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
- 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.
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 requeridosamfi_allow_any_signature
: Permite cualquier firma de c贸digocs_enforcement_disable
: Argumento a nivel de sistema utilizado para deshabilitar la aplicaci贸n de la firma de c贸digoamfi_prevent_old_entitled_platform_binaries
: Anula los binarios de plataforma con derechosamfi_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谩 1cred_label_associate
: Actualiza la ranura de etiqueta mac de AMFI con la etiquetacred_label_destroy
: Elimina la ranura de etiqueta mac de AMFIcred_label_init
: Mueve 0 en la ranura de etiqueta mac de AMFIcred_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 confianzapolicy_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 deamfi_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 derechoget-task-allow
lo permite, los derechostask_for_pid-allow
son permitidos y los binarios con el mismo TeamID.proc_check_expose_task
: hace cumplir los derechosamfi_exc_action_check_exception_send
: Se env铆a un mensaje de excepci贸n al depuradoramfi_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 comoget-task-allow
que permite a otros procesos obtener el puerto de tareas ytask_for_pid-allow
, que permite al proceso obtener los puertos de tareas de otros procesos. Si ninguno de esos, llama aamfid permitunrestricteddebugging
para verificar si est谩 permitido.proc_check_mprotect
: Niega si se llama amprotect
con la banderaVM_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 establececs_hard | cs_kill
, lo que matar谩 el proceso si alguna de las p谩ginas se vuelve inv谩lidavnode_check_getextattr
: MacOS: Verificacom.apple.root.installed
yisVnodeQuarantined()
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 yamfid
-
proc_check_run_cs_invalid
: Intercepta llamadas aptrace()
(PT_ATTACH
yPT_TRACE_ME
). Verifica si alguno de los derechosget-task-allow
,run-invalid-allow
yrun-unsigned-code
y si ninguno, verifica si se permite la depuraci贸n. proc_check_map_anon
: Si se llama a mmap con la banderaMAP_JIT
, AMFI verificar谩 el derechodynamic-codesigning
.
AMFI.kext
tambi茅n expone una API para otras extensiones del kernel, y es posible encontrar sus dependencias con:
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:
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
- 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.