Na Cataclysm Inc., verificamos milhares de aplicativos todos os meses. Observamos que algumas vulnerabilidades agora surgem com muito menos frequência do que há alguns anos. Mas o mesmo não pode ser dito da criptografia insegura: ainda encontramos essa vulnerabilidade específica com a mesma frequência de antes. Nossas estatísticas internas mostram que mais de 77% dos aplicativos contêm erros relacionados a chaves de criptografia codificadas ou previsíveis, ou então à configuração insegura do algoritmo de criptografia (por exemplo, cifras fracas ou tamanhos de chave pequenos).

O trabalho da criptografia é fornecer um nível adicional de proteção para os dados do usuário. Mas a criptografia é usada incorretamente em quase todos os aplicativos móveis ou em algumas partes deles, como SDKs de terceiros. Os desenvolvedores frequentemente não conseguem entender para que a criptografia está sendo usada, onde obter as chaves de criptografia e o que fazer com elas, bem como o modelo de ameaça. Neste artigo, tentaremos explicar os erros mais comuns, além de oferecer algumas dicas práticas sobre como proteger os aplicativos móveis.

Deseja verificar seus aplicativos móveis para esses tipos de vulnerabilidades? Nós podemos fornecer soluções automáticas e personalizadas que ajudam a detectar vulnerabilidades em aplicativos móveis Android e iOS. Você pode integrar nossa I.A. Yachay em seu processo de desenvolvimento e verificar se o seu código está seguro e indicadores que te ajudarão a certificar que está indo no caminho certo.

Por que usar criptografia em aplicativos móveis

Sim porque? Tanto o Android quanto o iOS oferecem armazenamento seguro, isolado de aplicativos de terceiros, que um aplicativo usa para armazenar dados confidenciais. Ninguém, exceto o próprio aplicativo (e o root), pode obter acesso aos arquivos armazenados nesses diretórios especificados. Portanto, eles precisam ser protegidos do próprio aplicativo! Se você observar uma lista típica de vulnerabilidades, notará a possibilidade de acesso a arquivos internos do aplicativo, por exemplo:

  • via WebView no aplicativo Amazon
  • por meio da obtenção de acesso a provedores de conteúdo arbitrários*
  • por meio de intenções implícitas
  • centenas de outros exemplos que não são cobertos por artigos em nosso blog

Se os dados nesses exemplos tivessem sido criptografados corretamente no nível do aplicativo, um invasor teria se beneficiado muito pouco dessas vulnerabilidades. A leitura de qualquer arquivo de diretórios internos levaria apenas ao vazamento de seu conteúdo criptografado. Reescrever esses arquivos poderia levar a um logout automático da conta do usuário, mas não mais do que isso.

Como não criptografar dados, em qualquer plataforma

Chaves criptográficas codificadas

As chaves secretas que protegem os dados ou as comunicações da Internet são frequentemente codificadas. Fornecemos um exemplo desse tipo de vulnerabilidade em nosso aplicativo Android vulnerável superprotegido . Olhe o exemplo abaixo:

vulnerabilidade

E um exemplo para iOS do aplicativo iOS vulnerável e superprotegido :vulnerabilidade

Um invasor pode descompilar o aplicativo, entender o algoritmo e calcular a chave e, em seguida, remover esse nível de proteção – o que significa que eles poderão descriptografar os dados criptografados.

Chaves criptográficas previsíveis

Um erro comum é gerar chaves de criptografia com um valor de semente previsível:

    SecureRandom secureRandom = new SecureRandom("known_seed".getBytes());
    KeyGenerator generator = KeyGenerator.getInstance("AES");
    generator.init(256, secureRandom);
    Key key = generator.generateKey();

Se forem usados ​​valores pseudo-aleatórios:

    private byte[] generateKey() {
        byte[] key = new byte[128];
        Random random = new Random();
        for (int i = 0; i < 128; i++) {
            key[i] = (byte) random.nextInt(256);
        }
        return key;
    }

    private byte[] encrypt(byte[] data) {
        SecretKeySpec skeySpec = new SecretKeySpec(generateKey(), "AES");
        //...
    }

Se o valor da chave não for inicializado, o que resulta automaticamente em uma chave com todos os bytes iguais a 0:

    private byte[] encrypt(byte[] data) {
        byte[] key = new byte[128];
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        //...
    }

Ou se o valor da chave for gerado com segurança, mas depois armazenado de forma limpa no sistema de arquivos (geralmente em Preferências compartilhadas).

A maneira certa de criptografar dados no Android

O Android oferece uma interface conhecida como Keystore . Os aplicativos só podem obter chaves de criptografia por meio da interface de programação, não lendo arquivos diretamente. Os arquivos que contêm as chaves de criptografia são armazenados /data/misc/keystore/e pertencem ao keystoreusuário.

A maneira certa de criptografar dados no iOS

O iOS fornece um mecanismo para trabalhar com chaves de criptografia, conhecido como Secure Enclave. Da mesma forma que no Android, qualquer interação com essas teclas só é possível por meio de interfaces de programação – não pela leitura direta de arquivos.

Você também pode gerar chaves e armazená-las no Keychain.

Recomendações para criptografia em aplicativos móveis

Portanto, se os aplicativos Android criptografarem todos os dados confidenciais usando chaves do Keystore e os aplicativos iOS usarem chaves armazenadas no Keychain, não será possível descriptografar os dados, a menos que haja vulnerabilidades que permitam a execução arbitrária do código. A execução arbitrária de código é uma vulnerabilidade crítica, mas comparativamente incomum. Mas outras vulnerabilidades menos críticas podem reduzir a zero o risco de vazamento de dados confidenciais armazenados no sistema de arquivos.

Nós recomendamos criptografar todos os dados confidenciais que o aplicativo armazena. Isso inclui tokens de autenticação do usuário (as credenciais do usuário nunca devem ser armazenadas no cliente, sob nenhuma circunstância!), dados financeiros e de saúde e mensagens e comunicações privadas do usuário.

Também é importante excluir todos os dados do usuário e destruir as chaves de criptografia depois que o usuário sair.

Projeta seus aplicativos HOJE!

Pode ser um desafio acompanhar os problemas de segurança que aparecem diariamente durante o processo de desenvolvimento do aplicativo. Fale conosco e ajudaremos você a automatizar esse processo internamente, economizando toneladas de recursos.

One thought on “Use criptografia em aplicativos móveis da maneira certa”

Leave a Reply

Your email address will not be published. Required fields are marked *

× Fale conosco