iOS Security Testing¶
Neste capítulo, mergulharemos na configuração de um ambiente de teste de segurança e apresentaremos alguns processos e técnicas práticas para testar a segurança de aplicativos iOS. Estes são os blocos fundamentais para os casos de teste do MASTG.
iOS Testing Setup¶
Embora você possa usar um computador host com Linux ou Windows para testes, descobrirá que muitas tarefas são difíceis ou impossíveis nessas plataformas. Além disso, o ambiente de desenvolvimento Xcode e o iOS SDK estão disponíveis apenas para macOS. Isso significa que você definitivamente precisará trabalhar no macOS para análise de código-fonte e depuração (também facilita o teste de caixa preta).
Host Device¶
A seguir está a configuração mais básica para teste de aplicativos iOS:
- Idealmente um computador host macOS com direitos de administrador.
- Xcode e Xcode Command Line Tools instalados.
- Rede Wi-Fi que permite tráfego cliente-para-cliente.
- Pelo menos um dispositivo iOS com jailbreak (da versão do iOS desejada).
- mitmproxy ou outra ferramenta de proxy de interceptação.
Obtaining the UDID of an iOS device¶
O UDID é uma sequência única de 40 dígitos entre letras e números para identificar um dispositivo iOS. Você pode encontrar o UDID do seu dispositivo iOS no macOS Catalina em diante no aplicativo Finder, já que o iTunes não está mais disponível no Catalina. Abra o Finder e selecione o dispositivo iOS conectado na barra lateral.

Clique no texto contendo o modelo, capacidade de armazenamento e informações da bateria, e ele exibirá o número de série, UDID e modelo:

Você pode copiar o UDID clicando com o botão direito nele.
Também é possível obter o UDID por meio de várias ferramentas de linha de comando no macOS enquanto o dispositivo está conectado via USB:
-
Usando a ferramenta I/O Registry Explorer
ioreg:$ ioreg -p IOUSB -l | grep "USB Serial" | "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec" -
Usando Suíte libimobiledevice:
$ idevice_id -l 316f01bd160932d2bf2f95f1f142bc29b1c62dbc -
Usando o system_profiler:
$ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:" 2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1 -
Usando instruments:
instruments -s devices
Testing on a real device (Jailbroken)¶
Você deve ter um iPhone ou iPad com jailbreak para executar testes. Esses dispositivos permitem acesso root e instalação de ferramentas, tornando o processo de teste de segurança mais direto. Se você não tiver acesso a um dispositivo com jailbreak, pode aplicar as soluções alternativas descritas posteriormente neste capítulo, mas esteja preparado para uma experiência mais difícil.
Testing on the iOS Simulator¶
Diferente do emulador Android, que emula completamente o hardware de um dispositivo Android real, o simulador do iOS SDK oferece uma simulação de nível superior de um dispositivo iOS. Mais importante, os binários do emulador são compilados para código x86 em vez de código ARM. Aplicativos compilados para um dispositivo real não são executados, tornando o simulador inútil para análise de caixa preta e engenharia reversa.
Testing on an Emulator¶
Corellium é o único emulador iOS disponível publicamente. É uma solução SaaS empresarial com modelo de licença por usuário e não oferece licenças comunitárias.
Getting Privileged Access¶
iOS jailbreaking é frequentemente comparado ao rooting do Android, mas o processo é bastante diferente. Para explicar a diferença, primeiro revisaremos os conceitos de "rooting" e "flashing" no Android.
- Rooting: Normalmente envolve instalar o binário
suno sistema ou substituir todo o sistema por uma ROM personalizada com root. Exploits não são necessários para obter acesso root, desde que o bootloader esteja acessível. - Flashing custom ROMs: Permite substituir o SO em execução no dispositivo após desbloquear o bootloader. O bootloader pode exigir um exploit para ser desbloqueado.
Nos dispositivos iOS, flashing de uma ROM personalizada é impossível porque o bootloader do iOS permite apenas inicializar e gravar imagens assinadas pela Apple. É por isso que mesmo imagens oficiais do iOS não podem ser instaladas se não forem assinadas pela Apple, e torna os downgrades do iOS possíveis apenas enquanto a versão anterior do iOS ainda estiver sendo assinada.
O objetivo do jailbreak é desativar as proteções do iOS (em particular, os mecanismos de assinatura de código da Apple) para que código arbitrário não assinado possa ser executado no dispositivo (por exemplo, código personalizado ou baixado de lojas de aplicativos alternativas como Cydia ou Sileo). A palavra "jailbreak" é uma referência coloquial a ferramentas tudo-em-um que automatizam o processo de desativação.
Desenvolver um jailbreak para uma determinada versão do iOS não é fácil. Como testador de segurança, você provavelmente desejará usar ferramentas de jailbreak disponíveis publicamente. Ainda assim, recomendamos estudar as técnicas usadas para fazer jailbreak em várias versões do iOS - você encontrará muitos exploits interessantes e aprenderá muito sobre os internals do SO. Por exemplo, Pangu9 para iOS 9.x explorou pelo menos cinco vulnerabilidades, incluindo um bug de kernel use-after-free (CVE-2015-6794) e uma vulnerabilidade de acesso arbitrário ao sistema de arquivos no aplicativo Photos (CVE-2015-7037).
Alguns aplicativos tentam detectar se o dispositivo iOS em que estão sendo executados tem jailbreak. Isso ocorre porque o jailbreak desativa alguns dos mecanismos de segurança padrão do iOS. No entanto, existem várias maneiras de contornar essas detecções, e as apresentaremos no capítulo "iOS Anti-Reversing Defenses".
Benefits of Jailbreaking¶
Usuários finais frequentemente fazem jailbreak em seus dispositivos para ajustar a aparência do sistema iOS, adicionar novos recursos e instalar aplicativos de terceiros de lojas de aplicativos não oficiais. Para um testador de segurança, no entanto, fazer jailbreak em um dispositivo iOS tem ainda mais benefícios. Eles incluem, mas não se limitam a:
- Acesso root ao sistema de arquivos.
- Possibilidade de executar aplicativos que não foram assinados pela Apple (o que inclui muitas ferramentas de segurança).
- Depuração e análise dinâmica sem restrições.
- Acesso ao tempo de execução Objective-C ou Swift.
Jailbreak Types¶
Existem jailbreaks tethered, semi-tethered, semi-untethered e untethered.
-
Jailbreaks tethered não persistem após reinicializações, portanto, reaplicar o jailbreak exige que o dispositivo esteja conectado (tethered) a um computador durante cada reinicialização. O dispositivo pode não reinicializar se o computador não estiver conectado.
-
Jailbreaks semi-tethered não podem ser reaplicados a menos que o dispositivo esteja conectado a um computador durante a reinicialização. O dispositivo também pode inicializar sozinho no modo sem jailbreak.
-
Jailbreaks semi-untethered permitem que o dispositivo inicialize sozinho, mas os patches de kernel (ou modificações em espaço do usuário) para desativar a assinatura de código não são aplicados automaticamente. O usuário deve reaplicar o jailbreak do dispositivo iniciando um aplicativo ou visitando um site (não exigindo conexão com um computador, daí o termo untethered).
-
Jailbreaks untethered são a escolha mais popular para usuários finais porque precisam ser aplicados apenas uma vez, após o que o dispositivo estará permanentemente com jailbreak.
Caveats and Considerations¶
Desenvolver um jailbreak para iOS está se tornando cada vez mais complicado à medida que a Apple continua a fortalecer seu SO. Sempre que a Apple toma conhecimento de uma vulnerabilidade, ela é corrigida e uma atualização do sistema é enviada a todos os usuários. Como não é possível fazer downgrade para uma versão específica do iOS, e como a Apple só permite que você atualize para a versão mais recente do iOS, é um desafio ter um dispositivo que esteja executando uma versão do iOS para a qual um jailbreak esteja disponível. Algumas vulnerabilidades não podem ser corrigidas por software, como o exploit checkm8 afetando o BootROM de todas as CPUs até A12.
Se você tem um dispositivo com jailbreak que usa para teste de segurança, mantenha-o como está, a menos que tenha 100% de certeza de que pode reaplicar o jailbreak após atualizar para a versão mais recente do iOS. Considere obter um (ou vários) dispositivo(s) reserva (que serão atualizados com cada versão principal do iOS) e aguarde até que um jailbreak seja lançado publicamente. A Apple geralmente é rápida em lançar um patch assim que um jailbreak é lançado publicamente, então você tem apenas alguns dias para fazer downgrade (se ainda estiver sendo assinado pela Apple) para a versão do iOS afetada e aplicar o jailbreak.
As atualizações do iOS são baseadas em um processo desafio-resposta (gerando os chamados SHSH blobs como resultado). O dispositivo permitirá a instalação do SO apenas se a resposta ao desafio for assinada pela Apple. Isso é o que os pesquisadores chamam de "signing window", e é a razão pela qual você não pode simplesmente armazenar o pacote de firmware OTA que baixou e carregá-lo no dispositivo sempre que quiser. Durante atualizações menores do iOS, duas versões podem estar sendo assinadas pela Apple (a mais recente e a versão anterior do iOS). Esta é a única situação em que você pode fazer downgrade do dispositivo iOS. Você pode verificar a janela de assinatura atual e baixar o firmware OTA no site IPSW Downloads.
Para alguns dispositivos e versões do iOS, é possível fazer downgrade para versões mais antigas caso os SHSH blobs para esse dispositivo tenham sido coletados quando a janela de assinatura estava ativa. Mais informações sobre isso podem ser encontradas no cfw iOS Guide - Saving Blobs.
Which Jailbreaking Tool to Use¶
Diferentes versões do iOS exigem diferentes técnicas de jailbreak. Determine se um jailbreak público está disponível para sua versão do iOS. Cuidado com ferramentas falsas e spyware, que frequentemente se escondem atrás de nomes de domínio semelhantes ao nome do grupo/autor do jailbreak.
A cena de jailbreak do iOS evolui tão rapidamente que é difícil fornecer instruções atualizadas. No entanto, podemos indicar algumas fontes atualmente confiáveis.
Observe que qualquer modificação feita em seu dispositivo é por sua conta e risco. Embora o jailbreak seja normalmente seguro, coisas podem dar errado e você pode acabar bricking seu dispositivo. Nenhuma outra parte, exceto você mesmo, pode ser responsabilizada por qualquer dano.