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:
- 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.
- 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.
- 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.Serializableimplements 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.gsonimport com.google.gson.annotationsimport com.google.gson.reflectimport com.google.gson.streamnew Gson();- Anotações como
@Expose,@JsonAdapter,@SerializedName,@Sincee@Until
Jackson Procure no código-fonte as seguintes palavras-chave:
import com.fasterxml.jackson.coreimport org.codehaus.jacksonpara 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.daoimport com.j256.dbimport com.j256.stmtimport 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.satyanextends SugarRecord<Type>- No AndroidManifest, haverá entradas
meta-datacom valores comoDATABASE,VERSION,QUERY_LOGeDOMAIN_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.Convertimport org.greenrobot.greendao.annotation.Entityimport org.greenrobot.greendao.annotation.Generatedimport org.greenrobot.greendao.annotation.Idimport org.greenrobot.greendao.annotation.Indeximport org.greenrobot.greendao.annotation.NotNullimport org.greenrobot.greendao.annotation.*import org.greenrobot.greendao.database.Databaseimport org.greenrobot.greendao.query.Query
ActiveAndroid Procure no código-fonte as seguintes palavras-chave:
ActiveAndroid.initialize(<contextReference>);import com.activeandroid.Configurationimport 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:
- Para a persistência real: Use as técnicas descritas no capítulo de armazenamento de dados.
- 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).