UnjailMe
Uma fuga de sandbox baseada em:
- no proof-of-concept (CVE-2018-4087) por Rani Idan (Zimperium)
- no proof-of-concept de overflow do securityd por @cheesecakeufo (zeroday, nenhum CVE conhecido, obrigado Abraham!)
Sobre o PoC da ZIMPERIUM
Rani usou o sbtool de Jonathan Levine para descobrir quais serviços estavam acessíveis para comunicação a partir da sandbox.
Ele então encontrou mais bluetoothd e configurou código para interceptar mensagens de e para o serviço.
Ao fazer isso, ele descobriu que podia sequestrar a sessão de muitos daemons e vazar a porta do cliente.
Dessa forma, ele descobriu que era possível adicionar um callback com dados adicionais à conexão do cliente com o bluetoothd.
A consequência disso é que se pode obter controle sobre o contador de processo (callback) e o registrador x3 (dados adicionais) de daemons do sistema dos quais uma porta de cliente (sessão) é interceptada.
Fornecendo a possibilidade de escapar de um aplicativo sandbox para um contexto privilegiado, fazendo-o executar código com privilégios de sistema.
A Apple corrigiu as vulnerabilidades no iOS 11.2.5 usando um arc4random() para o ID da sessão.
Parece que não é mais possível obter a porta de um cliente, mas ainda é possível interceptar sessões.
Leva aproximadamente 5 dias para bruteforcear este arc4random() neste novo patch (4.294.967.296 possibilidades) e, portanto, ainda espero por um patch final, pois isso não é considerado uma correção para o problema de segurança.
Fonte: Blog da Zimperium
Sobre o PoC de Abraham Masri
Pelo que sei, isso é um bufferoverflow na comunicação com o securityd.
Isso é feito fornecendo uma mensagem XPC, que é uma mensagem baseada em dicionário valor-chave, com um comprimento inválido.
O serviço recebe a mensagem e ocorre o underflow.
Abraham parece ter encontrado uma maneira de controlar muitos registradores do processador, tornando possível a execução de código com direitos de sistema para aplicativos em execução no sistema.
O PoC de Abraham mostra que ele está tentando criar um exploit para essa vulnerabilidade, pois existe código para vazar endereços base, o que é conhecido como o início da criação de uma ROP-chain.
Não se sabe se Abraham planeja escrever esse exploit ele mesmo ou nos apontar na direção certa.
Requisitos
- Um dispositivo iOS de 64 bits rodando iOS 10 até 11.3.1
Sobre este projeto
- Este projeto não é um jailbreak nem contribuirá para um, pois opera apenas no userland
- Este projeto não pode e nunca ganhará a capacidade de escrever no rootfilesystem, pois este está montado como somente leitura, conforme imposto pelo kernel.
- Este projeto não permitirá facilmente a execução arbitrária de código na forma de bibliotecas dinâmicas como o cydia substrate faz.
- O projeto tem como objetivo principal elevar um aplicativo de contêiner em sandbox para direitos de sistema.
- O AMFI exige que todos os binários sejam validamente assinados e este projeto não pode corrigir o AMFI.
- O projeto visa obter permissão de leitura e escrita na partição userdata (/var/root, /var/mobile).
- O projeto visa obter acesso ao armazenamento protegido do keychain para recuperação de credenciais e fins forenses.
- O projeto também visa fornecer funcionalidade de servidor para executar código como root e transferência de arquivos.
- O projeto foi destinado a ser uma ajuda para desenvolvedores e pesquisadores para contribuição.
- O projeto tornará mais fácil para desenvolvedores de jailbreak e pesquisadores de segurança encontrar bugs em drivers do kernel que são acessíveis apenas de um contexto privilegiado ou bugs no userland usando técnicas de fuzzing.
- O projeto tornará mais fácil para desenvolvedores de tweaks de jailbreak pesquisar os novos recursos do iOS 11 e depurar o desenvolvimento de tweaks em um dispositivo real.
- Este projeto tem como foco principal funcionar para iOS 10 até 11.2.5, mas pode, em teoria, suportar 11.2.5 até 11.3 inclusive quando exploits forem desenvolvidos.
Captura de tela
Como usar o aplicativo
- O aplicativo não agrega valor ao projeto, mas serve como um visual para aqueles que pediram (Muitas pessoas empolgadas da comunidade pediram isso)
- O aplicativo despejará informações de bibliotecas e frameworks, incluindo memória, informações mach-o e seus endereços base, o que é útil para o desenvolvimento de ROP.
- A lógica no aplicativo pode levar até 15 minutos para ser concluída devido às muitas análises e impressões, isso não será o caso nas versões finais.
- O aplicativo não agregará valor ao seu iPhone nem alterará o comportamento do software como está, alguns daemons podem travar, mas nenhum dano permanente é causado ao sistema.
- Recomenda-se que pesquisadores executem este projeto no Xcode
SOLUÇÃO DE PROBLEMAS (não necessário, mas apenas por precaução)
- Apague o aplicativo
- Desligue o bluetooth
- Reinicie
- Ligue o bluetooth
- Desligue o bluetooth
Recursos
- Acesso FTP (atualmente em sandbox, sem sandbox no futuro)
- PoC Visual
- PoC da zerodium (Finalmente ligeiramente melhorado, pode fazer chamada à função system())
- PoC de Abraham, que deve ser capaz de executar código arbitrário como root, perfeito para ssh.
- PoC de Sem Voigtlander (DoS de alocação de espaço de endereço do kernel, para função de reinicialização do dispositivo).
Planejado
- Exploit completo incluindo obter controle total sobre o espaço de endereço de outros daemons.
- Acesso remoto a shell SSH (dropbear ou uma derivação).
Coisas futuras para pensar
- Injeção de código no SpringBoardd (Olá, amantes de jailbreak)
launchd (Não é possível, pois não podemos obter uma sessão para ele).
Hipótese (apenas especulação)
- Encontrar daemon com entitlements do launchd / injetar entitlements.
Injetar código que carrega o BaseBoard Framework
- Vazar endereços de bibliotecas no dyld_shared_cache.
- Encontrar um ropgadget em qualquer biblioteca no dyld_shared_cache.
- Chamar a ropchain definindo o callback e os dados adicionais do callback.
- Usar lógica de engenharia reversa do BaseBoard para fazer o launchd executar amfid com argumentos e aslr desabilitado.
- corrigir amfid
- Usar lógica de engenharia reversa do BaseBoard para fazer o afcd executar com argumentos para / e aslr desabilitado. (como afc2).
- Usar lógica de engenharia reversa do BaseBoard para executar unjaild, um daemon que pode ser usado como wrapper em torno do launchd e lida com privilégios de tarefa e injeção de código
- obter um taskport sobre o launchd com aslr desabilitado usando lógica do BaseBoard
Para examinar
- Patches do AMFI (Não é fácil, não podemos obter sessões sobre amfi, mas podemos escalar usando outros daemons talvez).
- Injeção de entitlements (Não é muito necessário, temos controle sobre tantos daemons que não precisamos disso).
- Escalar ainda mais usando APIs privadas (BaseBoard.framework pode iniciar processos com ASLR desabilitado com direitos de sistema)???
- reviver e portar liblorgnette para iOS (FEITO)
Baixar ipa
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
Créditos
- Abraham (@cheesecakeufo) pelo seu zeroday do securityd
- Vulnerabilidade e PoC inicial: Rani Idan (Zimperium) <3
- PureFTPd
- projeto liblorgnette (com minhas próprias pequenas melhorias)
- NEWUI por @ringarang
Doe ou contribua
- O código-fonte pode ser fornecido se for solicitado no Twitter via DM (@MTJailed)
- Por favor, doe, tenho muito pouco tempo e recursos para trabalhar em tais projetos! (http://paypal.me/devsupport)
- Em breve o código-fonte (exceto ftp) estará aqui no GitHub.