Skip to content

MASTG-TEST-0034: Testando Persistência de Objetos

Visão Geral

Para testar se a persistência de objetos)) está sendo usada para armazenar informações sensíveis no dispositivo, primeiro identifique todas as instâncias de serialização de objetos e verifique se elas carregam dados sensíveis. Em caso afirmativo, verifique se estão devidamente protegidas contra interceptação ou modificação não autorizada.

Existem algumas etapas genéricas de correção que você sempre pode adotar:

  1. Certifique-se de que os dados sensíveis foram criptografados e assinados com HMAC após a serialização/persistência. Avalie a assinatura ou HMAC antes de usar os dados. Consulte o capítulo "APIs Criptográficas do Android))" para mais detalhes.
  2. Certifique-se de que as chaves usadas na etapa 1 não possam ser extraídas facilmente. O usuário e/ou instância do aplicativo devem ser devidamente autenticados/autorizados para obter as chaves. Consulte o capítulo "Armazenamento de Dados no Android))" para mais detalhes.
  3. Certifique-se de que os dados dentro do objeto desserializado sejam cuidadosamente validados antes de serem usados ativamente (por exemplo, para evitar exploração da lógica de negócios/do aplicativo).

Para aplicações de alto risco que focam na disponibilidade, recomendamos que você use Serializable apenas quando as classes serializadas forem estáveis. Em segundo lugar, recomendamos não usar persistência baseada em reflexão porque:

  • o invasor pode encontrar a assinatura do método por meio do argumento baseado em String
  • o invasor pode manipular as etapas baseadas em reflexão para executar lógica de negócios.

Análise Estática

Serialização de Objetos

Procure no código-fonte as seguintes palavras-chave:

  • import java.io.Serializable
  • implements Serializable

JSON

Se você precisa se proteger contra dumping de memória, certifique-se de que informações muito sensíveis não sejam armazenadas no formato JSON, porque você não pode garantir a prevenção de técnicas anti-dumping de memória com as bibliotecas padrão. Você pode verificar as seguintes palavras-chave nas bibliotecas correspondentes:

JSONObject Procure no código-fonte as seguintes palavras-chave:

  • import org.json.JSONObject;
  • import org.json.JSONArray;

GSON Procure no código-fonte as seguintes palavras-chave:

  • import com.google.gson
  • import com.google.gson.annotations
  • import com.google.gson.reflect
  • import com.google.gson.stream
  • new Gson();
  • Anotações como @Expose, @JsonAdapter, @SerializedName,@Since e @Until

Jackson Procure no código-fonte as seguintes palavras-chave:

  • import com.fasterxml.jackson.core
  • import org.codehaus.jackson para a versão mais antiga.

ORM

Ao usar uma biblioteca ORM, certifique-se de que os dados sejam armazenados em um banco de dados criptografado e que as representações das classes sejam criptografadas individualmente antes do armazenamento. Consulte os capítulos "Armazenamento de Dados no Android))" e "APIs Criptográficas do Android))" para mais detalhes. Você pode verificar as seguintes palavras-chave nas bibliotecas correspondentes:

OrmLite Procure no código-fonte as seguintes palavras-chave:

  • import com.j256.*
  • import com.j256.dao
  • import com.j256.db
  • import com.j256.stmt
  • import com.j256.table\

Certifique-se de que o registro de logs (logging) esteja desativado.

SugarORM Procure no código-fonte as seguintes palavras-chave:

  • import com.github.satyan
  • extends SugarRecord<Type>
  • No AndroidManifest, haverá entradas meta-data com valores como DATABASE, VERSION, QUERY_LOG e DOMAIN_PACKAGE_NAME.

Certifique-se de que QUERY_LOG esteja definido como false.

GreenDAO Procure no código-fonte as seguintes palavras-chave:

  • import org.greenrobot.greendao.annotation.Convert
  • import org.greenrobot.greendao.annotation.Entity
  • import org.greenrobot.greendao.annotation.Generated
  • import org.greenrobot.greendao.annotation.Id
  • import org.greenrobot.greendao.annotation.Index
  • import org.greenrobot.greendao.annotation.NotNull
  • import org.greenrobot.greendao.annotation.*
  • import org.greenrobot.greendao.database.Database
  • import org.greenrobot.greendao.query.Query

ActiveAndroid Procure no código-fonte as seguintes palavras-chave:

  • ActiveAndroid.initialize(<contextReference>);
  • import com.activeandroid.Configuration
  • import com.activeandroid.query.*

Realm Procure no código-fonte as seguintes palavras-chave:

  • import io.realm.RealmObject;
  • import io.realm.annotations.PrimaryKey;

Parcelable

Certifique-se de que medidas de segurança adequadas sejam tomadas quando informações sensíveis são armazenadas em um Intent por meio de um Bundle que contém um Parcelable. Use Intents explícitos e verifique controles de segurança adicionais adequados ao usar IPC em nível de aplicativo (por exemplo, verificação de assinatura, permissões de intent, criptografia).

Análise Dinâmica

Existem várias maneiras de realizar a análise dinâmica:

  1. Para a persistência real: Use as técnicas descritas no capítulo de armazenamento de dados.
  2. Para abordagens baseadas em reflexão: Use Frida para Android para interceptar os métodos de desserialização ou adicione informações não processáveis aos objetos serializados para ver como são tratados (por exemplo, se o aplicativo falha ou se informações extras podem ser extraídas enriquecendo os objetos).