
Bypass TCC
Come studente, ho accesso limitato ai dispositivi su cui posso testare questa vulnerabilità. Le versioni che ho testato finora sono MacOS 12.3.1, MacOS 12.3, MacOS 12.0, MacOS 10.15.7, e MacOS 11.6.1. La vulnerabilità funziona su tutte le versioni testate.
Impatto: Un'applicazione dannosa potrebbe essere in grado di bypassare alcune preferenze sulla privacy
Descrizione: Quando un eseguibile viene cancellato mentre è in esecuzione, il processo è in grado di bypassare le restrizioni per la registrazione dello schermo e anche alcune impostazioni di accessibilità, ovvero l'iniezione di tasti (usando metasploit).
Possibili ragioni: macOS non riesce a trovare i permessi dell'eseguibile padre del processo e quindi non impedisce la registrazione dello schermo. Tuttavia, è confuso che la fotocamera e il microfono siano ancora correttamente limitati.
Dettagli:
tccutil reset All porta alla visualizzazione di un prompt di autorizzazione -- Anche l'accesso alla fotocamera o al microfono porta alla visualizzazione di un prompt di autorizzazione.Funziona su un'installazione fresca di macOS.
Eseguire il POC da src/POC.sh produrrà uno screenshot senza prompt TCC e include tutte le finestre visibili all'utente. Lo script deve occasionalmente essere eseguito più volte (max 3) per ottenere uno screenshot.
Questo exploit è stato scoperto da me per la prima volta mentre sperimentavo con la consegna web di Metasploit. Ho scoperto che cancellando l'eseguibile rilasciato immediatamente dopo l'apertura di una shell meterpreter, la shell ottiene capacità che sono normalmente bloccate dietro un prompt TCC. Questa vulnerabilità permette anche a un attaccante di iniettare tasti. Tuttavia, non sono uno sviluppatore Objective-C e quindi non sono stato in grado di creare un mio POC. Questo effetto può ancora essere ottenuto tramite Metasploit.
src/POC.sh -- Script shell: Copia screenshot, lo esegue e lo cancella mentre è in esecuzione.
src/screenshot -- Eseguibile Mach-O: Fa uno screenshot e lo salva in src/screenshot.png. Compilato da src/screenshot.m.
src/screenshot.m -- Crediti a theevilbit per il codice base. L'unica modifica che ho apportato è stata aggiungere un ritardo di 3 secondi prima dello screenshot per avere abbastanza tempo per cancellare l'eseguibile prima che lo screenshot venga scattato.