macOS TCC Bypasses
Por funcionalidad
Salto de Escritura
Esto no es un salto, es simplemente cómo funciona TCC: No protege de la escritura. Si Terminal no tiene acceso para leer el Escritorio de un usuario, aún puede escribir en él:
El atributo extendido com.apple.macl
se agrega al nuevo archivo para dar acceso a la aplicación creadora a leerlo.
TCC ClickJacking
Es posible colocar una ventana sobre el prompt de TCC para que el usuario lo acepte sin darse cuenta. Puedes encontrar un PoC en TCC-ClickJacking.
Solicitud de TCC por nombre arbitrario
El atacante puede crear aplicaciones con cualquier nombre (por ejemplo, Finder, Google Chrome...) en el Info.plist
y hacer que solicite acceso a alguna ubicación protegida por TCC. El usuario pensará que la aplicación legítima es la que solicita este acceso.
Además, es posible quitar la aplicación legítima del Dock y poner la falsa en su lugar, por lo que cuando el usuario haga clic en la falsa (que puede usar el mismo icono) podría llamar a la legítima, solicitar permisos de TCC y ejecutar un malware, haciendo creer al usuario que la aplicación legítima solicitó el acceso.
Más información y PoC en:
pagemacOS Privilege EscalationBypass de SSH
Por defecto, un acceso a través de SSH solía tener "Acceso completo al disco". Para deshabilitar esto, es necesario tenerlo listado pero deshabilitado (eliminarlo de la lista no eliminará esos privilegios):
Aquí puedes encontrar ejemplos de cómo algunos malwares han logrado evadir esta protección:
Ten en cuenta que ahora, para poder habilitar SSH necesitas Acceso completo al disco
Manejar extensiones - CVE-2022-26767
El atributo com.apple.macl
se otorga a los archivos para darle a una aplicación específica permisos para leerlo. Este atributo se establece cuando se arrastra y suelta un archivo sobre una aplicación, o cuando un usuario hace doble clic en un archivo para abrirlo con la aplicación predeterminada.
Por lo tanto, un usuario podría registrar una aplicación maliciosa para manejar todas las extensiones y llamar a los Servicios de Inicio para abrir cualquier archivo (por lo que el archivo malicioso obtendrá acceso para leerlo).
iCloud
Con el permiso com.apple.private.icloud-account-access
es posible comunicarse con el servicio XPC com.apple.iCloudHelper
que proporcionará tokens de iCloud.
iMovie y Garageband tenían este permiso y otros que permitían.
Para obtener más información sobre el exploit para obtener tokens de iCloud de ese permiso, consulta la charla: #OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents / Automatización
Una aplicación con el permiso kTCCServiceAppleEvents
podrá controlar otras aplicaciones. Esto significa que podría abusar de los permisos otorgados a las otras aplicaciones.
Para obtener más información sobre Apple Scripts, consulta:
pagemacOS Apple ScriptsPor ejemplo, si una aplicación tiene permiso de Automatización sobre iTerm
, por ejemplo en este caso Terminal
tiene acceso sobre iTerm:
Sobre iTerm
Terminal, que no tiene Acceso completo al disco, puede llamar a iTerm, que sí lo tiene, y usarlo para realizar acciones:
Sobre Finder
O si una aplicación tiene acceso sobre Finder, podría ejecutar un script como este:
Por comportamiento de la aplicación
CVE-2020–9934 - TCC
El demonio tccd de espacio de usuario está utilizando la variable de entorno HOME
para acceder a la base de datos de usuarios de TCC desde: $HOME/Library/Application Support/com.apple.TCC/TCC.db
Según esta publicación en Stack Exchange y debido a que el demonio TCC se está ejecutando a través de launchd
dentro del dominio del usuario actual, es posible controlar todas las variables de entorno que se le pasan.
Por lo tanto, un atacante podría establecer la variable de entorno $HOME
en launchctl
para que apunte a un directorio controlado, reiniciar el demonio TCC, y luego modificar directamente la base de datos de TCC para otorgarse a sí mismo todos los permisos de TCC disponibles sin solicitar nunca al usuario final.
PoC:
CVE-2021-30761 - Notas
Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea una nota, esta se crea en una ubicación no protegida. Por lo tanto, se podía pedir a las notas que copiaran un archivo protegido en una nota (en una ubicación no protegida) y luego acceder al archivo:
CVE-2021-30782 - Translocación
El binario /usr/libexec/lsd
con la biblioteca libsecurity_translocate
tenía el permiso com.apple.private.nullfs_allow
, lo que le permitía crear un montaje nullfs y tenía el permiso com.apple.private.tcc.allow
con kTCCServiceSystemPolicyAllFiles
para acceder a todos los archivos.
Era posible agregar el atributo de cuarentena a "Library", llamar al servicio XPC com.apple.security.translocation
y luego mapearía Library a $TMPDIR/AppTranslocation/d/d/Library
donde todos los documentos dentro de Library podían ser accedidos.
CVE-2023-38571 - Música y TV
Música
tiene una característica interesante: cuando está en ejecución, importará los archivos que se arrastren a ~/Music/Music/Media.localized/Automatically Add to Music.localized
a la "biblioteca multimedia" del usuario. Además, llama a algo como: rename(a, b);
donde a
y b
son:
a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"
b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3
Este comportamiento de rename(a, b);
es vulnerable a una Condición de Carrera, ya que es posible colocar dentro de la carpeta Automatically Add to Music.localized
un archivo falso de TCC.db y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a ~/Library/Application Support/com.apple.TCC
/.
SQLITE_SQLLOG_DIR - CVE-2023-32422
Si SQLITE_SQLLOG_DIR="ruta/carpeta"
básicamente significa que cualquier base de datos abierta se copia en esa ruta. En este CVE, este control se abusó para escribir dentro de una base de datos SQLite que va a ser abierta por un proceso con FDA la base de datos TCC, y luego abusar de SQLITE_SQLLOG_DIR
con un enlace simbólico en el nombre de archivo para que cuando se abra esa base de datos, la base de datos de usuario TCC.db sea sobrescrita con la abierta.
Más información en el informe y en la charla.
SQLITE_AUTO_TRACE
Si la variable de entorno SQLITE_AUTO_TRACE
está configurada, la biblioteca libsqlite3.dylib
comenzará a registrar todas las consultas SQL. Muchas aplicaciones usaban esta biblioteca, por lo que era posible registrar todas sus consultas SQLite.
Varias aplicaciones de Apple usaban esta biblioteca para acceder a información protegida por TCC.
MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
Esta variable de entorno es utilizada por el marco Metal
que es una dependencia de varios programas, especialmente Music
, que tiene FDA.
Al establecer lo siguiente: MTL_DUMP_PIPELINES_TO_JSON_FILE="ruta/nombre"
. Si ruta
es un directorio válido, el error se activará y podemos usar fs_usage
para ver qué está sucediendo en el programa:
se abrirá un archivo llamado
path/.dat.nosyncXXXX.XXXXXX
(X es aleatorio)uno o más
write()
escribirán el contenido en el archivo (no controlamos esto)path/.dat.nosyncXXXX.XXXXXX
será renombrado apath/nombre
Es una escritura de archivo temporal, seguida de un rename(old, new)
que no es seguro.
No es seguro porque tiene que resolver las rutas antiguas y nuevas por separado, lo que puede llevar tiempo y ser vulnerable a una Condición de Carrera. Para obtener más información, puedes consultar la función xnu
renameat_internal()
.
Entonces, básicamente, si un proceso privilegiado está renombrando desde una carpeta que controlas, podrías obtener un RCE y hacer que acceda a un archivo diferente o, como en este CVE, abrir el archivo que creó la aplicación privilegiada y almacenar un FD.
Si el renombrado accede a una carpeta que controlas, mientras has modificado el archivo fuente o tienes un FD a él, cambias el archivo (o carpeta) de destino para que apunte a un enlace simbólico, así puedes escribir cuando quieras.
Este fue el ataque en el CVE: Por ejemplo, para sobrescribir la TCC.db
del usuario, podemos:
crear
/Users/hacker/nuestroenlace
para que apunte a/Users/hacker/Library/Application Support/com.apple.TCC/
crear el directorio
/Users/hacker/tmp/
establecer
MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db
activar el error ejecutando
Music
con esta variable de entornocapturar la
open()
de/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX
(X es aleatorio)aquí también abrimos este archivo para escribir y mantenemos el descriptor de archivo
cambiar
/Users/hacker/tmp
por/Users/hacker/nuestroenlace
atómicamente en un buclehacemos esto para maximizar nuestras posibilidades de éxito ya que la ventana de carrera es bastante estrecha, pero perder la carrera tiene un impacto insignificante
esperar un poco
comprobar si tuvimos suerte
si no, ejecutar nuevamente desde el principio
Más información en https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html
Ahora, si intentas usar la variable de entorno MTL_DUMP_PIPELINES_TO_JSON_FILE
, las aplicaciones no se iniciarán
Apple Remote Desktop
Como root podrías habilitar este servicio y el agente de ARD tendrá acceso completo al disco que luego podría ser abusado por un usuario para hacer que copie una nueva base de datos de usuario de TCC.
Por NFSHomeDirectory
TCC utiliza una base de datos en la carpeta HOME del usuario para controlar el acceso a recursos específicos del usuario en $HOME/Library/Application Support/com.apple.TCC/TCC.db. Por lo tanto, si el usuario logra reiniciar TCC con una variable de entorno $HOME que apunte a una carpeta diferente, el usuario podría crear una nueva base de datos de TCC en /Library/Application Support/com.apple.TCC/TCC.db y engañar a TCC para otorgar cualquier permiso de TCC a cualquier aplicación.
Ten en cuenta que Apple utiliza la configuración almacenada dentro del perfil del usuario en el atributo NFSHomeDirectory
como el valor de $HOME
, por lo que si comprometes una aplicación con permisos para modificar este valor (kTCCServiceSystemPolicySysAdminFiles
), puedes armar esta opción con un bypass de TCC.
CVE-2021-30970 - Powerdir
El primer POC utiliza dsexport y dsimport para modificar la carpeta HOME del usuario.
Obtener un blob csreq para la aplicación objetivo.
Colocar un archivo falso TCC.db con el acceso requerido y el blob csreq.
Exportar la entrada de Servicios de Directorio del usuario con dsexport.
Modificar la entrada de Servicios de Directorio para cambiar el directorio HOME del usuario.
Importar la entrada de Servicios de Directorio modificada con dsimport.
Detener el tccd del usuario y reiniciar el proceso.
El segundo POC utilizó /usr/libexec/configd
que tenía com.apple.private.tcc.allow
con el valor kTCCServiceSystemPolicySysAdminFiles
.
Era posible ejecutar configd
con la opción -t
, un atacante podría especificar un Bundle personalizado para cargar. Por lo tanto, el exploit reemplaza el método dsexport
y dsimport
de cambiar el directorio HOME del usuario con una inyección de código de configd
.
Para obtener más información, consulta el informe original.
Por inyección de proceso
Existen diferentes técnicas para inyectar código dentro de un proceso y abusar de sus privilegios de TCC:
pagemacOS Process AbuseAdemás, la inyección de proceso más común para eludir TCC encontrada es a través de plugins (cargar bibliotecas). Los plugins son código adicional generalmente en forma de bibliotecas o plist, que serán cargados por la aplicación principal y se ejecutarán bajo su contexto. Por lo tanto, si la aplicación principal tenía acceso a archivos restringidos por TCC (a través de permisos concedidos o entitlements), el código personalizado también lo tendrá.
CVE-2020-27937 - Directory Utility
La aplicación /System/Library/CoreServices/Applications/Directory Utility.app
tenía el entitlement kTCCServiceSystemPolicySysAdminFiles
, cargaba plugins con extensión .daplug
y no tenía el entorno de ejecución reforzado.
Para aprovechar este CVE, se cambia el NFSHomeDirectory
(abusando del entitlement anterior) para poder apoderarse de la base de datos de TCC de los usuarios y eludir TCC.
Para obtener más información, consulta el informe original.
CVE-2020-29621 - Coreaudiod
El binario /usr/sbin/coreaudiod
tenía los permisos com.apple.security.cs.disable-library-validation
y com.apple.private.tcc.manager
. El primero permite la inyección de código y el segundo le da acceso para administrar TCC.
Este binario permitía cargar complementos de terceros desde la carpeta /Library/Audio/Plug-Ins/HAL
. Por lo tanto, era posible cargar un complemento y abusar de los permisos de TCC con este PoC:
Para obtener más información, consulta el informe original.
Complementos de la Capa de Abstracción de Dispositivos (DAL)
Las aplicaciones del sistema que abren el flujo de la cámara a través de Core Media I/O (aplicaciones con kTCCServiceCamera
) cargan en el proceso estos complementos ubicados en /Library/CoreMediaIO/Plug-Ins/DAL
(no restringidos por SIP).
Simplemente almacenar allí una biblioteca con el constructor común funcionará para inyectar código.
Varias aplicaciones de Apple eran vulnerables a esto.
Firefox
La aplicación de Firefox tenía los permisos com.apple.security.cs.disable-library-validation
y com.apple.security.cs.allow-dyld-environment-variables
:
Para obtener más información sobre cómo explotar fácilmente esto, consulte el informe original.
CVE-2020-10006
El binario /system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
tenía los permisos com.apple.private.tcc.allow
y com.apple.security.get-task-allow
, lo que permitía inyectar código dentro del proceso y utilizar los privilegios de TCC.
CVE-2023-26818 - Telegram
Telegram tenía los permisos com.apple.security.cs.allow-dyld-environment-variables
y com.apple.security.cs.disable-library-validation
, por lo que era posible abusar de ellos para obtener acceso a sus permisos como grabar con la cámara. Puede encontrar el payload en el informe.
Observe cómo se utiliza la variable de entorno para cargar una biblioteca, se creó un plist personalizado para inyectar esta biblioteca y se utilizó launchctl
para lanzarla:
Mediante invocaciones abiertas
Es posible invocar open
incluso estando en modo sandbox
Scripts de Terminal
Es bastante común otorgar Acceso completo al disco (FDA) al terminal, al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts .terminal
utilizando esto.
Los scripts .terminal
son archivos plist como este con el comando a ejecutar en la clave CommandString
:
Una aplicación podría escribir un script de terminal en una ubicación como /tmp y ejecutarlo con un comando como:
Mediante montaje
CVE-2020-9771 - Bypass de TCC de montaje_apfs y escalada de privilegios
Cualquier usuario (incluso los no privilegiados) pueden crear y montar una instantánea de Time Machine y acceder a TODOS los archivos de esa instantánea.
El único privilegio necesario es que la aplicación utilizada (como Terminal
) tenga Acceso completo al disco (FDA) (kTCCServiceSystemPolicyAllfiles
), el cual debe ser otorgado por un administrador.
Una explicación más detallada se puede encontrar en el informe original.
CVE-2021-1784 y CVE-2021-30808 - Montar sobre el archivo TCC
Incluso si el archivo de base de datos de TCC está protegido, era posible montar sobre el directorio un nuevo archivo TCC.db:
Verifica el exploit completo en el informe original.
asr
La herramienta /usr/sbin/asr
permitía copiar todo el disco y montarlo en otro lugar eludiendo las protecciones de TCC.
Servicios de ubicación
Existe una tercera base de datos de TCC en /var/db/locationd/clients.plist
para indicar los clientes permitidos para acceder a los servicios de ubicación.
La carpeta /var/db/locationd/
no estaba protegida de montaje de DMG por lo que era posible montar nuestro propio plist.
Por aplicaciones de inicio
pagemacOS Auto StartPor grep
En varias ocasiones, los archivos almacenarán información sensible como correos electrónicos, números de teléfono, mensajes... en ubicaciones no protegidas (lo cual cuenta como una vulnerabilidad en Apple).
Clicks sintéticos
Esto ya no funciona, pero funcionaba en el pasado:
Otra forma utilizando eventos CoreGraphics:
Referencia
Última actualización