Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras maneiras de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira [**produtos oficiais PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
# Separação de Privilégios e Sandbox No iOS, existe uma distinção de privilégios entre os aplicativos acessíveis pelo usuário e os processos principais do sistema. Os aplicativos são executados sob a identidade do usuário **`mobile`**, enquanto os processos essenciais do sistema operam como **`root`**. Essa separação é aprimorada por um mecanismo de sandbox, que impõe limitações estritas sobre quais ações os aplicativos podem realizar. Por exemplo, mesmo que os aplicativos compartilhem a mesma identidade de usuário, eles são proibidos de acessar ou modificar os dados uns dos outros. Os aplicativos são instalados em um diretório específico (`private/var/mobile/Applications/{ID aleatório}`) e têm acesso de leitura restrito a determinadas áreas e funcionalidades do sistema, como SMS e chamadas telefônicas. O acesso a áreas protegidas desencadeia uma solicitação de permissão do usuário. # Proteção de Dados O iOS oferece aos desenvolvedores as **APIs de Proteção de Dados**, construídas sobre o Secure Enclave Processor (SEP) — um coprocessador dedicado para operações criptográficas e gerenciamento de chaves. O SEP garante a integridade da proteção de dados por meio de uma chave única específica do dispositivo, o UID do dispositivo, incorporado nele. Ao criar um arquivo, uma chave de criptografia AES de 256 bits única é gerada, criptografando o conteúdo do arquivo. Essa chave de criptografia, juntamente com um ID de classe, é então criptografada usando uma chave de classe e armazenada nos metadados do arquivo. Descriptografar um arquivo envolve usar a chave do sistema para acessar os metadados, recuperar a chave de classe com o ID de classe e, em seguida, descriptografar a chave de criptografia única do arquivo. O iOS define **quatro classes de proteção** para segurança de dados, que determinam quando e como os dados podem ser acessados: - **Proteção Completa (NSFileProtectionComplete)**: Os dados são inacessíveis até que o dispositivo seja desbloqueado usando o código de acesso do usuário. - **Protegido a Menos que Aberto (NSFileProtectionCompleteUnlessOpen)**: Permite o acesso ao arquivo mesmo após o dispositivo ser bloqueado, desde que o arquivo tenha sido aberto quando o dispositivo estava desbloqueado. - **Protegido Até a Primeira Autenticação do Usuário (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Os dados são acessíveis após o primeiro desbloqueio do usuário após a inicialização, permanecendo acessíveis mesmo se o dispositivo for bloqueado novamente. - **Sem Proteção (NSFileProtectionNone)**: Os dados são protegidos apenas pelo UID do dispositivo, facilitando a rápida exclusão remota de dados. A criptografia de todas as classes, exceto `NSFileProtectionNone`, envolve uma chave derivada tanto do UID do dispositivo quanto do código de acesso do usuário, garantindo que a descriptografia seja possível apenas no dispositivo com o código de acesso correto. A partir do iOS 7, a classe de proteção padrão é "Protegido Até a Primeira Autenticação do Usuário". Os desenvolvedores podem usar [**FileDP**](https://github.com/abjurato/FileDp-Source), uma ferramenta para inspecionar a classe de proteção de dados de arquivos em um iPhone. ```python # Example code to use FileDP for checking file protection class # Note: Ensure your device is jailbroken and has Python installed to use FileDP. # Installation and usage of FileDP: git clone https://github.com/abjurato/FileDp-Source cd FileDp-Source python filedp.py /path/to/check ``` ## **O Keychain** No iOS, um **Keychain** serve como um **container seguro criptografado** para armazenar **informações sensíveis**, acessíveis apenas pela aplicação que as armazenou ou por aquelas explicitamente autorizadas. Essa criptografia é fortalecida por uma senha única gerada pelo iOS, que por sua vez é criptografada com **AES**. Esse processo de criptografia utiliza uma função **PBKDF2**, combinando o código de acesso do usuário com um salt derivado do **UID** do dispositivo, um componente que apenas o **chipset do enclave seguro** pode acessar. Consequentemente, mesmo que o código de acesso do usuário seja conhecido, o conteúdo do Keychain permanece inacessível em qualquer dispositivo que não seja aquele onde foram originalmente criptografados. O **gerenciamento e acesso** aos dados do Keychain são tratados pelo **daemon `securityd`**, com base em direitos específicos do aplicativo como `Keychain-access-groups` e `application-identifier`. ### **Operações da API do Keychain** A API do Keychain, detalhada na [documentação dos Serviços do Keychain da Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), fornece funções essenciais para o gerenciamento de armazenamento seguro: - **`SecItemAdd`**: Adiciona um novo item ao Keychain. - **`SecItemUpdate`**: Atualiza um item existente no Keychain. - **`SecItemCopyMatching`**: Recupera um item do Keychain. - **`SecItemDelete`**: Remove um item do Keychain. Forçar a senha do Keychain envolve atacar diretamente a chave criptografada ou tentar adivinhar o código de acesso no próprio dispositivo, dificultado significativamente pela imposição de um atraso entre tentativas falhadas pelo enclave seguro. ### **Configurando a Proteção de Dados do Item do Keychain** Os níveis de proteção de dados para itens do Keychain são definidos usando o atributo `kSecAttrAccessible` durante a criação ou atualização do item. Esses níveis, [conforme especificado pela Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), determinam quando e como os itens do Keychain são acessíveis: - **`kSecAttrAccessibleAlways`**: Acessível a qualquer momento, independentemente do status de bloqueio do dispositivo. - **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Sempre acessível, mas não incluído em backups. - **`kSecAttrAccessibleAfterFirstUnlock`**: Acessível após o primeiro desbloqueio pós-reinício. - **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Igual ao acima, mas não transferível para novos dispositivos. - **`kSecAttrAccessibleWhenUnlocked`**: Apenas acessível quando o dispositivo está desbloqueado. - **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Acessível quando desbloqueado, não incluído em backups. - **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Requer código de acesso do dispositivo, não incluído em backups. **`AccessControlFlags`** refinam ainda mais os métodos de acesso, permitindo autenticação biométrica ou uso de código de acesso. ### **Aviso sobre Dispositivos com Jailbreak** {% hint style="warning" %} Em **dispositivos com jailbreak**, as proteções do Keychain são comprometidas, representando um risco significativo de segurança. {% endhint %} ### **Persistência dos Dados do Keychain** Ao contrário dos dados específicos do aplicativo excluídos ao desinstalar o aplicativo, os **dados do Keychain persistem** no dispositivo. Essa característica poderia permitir que novos proprietários de um dispositivo de segunda mão acessem os dados do aplicativo do proprietário anterior simplesmente reinstalando os aplicativos. Os desenvolvedores são aconselhados a limpar proativamente os dados do Keychain ao instalar o aplicativo ou durante o logout para mitigar esse risco. Aqui está um exemplo de código Swift demonstrando como limpar os dados do Keychain no primeiro lançamento do aplicativo: ```swift let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "hasRunBefore") == false { // Remove Keychain items here // Update the flag indicator userDefaults.set(true, forKey: "hasRunBefore") userDefaults.synchronize() // Forces the app to update UserDefaults } ``` # **Capacidades do Aplicativo** No campo do desenvolvimento de aplicativos, o **sandboxing** desempenha um papel crucial na melhoria da segurança. Esse processo garante que cada aplicativo opere dentro de seu próprio diretório exclusivo, impedindo-o de acessar arquivos do sistema ou dados pertencentes a outros aplicativos. A aplicação dessas restrições é realizada por meio de políticas de sandbox, que fazem parte do **Trusted BSD (MAC) Mandatory Access Control Framework**. Os desenvolvedores têm a capacidade de configurar certas **capacidades ou permissões** para seus aplicativos, como **Proteção de Dados** ou **Compartilhamento de Chaveiro**. Essas permissões são aplicadas imediatamente após a instalação do aplicativo. No entanto, para acessar determinados recursos protegidos, o aplicativo deve obter o consentimento explícito do usuário no momento da primeira tentativa. Isso é alcançado por meio do uso de _strings de propósito_ ou _strings de descrição de uso_, que são apresentadas aos usuários em um alerta de solicitação de permissão. Para aqueles com acesso ao código-fonte, a verificação das permissões incluídas no arquivo `Info.plist` pode ser feita da seguinte maneira: 1. Abrir o projeto no Xcode. 2. Localizar e abrir o arquivo `Info.plist`. 3. Procurar por chaves prefixadas com `"Privacy -"`, com a opção de visualizar chaves/valores brutos para maior clareza. Ao lidar com um arquivo IPA, os seguintes passos podem ser seguidos: 1. Descompactar o IPA. 2. Localizar o arquivo `Info.plist` dentro de `Payload/.app/`. 3. Converter o arquivo para o formato XML, se necessário, para facilitar a inspeção. Por exemplo, as strings de propósito no arquivo `Info.plist` podem se parecer com isso: ```xml NSLocationWhenInUseUsageDescription Your location is used to provide turn-by-turn directions to your destination. ``` ## Capacidades do Dispositivo O arquivo `Info.plist` de um aplicativo especifica as **capacidades do dispositivo** que ajudam a App Store a filtrar aplicativos para compatibilidade com o dispositivo. Estas são definidas sob a chave **`UIRequiredDeviceCapabilities`**. Por exemplo: ```xml UIRequiredDeviceCapabilities armv7 ``` Este exemplo indica que o aplicativo é compatível com o conjunto de instruções armv7. Os desenvolvedores também podem especificar capacidades como nfc para garantir que seu aplicativo esteja disponível apenas para dispositivos que suportam NFC. ## Entitlements **Entitlements** são outro aspecto crítico do desenvolvimento de aplicativos iOS, servindo como pares chave-valor que concedem permissão aos aplicativos para realizar determinadas operações além das verificações em tempo de execução. Por exemplo, habilitar a **Proteção de Dados** em um aplicativo envolve adicionar um entitlement específico no projeto Xcode, que é então refletido no arquivo de entitlements do aplicativo ou no arquivo de provisionamento móvel incorporado para IPAs. # Referências * [https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage](https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage) * [https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md](https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md) * [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/) * [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/)
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)! Outras formas de apoiar o HackTricks: * Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)! * Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com) * Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.