
Bypass de TCC
Como estudiante, tengo acceso limitado a dispositivos en los que puedo probar esta vulnerabilidad. Las versiones que he probado hasta ahora son MacOS 12.3.1, MacOS 12.3, MacOS 12.0, MacOS 10.15.7 y MacOS 11.6.1. La vulnerabilidad funciona en todas las versiones probadas.
Impacto: Una aplicación maliciosa podría eludir ciertas preferencias de privacidad
Descripción: Cuando se elimina un ejecutable mientras se está ejecutando, el proceso puede eludir las restricciones para la Grabación de Pantalla, así como ciertas configuraciones de accesibilidad, específicamente la inyección de teclas (usando metasploit).
Posibles razones: macOS no puede encontrar los permisos del ejecutable padre del proceso y, por lo tanto, no impide la grabación de pantalla. Sin embargo, es confuso que la cámara y el micrófono aún estén correctamente restringidos.
Detalles:
tccutil reset All hace que se muestre un aviso de permiso -- Acceder a la cámara o al micrófono también hace que se muestre un aviso de permiso.Funciona en una instalación nueva de macOS.
Ejecutar el PoC desde src/POC.sh producirá una captura de pantalla sin aviso de TCC e incluirá todas las ventanas visibles para el usuario. El script debe ejecutarse ocasionalmente varias veces (máximo 3) para que se produzca una captura de pantalla.
Este exploit fue descubierto por mí por primera vez al experimentar con la entrega web de Metasploit. Descubrí que al eliminar el ejecutable descargado inmediatamente después de que se abre un shell de meterpreter, el shell obtiene capacidades que normalmente están bloqueadas detrás de un aviso de TCC. Esta vulnerabilidad también permite a un atacante inyectar teclas. Sin embargo, no soy desarrollador de Objective-C y, por lo tanto, no he podido crear mi propio PoC. Este efecto aún se puede lograr a través de Metasploit.
src/POC.sh -- Script de shell: Copia screenshot, lo ejecuta y lo elimina mientras se está ejecutando.
src/screenshot -- Ejecutable Mach-O: Toma una captura de pantalla y la guarda en src/screenshot.png. Compilado desde src/screenshot.m.
src/screenshot.m -- Créditos a theevilbit por el código básico. La única modificación que hice fue agregar una pausa de 3 segundos antes de la captura de pantalla para permitir suficiente tiempo para eliminar el ejecutable antes de que se tome la captura.