<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* 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)!
* 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-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
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 aciona uma solicitação de permissão do usuário.
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.
- **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.
No iOS, um **Keychain** serve como um **contêiner 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 foi originalmente criptografado.
O **gerenciamento e acesso** aos dados do Keychain são tratados pelo **daemon `securityd`**, com base em direitos específicos da aplicação como `Keychain-access-groups` e `application-identifier`.
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:
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.
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:
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 pela primeira vez ou durante o logout para mitigar esse risco. Aqui está um exemplo de código Swift demonstrando como limpar os dados do Keychain ao iniciar o aplicativo pela primeira vez:
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 imposiçã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 Keychain**. 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 de _strings de finalidade_ ou _strings de descrição de uso_, que são apresentadas aos usuários em um alerta de solicitação de permissão.
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:
**Permissões** 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 uma permissão específica no projeto Xcode, que é então refletida no arquivo de permissões do aplicativo ou no arquivo de provisionamento móvel incorporado para IPAs.
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* 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-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **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.