
TCC Bypass
Como estudante, tenho acesso limitado a dispositivos nos quais posso testar esta vulnerabilidade. As versões que testei até agora são MacOS 12.3.1, MacOS 12.3, MacOS 12.0, MacOS 10.15.7 e MacOS 11.6.1. A vulnerabilidade funciona em todas as versões testadas.
Impacto: Uma aplicação maliciosa pode ser capaz de contornar certas preferências de Privacidade
Descrição: Quando um executável é excluído enquanto está em execução, o processo consegue contornar restrições para Gravação de Tela, bem como certas configurações de acessibilidade, nomeadamente injeção de teclado (usando metasploit).
Possíveis razões: o macOS não consegue encontrar as permissões do executável pai do processo e, portanto, não impede a gravação de tela. No entanto, é confuso que a câmera e o microfone ainda estejam devidamente restritos.
Detalhes:
tccutil reset All resulta em um prompt de permissão sendo exibido -- Acessar câmera ou microfone também resulta em um prompt de permissão sendo exibido.Funciona em uma instalação limpa do macOS.
Executar o POC a partir de src/POC.sh produzirá uma captura de tela sem o prompt TCC e incluirá todas as janelas visíveis ao usuário. O script deve ser executado ocasionalmente várias vezes (máx. 3) para que uma captura de tela seja produzida.
Este exploit foi descoberto por mim pela primeira vez ao experimentar com o web delivery do Metasploit. Descobri que ao excluir o executável descartado imediatamente após um shell meterpreter abrir, o shell ganha capacidades que normalmente estão bloqueadas atrás de um prompt TCC. Esta vulnerabilidade também permite que um invasor injete teclas. No entanto, não sou desenvolvedor Objective-C e, portanto, não fui capaz de criar meu próprio POC. Este efeito ainda pode ser alcançado através do Metasploit.
src/POC.sh -- Script de shell: Copia screenshot, executa-o e o exclui enquanto está em execução.
src/screenshot -- Executável Mach-O: Tira uma captura de tela e a salva em src/screenshot.png. Compilado a partir de src/screenshot.m.
src/screenshot.m -- Créditos a theevilbit pelo código básico. A única modificação que fiz foi adicionar um sleep de 3 segundos antes da captura de tela para permitir tempo suficiente para excluir o executável antes que a captura seja tirada.