MASTG-TEST-0036: Teste de Atualização Forçada
Visão Geral¶
Para testar atualização forçada), você precisa verificar se o aplicativo possui suporte para atualizações no aplicativo (in-app updates) e validar se isso é devidamente aplicado, de forma que o usuário não possa continuar usando o aplicativo sem atualizá-lo primeiro.
Análise Estática¶
O trecho de código abaixo mostra um exemplo de atualização de aplicativo:
//Parte 1: verificar se há atualização
// Cria uma instância do gerenciador.
AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);
// Retorna um objeto de intent que você usa para verificar se há uma atualização.
Task<AppUpdateInfo> appUpdateInfo = appUpdateManager.getAppUpdateInfo();
// Verifica se a plataforma permitirá o tipo especificado de atualização.
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
// Para uma atualização flexível, use AppUpdateType.FLEXIBLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
//...Parte 2: solicitar atualização
appUpdateManager.startUpdateFlowForResult(
// Passa a intent que é retornada por 'getAppUpdateInfo()'.
appUpdateInfo,
// Ou 'AppUpdateType.FLEXIBLE' para atualizações flexíveis.
AppUpdateType.IMMEDIATE,
// A atividade atual que faz a solicitação de atualização.
this,
// Inclui um código de solicitação para monitorar esta solicitação de atualização posteriormente.
MY_REQUEST_CODE);
//...Parte 3: verificar se a atualização foi concluída com sucesso
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (myRequestCode == MY_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
log("Fluxo de atualização falhou! Código de resultado: " + resultCode);
// Se a atualização for cancelada ou falhar,
// você pode solicitar o início da atualização novamente no caso de atualizações forçadas
}
}
}
// Parte 4:
// Verifica se a atualização não está paralisada durante 'onResume()'.
// No entanto, você deve executar essa verificação em todos os pontos de entrada do aplicativo.
@Override
protected void onResume() {
super.onResume();
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
...
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// Se uma atualização no aplicativo já estiver em andamento, retome a atualização.
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
IMMEDIATE,
this,
MY_REQUEST_CODE);
}
});
}
}
Fonte: https://developer.android.com/guide/app-bundle/in-app-updates
Análise Dinâmica¶
Para testar a atualização adequada: tente baixar uma versão mais antiga do aplicativo com uma vulnerabilidade de segurança, seja por meio de um lançamento dos desenvolvedores ou usando uma loja de aplicativos de terceiros. Em seguida, verifique se você pode ou não continuar usando o aplicativo sem atualizá-lo. Se um prompt de atualização for exibido, verifique se você ainda pode usar o aplicativo cancelando o prompt ou contornando-o de outra forma por meio do uso normal do aplicativo. Isso inclui validar se o backend interromperá chamadas para backends vulneráveis e/ou se a própria versão vulnerável do aplicativo é bloqueada pelo backend. Por fim, tente modificar o número da versão de um aplicativo enquanto intercepta seu tráfego usando um proxy MITM (Man-in-the-Middle) e observe como o backend responde (incluindo se a alteração é registrada, por exemplo).